Ped*_*dro 4 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版.
好吧,我想我已经把它弄清楚了.
如果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文件和PTX的PTX时需要一点创造力nvcc,因为指令可能会在某种程度上重新排序.在我的代码中,我有大量的FFMA指令,我可以寻找我的方向.您可以使用"output.ptx"从调试器中找到确切的行,然后在相同的相对位置查看"mykernel.ptx" .
这一切都涉及相当多的工作,但它确实允许您缩小原始源中"Virtual PC"的位置.