要对 CUDA 内核进行调试,我们需要安装 nVidia Parallel Nsight 软件包。该软件自带一个说明文件,其中详细描述了如何设置调试环境。但有些细节说得还不够具体,这里将我设置调试环境中的一些过程进行一下记录。
准备
首先,调试环境分两种:远程和本地。远程模式需要有一台专门用于 CUDA 计算的机器,相当于有一个计算服务器。而对于我们独立开发者来说,最方便的是设置一个本地调试环境。所以本文将只关注本地调试环境的设置。
对于本地调试,还需要一个前提,那就是你至少需要2块显卡,一块用于显示你的桌面环境和 Visual Studio,另一块则需要比较新的支持 CUDA 的显卡,用来执行 CUDA 内核。比如我的环境如下:
- 一块板载的 GeForce 9300 (用于桌面环境的显示)
- 一块独立的 GeForce GTX 260 (用于 CUDA 内核的执行和调试)
设置
设置之前,请仔细阅读 Nsight 用户手册中的《Setup Local Debugging》和《Setup Local Headless GPU Debugging》这两章。
Headless 的意思是指,关闭你用了执行 CUDA 的显卡的所有显示输出。一般情况下,一旦我们将线缆连接上了显卡的 AVI 或是 HDMI 接口后,不管那端连接的显示器是否开启,我们的显卡都处于可以输出显示的模式。而 Headless 就是要关闭所有这些显示。
设置的过程大致如下:
- 关闭驱动的 TDR。这个可以通过 Nsight Options 窗口完成。
- 关闭 D3D WPF 加速。通过导入 Nsight 安装目录里的 DisableWpfHardwareAcceleration.reg 注册表完成。
- 设置一个环境变量 CUDA_VISIBLE_DEVICES
前两项手册里都有详细的操作说明,但是关于设置 CUDA_VISIBLE_DEVICES,手册说得并不是很清楚。所以我这里详细讲解下。
首先,你要弄清你系统里的显示设备的顺序。这个可以执行 SDK 中的 deviceQueryDrv.exe 来查看。比如在我的系统中,设备顺序是:
- 设备0: GeForce GTX 260
- 设备1: GeForce 9300 / nForce 730i
那么,如果我想用 GTX 260 进行调试,我就应该设置 CUDA_VISIBLE_DEVICES=0。
在完成了这些设置后,需要重启一下电脑来使设置生效。
调试
每次进行调试前,我们需要:
- 启动 Nsight Monitor。
- 关闭调试用显卡的显示输出,使其进入 Headless 模式。
- 关闭 Windows 的视觉效果。这个可以点击开始,然后右击“计算机”,选择“属性”,然后选择“高级系统设置”,点击设置“性能”,去掉“在窗口和按钮上使用视觉样式”前的勾。
- 再次确认 CUDA_VISIBLE_DEVICES 的设置,让其仅允许 Headless 模式的显卡对 CUDA 可见。
调试时,使用 Visual Studio IDE 在内核里设置断点。由于内核是并行执行的,所以很多时候,我们需要右击断点,选择设置条件断点。比如下图就是设置了条件断点来分析处理第5个数据的内核执行:
右击项目,选择 Debug -> Start CUDA Debugging ,就可以开始进行内核调试了。
最后,在完成了调试后,你可以讲 CUDA_VISIBLE_DEVICES 重新设置成所有的设备,比如:CUDA_VISIBLE_DEVICES=0,1 ,以方便测试多设备之间的协作。


![2011-12-04_22-45-20_678_上海市[1]](http://suosuo.me/wp-content/uploads/2011/12/2011-12-04_22-45-20_678_%E4%B8%8A%E6%B5%B7%E5%B8%821.jpg)


