CUDA调试,或如何在不禁用优化的情况下获取cuda-gdb中的源代码行?

时间:2012-05-14 17:49:52

标签: debugging cuda nvidia cuda-gdb

我有一个相当大而复杂的CUDA代码,可以很好地挂起大量的块/线程。我试图弄清楚代码的确切位置。

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

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

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

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

1 个答案:

答案 0 :(得分:8)

好的,我想我已经自己想出来了。

如果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中查找这些行。然后,您可以尝试将这些行与mykernel.ptx中的PTX代码进行匹配,其中包含引用源代码行的.loc语句。

这种方法需要一些创造力来匹配来自cubin文件的PTX和来自nvcc的PTX,因为指令可能会在某种程度上重新排序。在我的代码中,我有大量FFMA指令,我可以寻找我的方向。您可以使用" output.ptx"从调试器中找到确切的行,然后查看" mykernel.ptx"在相同的相对位置。

这一切都涉及相当多的工作,但它确实允许你缩小" Virtual PC"的位置。在你原来的来源。