【问题标题】:Debugging cuda kernel code on Ubuntu Nsight?在 Ubuntu Nsight 上调试 cuda 内核代码?
【发布时间】:2013-04-28 11:22:06
【问题描述】:

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

可能与大黄蜂 Optimus 卡上的 304 驱动程序版本相关联?

【问题讨论】:

  • 你在使用 cuda-gdb 吗?还是 Nsight EE?您是否使用 -G 开关进行编译?尝试在内核入口处设置断点(即发出命令break mykernel 或任何您的内核名称),然后查看在击中该断点后是否可以在内核代码中设置断点。 cuda-gdb 手册也有示例练习,您可以尝试。
  • 在 Nsight 的默认设置中使用 cuda-gdb。我也尝试直接在终端上使用 cuda-gdb 调试它,但仍然是同样的问题。
  • 如果您尝试了我的建议,我无法从您的回复中看出。您是否尝试在内核名称处设置断点,然后运行直到命中该断点,然后在内核中设置断点?我建议在不驱动显示器的 GPU 上执行此操作,并配置该 GPU 以使 X 不使用它(即它不会出现在您的 xorg.conf 文件中)。

标签: debugging cuda


【解决方案1】:

为了调试启动内核时可能出现的错误,您可以这样定义:

#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】:

    这通常是由于未在设备上启动内核造成的。确保检查所有错误代码(并尝试在内核调用后添加 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
      

    请注意,字符串 Identifier 和 BoardName 只是 UI 标签——在具有不同 SM 版本的设备之间切换我所要做的就是关闭桌面(对于 Ubuntu GNOME - service lightdm stop),移动评论,启动 DM(service lightdm start )。

    还要确保您的 xorg.conf 中只有一个 Device 部分

    【讨论】:

    • 后半段建议怎么做
    【解决方案3】:

    这完全是驱动问题。我从 310.4 更新到 319.17,现在一切正常。

    【讨论】:

    • 我和你有同样的问题。我的驱动程序是 304.108,无法在设备代码中设置断点。这是否意味着内核没有在 gpu 上运行?或者这不是与 CUDA 调试器有关的问题?
    猜你喜欢
    • 2012-04-26
    • 2020-07-11
    • 2013-03-17
    • 2011-10-05
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2013-11-29
    相关资源
    最近更新 更多