使用 nsight 时被忽略的断点 "Start CUDA debugging"

Neglected breakpoints when using nsight's "Start CUDA debugging"

Visual Studio 2013 中的 .cu 文件中的断点在使用 "Local Windows Debugger" 时工作正常。但是当使用 nsight 的 "Start CUDA debugging" 时,断点被忽略了。这怎么可能?在 nsight 的网站上,他们声明:"Use the familiar Visual Studio Locals, Watches, Memory and Breakpoints windows"。所以我猜正常的断点可以用吗?

编辑:

  • "Start CUDA debugging" 调试设备(内核)代码,即用 nvcc -> bunch of preprocessing -> cudafe++ 编译的东西-> cicc 工具链路径。
  • "Local Windows Debugger" 调试主机代码,使用 nvcc -> bunch of preprocessing -> cl 或仅编译的东西cl.

您的代码在哪个文件.cpp.cu.h 中并不重要。唯一重要的是您的代码是否被注释为 __device____global__

自 CUDA 7.5 RC(2015 年 8 月)起,在 Windows 上您一次只能调试其中一个。在 Linux 和 OSX 上,您可以使用 cuda-gdb.

同时调试两者

另请参阅:NVIDIA CUDA Compiler Driver NVCC

在 Windows 调试期间可能导致挫折的其他事情:

  • 您正在为一对 configuration/platform 设置属性,但 运行 设置另一对
  • 主机和设备模块的 .pdb 文件出现问题。检查 nvccclnvlinklink 选项。例如主机和设备调试信息可以写在同一个文件中,互相覆盖。
  • 积极的优化:内联、优化局部等。发布代码几乎不可能为人类调试。调试器也可以被愚弄。
  • 存在内存访问违规的未定义行为and/or。他们很容易使调试器崩溃,导致意外结果,例如断点未命中。
  • 您忘记检查 CUDA API 或内核调用之一的错误,出现错误,CUDA 上下文已死,内核将不再 运行。但你还不知道这一点。您的主机代码继续 运行,您希望内核断点命中,但它永远不会发生,因为内核不会被调用。
  • 上述所有错误都可能在一个库中。不要期望库没有错误。
  • 编译器、调试器和驱动程序也有错误。但是您应该始终首先假设您的代码有问题,如果没有任何帮助,请调查并向供应商提交错误报告。