在Ubuntu Nsight上调试cuda内核代码?

时间:2013-04-28 11:22:06

标签: debugging cuda

我有一个附有2个cuda卡的桌面,我尝试通过在内核行中添加一些断点来调试cuda代码。但是,调试器仅显示内核函数的入口和结束括号。它没有提供踩到内核函数体的能力。它只是忽略了。我已经读过要调试GPU内核,你需要将代码运行到当前系统未使用的图形卡上。在此基础上,我还尝试通过将我的活动GPU设置为第二个(系统未使用)来运行调试器,但仍然调试器忽略了内核主体。如果有功能的CUDA调试器,我怎么能解决这个问题?否则编写复杂的cuda内核会非常痛苦。

可能与现在的304现在的驱动程序版本相关联,在bumblebee optimus卡上?

3 个答案:

答案 0 :(得分:0)

这通常是由于内核未在设备上启动而引起的。确保检查所有错误代码(并尝试在内核调用后添加cudaDeviceSynchronize并检查其错误代码)。常见的错误是为错误的SM版本编译内核。另请尝试从您的应用程序中打印出可用的CUDA设备。

请注意,您也可能遇到一些设置问题 - 例如确保Nouveau驱动程序被正确列入黑名单。在某些情况下,即使没有连接显示器,X也可能使用您的设备 - 尝试在xorg.conf中明确设置PCI ID。

通过PCI ID指定适配器:

  1. 通过从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)
    
  2. 要使用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
    
  3. 请注意,字符串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,现在一切都很好。