使用“本地 Windows 调试器”时,Visual Studio 2013 中的 .cu 文件中的断点可以正常工作。但是,当使用 nsight 的“启动 CUDA 调试”时,断点将被忽略。这怎么可能?在 nsight 的网站上,他们声明:“使用熟悉的 Visual Studio Locals、Watches、Memory 和 Breakpoints 窗口”。所以我想可以使用正常的断点?
编辑:
启用 CUDA 内存检查器
:开/关没有区别生成 GPU 调试信息
:否/是 (-G0) 没有区别启动 CUDA/图形调试
:忽略断点
最佳答案
- “启动 CUDA 调试” 调试设备(内核)代码,即使用
nvcc
编译的内容 ->一堆预处理
->cudafe++
->cicc
工具链路径。 - “本地 Windows 调试器” 调试主机代码,这是使用
nvcc
->一堆预处理
->cl 编译的内容
或只是cl
。
您的代码位于哪个文件中并不重要:.cpp
、.cu
或 .h
。唯一重要的是您的代码是否被注释为 __device__
或 __global__
。
从 CUDA 7.5 RC(2015 年 8 月)开始,在 Windows 上您一次只能调试其中一个。在 Linux 和 OSX 上,您可以使用 cuda-gdb
同时调试两者。
另请参阅:NVIDIA CUDA Compiler Driver NVCC
在 Windows 上调试期间可能导致失败的其他事情:
- 您正在为一个配置/平台对设置属性,但正在运行另一个配置/平台
- 主机和设备模块的
.pdb
文件出现问题。检查nvcc
、cl
、nvlink
和link
选项。例如,主机和设备调试信息可以写入同一个文件中,相互覆盖。 - 积极的优化:内联、优化局部变量等。发布代码几乎不可能对人类进行调试。调试器也可能被愚弄。
- 存在未定义的行为和/或内存访问违规。他们很容易使调试器崩溃,从而导致意外结果,例如未命中断点。
- 您忘记检查 CUDA API 或内核调用之一的错误,出现错误,并且 CUDA 上下文已失效,内核将不再运行。但你还不知道这一点。您的主机代码继续运行,并且您期望内核断点命中,但这永远不会发生,因为内核不会被调用。
- 上述所有错误都可能存在于库中。不要指望库没有错误。
- 编译器、调试器和驱动程序也存在错误。但您应该首先假设您的代码有问题,如果没有帮助,请进行调查并向供应商提交错误报告。
关于visual-studio - 使用 nsight 的 "Start CUDA debugging"时忽略断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32295834/