我有一个附有2个cuda卡的桌面,我尝试通过在内核行中添加一些断点来调试cuda代码。但是,调试器仅显示内核函数的入口和结束括号。它没有提供踩到内核函数体的能力。它只是忽略了。我已经读过要调试GPU内核,你需要将代码运行到当前系统未使用的图形卡上。在此基础上,我还尝试通过将我的活动GPU设置为第二个(系统未使用)来运行调试器,但仍然调试器忽略了内核主体。如果有功能的CUDA调试器,我怎么能解决这个问题?否则编写复杂的cuda内核会非常痛苦。
可能与现在的304现在的驱动程序版本相关联,在bumblebee optimus卡上?
答案 0 :(得分:0)
这通常是由于内核未在设备上启动而引起的。确保检查所有错误代码(并尝试在内核调用后添加cudaDeviceSynchronize并检查其错误代码)。常见的错误是为错误的SM版本编译内核。另请尝试从您的应用程序中打印出可用的CUDA设备。
请注意,您也可能遇到一些设置问题 - 例如确保Nouveau驱动程序被正确列入黑名单。在某些情况下,即使没有连接显示器,X也可能使用您的设备 - 尝试在xorg.conf中明确设置PCI ID。
通过PCI ID指定适配器:
通过从shell执行“lspci | grep NVI”获取设备ID列表。这就是我在我的系统上得到的结果:
03:00.0 VGA compatible controller: NVIDIA Corporation Device 103b (rev a1) 03:00.1 Audio device: NVIDIA Corporation Device 0e1a (rev a1) 05:00.0 VGA compatible controller: NVIDIA Corporation G98 [Quadro NVS 295] (rev a1)
要使用Quadro进行显示,我将BusID添加到我的/etc/X11/xorg.conf中。这就是我在我的系统中所拥有的:
Section "Device" Identifier "Device0" Driver "nvidia" VendorName "NVIDIA Corporation" BoardName "GeForce GTX 280" BusID "PCI:5:0:0" #BusID "PCI:3:0:0" EndSection
请注意,字符串Identifier和BoardName只是UI标签 - 我需要做的就是在具有不同SM版本的设备之间切换,关闭桌面(对于Ubuntu GNOME - service lightdm stop),移动注释,启动DM(service lightdm start )。
还要确保xorg.conf中只有一个Device部分
答案 1 :(得分:0)
为了调试启动内核时可能出现的错误,您可以定义:
#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
__host__ inline void gpuAssert(cudaError_t code, char *file, int line, bool abort)
{
if (code != cudaSuccess)
{
fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
if (abort) exit(code);
}
}
并像这样调用你的内核:
kernel<<<...>>>(...);
gpuErrchk(cudaPeekAtLastError());
gpuErrchk(cudaDeviceSynchronize());
基本上你可以用gpuErrchk
包装每个cuda函数调用。
希望有所帮助。
答案 2 :(得分:0)
这是完美的驱动程序问题。我从310.4更新到319.17,现在一切都很好。