0

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

可能与 bumblebee Optimus 卡上的当前驱动程序版本相关联,即 304 版本?

4

3 回答 3

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. 希望能有所帮助。

于 2013-04-30T07:05:17.237 回答
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
    

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

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

于 2013-04-29T16:32:38.257 回答
0

这完全是驱动程序问题。我从 310.4 更新到 319.17,现在一切都很好。

于 2013-05-08T08:08:28.973 回答