【问题标题】:Why doesn't debugger break in kernel code为什么调试器不会中断内核代码
【发布时间】:2013-10-01 20:02:36
【问题描述】:

我在带有两个显卡的 64 位 Ubuntu 12.04 机器上安装了 Eclipse Nsight 5.0 (CUDA 5.0):用于调试的 Geforce GT 240 桌面 UI 和 Geforce GTX 480。我可以很好地编译和运行 Cuda 程序。但是,当我在 Cuda 代码中设置断点并开始调试时,光标并没有停在该行而是跳转到内核函数的末尾。

我已在调试配置中将 Geforce GTX 480 设置为调试器并检查每个内核调用的返回值。我还能尝试什么?另外,我没有这台电脑的root权限。

【问题讨论】:

  • 内核函数中不一定会遇到断点。在 GPU 上实际执行的代码与您尝试设置断点的代码有很大不同,因为 CUDA 编译器通常会执行非常激进的代码优化。

标签: debugging cuda nsight


【解决方案1】:

在调试器下运行时您的内核是否会被执行(例如,您是否看到正确的值已更新)?可能是您的 NVIDIA 驱动与工具包不兼容。

如果内核没有执行,很可能这很简单,例如您的内核针对与您用于调试的卡不兼容的架构进行编译。

你的内核调用后你有 cudaDeviceSynchronize 吗?你检查它的返回值吗?

【讨论】:

  • 是的,内核在调试器下执行,就像程序正常运行一样。我在每次内核调用后调用 cudaDeviceSynchronize 并检查返回值是否等于 cudaSuccess。我必须检查为 Geforce GTX 480 安装了哪个驱动程序。我在哪里可以检查哪个驱动程序与 CUDA 5.0 兼容?
  • CUDA 工具包需要驱动程序 304.54 或更高版本,但在极少数情况下,最新驱动程序可能无法与旧工具包一起使用。您是否尝试过在 shell 中使用 cuda-gdb 进行调试?
  • 在内核调用后检查cudaDeviceSynchronize 的返回值不足以捕获所有类型的启动失败。特别是,它不会捕获由于内核被编译为不兼容的体系结构而导致的启动失败类型。评论proper cuda error checking
  • 我的 Nvidia 驱动程序版本是 304.88 我从终端使用 cuda-gdb 调试程序,我遇到了同样的问题。例如,我调试了示例程序 bitreverse 并在 l.38 中设置了一个断点,其中调用了一个全局函数。然后 cuda-gdb 告诉我断点位于 l.40,即全局函数调用的结尾。
  • 请尝试使用示例目录中的 makefile 编译和运行一些 CUDA 示例(例如,不要将其导入 Nsight)。您也可以尝试从代码中枚举您的设备,以查看 cuda-gdb 隐藏了哪些图形适配器。
猜你喜欢
  • 1970-01-01
  • 2011-09-03
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 2019-12-21
  • 1970-01-01
相关资源
最近更新 更多