我有一个相当大而复杂的CUDA代码,可以很好地挂起大量的块/线程。我试图弄清楚代码的确切位置。
当我在cuda-gdb
中运行代码时,我可以看到哪些线程/块挂起,但我无法看到“虚拟PC”之外的位置。
如果我使用“-G”编译代码来获取调试信息,那么无论我运行多长时间,它都会运行得慢很多并且拒绝挂起。
有没有办法将“虚拟PC”映射到源代码中的一行代码,甚至大概?或者有没有办法在不关闭所有优化的情况下获取调试信息?
我尝试过使用“-G3”,但无济于事。这只是给了我“nvcc warning : Setting optimization level to 0 as optimized debugging is not supported
”类型的警告。我正在使用CUDA编译工具4.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"的位置。在你原来的来源。