【问题标题】:Nsight skips (ignores) over break points in VS10 Cuda works fine, nsight consistently skips over several breakpointsNsight 跳过(忽略)VS10 Cuda 中的断点工作正常,nsight 始终跳过几个断点
【发布时间】:2012-06-05 09:06:22
【问题描述】:

我正在使用 nsight 2.2、Toolkit 4.2、最新的 nvidia 驱动程序,我在我的计算机中使用了几个 GPU。构建自定义 4.2。我在 CUDA 的项目属性上设置了“生成 GPU 输出”,nsight 监视器打开(一切看起来都很棒)。

我在全局内核函数上设置了几个断点。 nsight 在函数声明处停止,但会跳过几个断点。这就像 nsight 决定是打断点还是跳过断点。有趣的是,nsight 会在 for 循环处停止,但不会在简单的赋值操作上停止。

还有一个问题是我无法设置焦点或将变量添加到监视列表。在这种情况下(请参阅随附的屏幕截图),我无法解析变量的值:“posss”或“testDetctoinRate1”在这种情况下是寄存器。另一方面,共享内存或块内存会自动插入到本地列表中。

Here is a screen shot of the kernel, before debugging

Here is a screen shot during debugging

我通过以下调用调用我的内核函数:

checkCUDA<<<1, 32>>>(sumMat->rows,sumMat->cols , (UINT *)pGPUsumMat); 
cudaError = cudaGetLastError();
if(cudaError != cudaSuccess)
{
    printf("CUDA error: %s\n", cudaGetErrorString(cudaError));
    exit(-1);
}

内核调用没有错误。

是否有任何选项可以强制 nsight 在所有断点处停止?如何将线程的寄存器添加到我的观察列表?

更新

最初,我的调试命令行如下:

# Runtime API (NVCC Compilation Type is hybrid object or .c file)
set CUDAFE_FLAGS=--sdk_dir "c:\Program Files\Microsoft SDKs\Windows\v7.0A\"
"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\bin\nvcc.exe" --use-local-env --cl-version 2010 -ccbin "C:\Program Files\Microsoft Visual Studio 10.0\VC\bin" -I"..\..\..\opencv\modules\gpu\src\opencv2\gpu\device" -I"..\..\..\opencv\modules\gpu\include\opencv2\gpu" -I"..\..\..\build\include\\"   -G  --keep-dir "Debug" -maxrregcount=0  --machine 32 --compile  -g    -Xcompiler "/EHsc /nologo /Od /Zi  /MDd  " -o "Debug\%(Filename)%(Extension).obj" "%(FullPath)"

我在属性页上改了 --> cuda --> 主机 --> 生成主机调试信息 --> 没有

现在我的命令行不包含 -g 和 -O 字母,我的命令行如下:

# Runtime API (NVCC Compilation Type is hybrid object or .c file)
set CUDAFE_FLAGS=--sdk_dir "c:\Program Files\Microsoft SDKs\Windows\v7.0A\"
"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\bin\nvcc.exe" --use-local-env --cl-version 2010 -ccbin "C:\Program Files\Microsoft Visual Studio 10.0\VC\bin" -I"..\..\..\opencv\modules\gpu\src\opencv2\gpu\device" -I"..\..\..\opencv\modules\gpu\include\opencv2\gpu" -I"..\..\..\build\include\\"   -G  --keep-dir "Debug" -maxrregcount=0  --machine 32 --compile      -Xcompiler "/EHsc /nologo /Od /Zi  /MDd  " -o "Debug\%(Filename)%(Extension).obj" "%(FullPath)"

虽然,我使用-o 进行调试,但这有关系吗?它没有任何改变。

【问题讨论】:

    标签: cuda gpgpu gpu nsight


    【解决方案1】:

    在解决方案资源管理器中右键单击 .cu 文件,然后转到 CUDA C/C++ | Device 并将 Generate GPU Debug Information 设置为 Yes (-G0)

    【讨论】:

    • 我将您的命令行与我在 Visual Studio 2010 CUDA 项目中的命令行进行比较,您的命令行有 -G,而我的命令行有 -G0。但是,如果我将Generate GPU Debug Information 设置为No,我不会得到-G。相反,-G 完全消失了。所以这个答案可能没有帮助。随意使您的整个项目可用。我会下载它,看看调试是否适合我。
    • 感谢帮助,我生成的 GPU 调试信息已设置为“是”
    • 嘿,罗杰,感谢您的帮助,终于成功了,我可以在 nsight 中查看寄存器值。我建议使用最新版本的 nsight.Plus ,如果您可以查看特定值,则可以将其声明为 shared 而不是 S
    • 我正在尝试调试此项目中的 cuda 代码:github.com/PointCloudLibrary/pcl。我的设置默认已经是-G了,但还是会跳过断点,为什么?
    【解决方案2】:

    检查Nsight下的“Enable CUDA Memory Checker”是否关闭。它可能允许 NSight 在 VS C++ 2010 的调试模式下停止 CUDA 内核代码的断点。至少,它对我有用。

    【讨论】:

    • 那么你是把它ON还是OFF?此外,每当我打开它时,我的屏幕就会变黑并且似乎操作系统出现故障,我所要做的就是按下电源按钮重新启动我的电脑;(
    【解决方案3】:

    在调试版本中,您是否将 -O 和 -g 选项都传递给 nvcc?如果是这样,请尝试删除 -O。

    背景:这听起来像是在尝试调试已被编译器优化的代码时遇到的问题。在优化期间,编译器会更改代码,使某些源代码行不再有任何与之关联的机器代码指令,从而使调试器无法在这些行上设置断点。

    【讨论】:

    • 我在属性页上更改了 --> cuda --> 主机 --> 生成主机调试信息 --> 不。它没有做任何更改。
    • 其实以“-”开头的选项是给nvcc的,以“/”开头的选项是传给cl的。 Host 部分中的更改仅影响 "/" cl 选项。因此,“-O”标志可能来自 Device 部分中的某些设置,但我在您的命令行选项中看不到它。
    【解决方案4】:

    我有类似的问题。 Nsight 并没有在任何断点处停止。但完成执行。

    如果我使用 -G0 作为调试信息选项。它给出了一个错误。

    我正在使用带有 cuda 4.2 和 cuda 5 工具包的 nvidia 2.2.0.1225。带有 301.42 图形驱动程序。

    【讨论】:

      猜你喜欢
      • 2013-04-21
      • 2013-01-09
      • 2015-11-24
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 2013-12-02
      相关资源
      最近更新 更多