4

我有一个相当大且复杂的 CUDA 代码,对于大量块/线程来说,它非常可靠地挂起。我试图弄清楚代码挂在哪里。

当我在 中运行代码时cuda-gdb,我可以看到哪些线程/块挂起,但我看不到“虚拟 PC”之外的位置。

如果我用“-G”编译代码来获取调试信息,无论我运行多长时间,它都会运行得慢很多并且拒绝挂起。

有没有办法将“虚拟PC”映射到源代码中的一行代码,甚至是近似的?或者有没有办法在不关闭所有优化的情况下获取调试信息?

我试过使用“-G3”,但无济于事。这只是给了我“”类型的警告nvcc warning : Setting optimization level to 0 as optimized debugging is not supported。我正在使用 CUDA 编译工具 4.1 版。

4

1 回答 1

9

好吧,我想我已经自己解决了。

如果cuobjdump在路径中,则在 中cuda-gdb,该命令x $pc将为您提供当前线程停止的汇编程序。问题是,如果源代码不是用 编译的-G,您将无法将汇编语句与代码中的一行相关联。

要将汇编程序与内核代码匹配,首先确保您使用nvcc -keep [..] mykernel.cu. 这应该生成文件mykernel.sm_20.cubin(或您选择的任何拱门)和mykernel.ptx.

要获取整个内核的汇编程序,请运行cuobjdump -sass mykernel.cubin > output.ptx. 在cuda-gdb中,x/20i $pc-80获取一些上下文,并在文件中查找这些行output.ptx。然后,您可以尝试将这些行与 PTX 代码匹配,mykernel.ptx其中包含.loc引用源代码行的语句。

这种方法在匹配来自 cubin-file 的 PTX 和来自 的 PTX 时需要一点创造力nvcc,因为指令可能会重新排序。在我的代码中,我有大量的FFMA指令可以查找以了解我的方位。您可以使用“output.ptx”从调试器中找到确切的行,然后在相同的相对位置查看“mykernel.ptx”。

这一切都涉及大量工作,但它确实允许您缩小原始源中“虚拟 PC”的位置。

于 2012-05-15T17:15:48.380 回答