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

Debugging CUDA调试,或者如何在不禁用优化的情况下获取CUDA gdb中的源代码行?,debugging,cuda,nvidia,cuda-gdb,Debugging,Cuda,Nvidia,Cuda Gdb,我有一个相当大和复杂的CUDA代码,它可以非常可靠地挂起大量的块/线程。我正试图弄清楚代码挂起的确切位置 当我在cuda gdb中运行代码时,我可以看到哪些线程/块挂起,但除了“虚拟PC”之外,我看不到挂起的位置 如果我用“-G”编译代码以获取调试信息,那么无论我运行多长时间,它都会运行得非常慢,并且拒绝挂起 有没有办法将“虚拟PC”映射到源代码中的一行代码,甚至是近似的?或者有没有一种方法可以在不关闭所有优化的情况下获取调试信息 我试过使用“-G3”,但没有用。这只会给我类型为“nvcc警告:

我有一个相当大和复杂的CUDA代码,它可以非常可靠地挂起大量的块/线程。我正试图弄清楚代码挂起的确切位置

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

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

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


我试过使用“-G3”,但没有用。这只会给我类型为“
nvcc警告:将优化级别设置为0,因为不支持优化调试”
。我正在使用CUDA编译工具4.1版。

好的,我想我已经自己解决了

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

要使汇编程序与内核代码相匹配,首先确保使用
nvcc-keep[..]mykernel.cu编译内核。这将生成文件
mykernel.sm_20.cubin
(或您选择的任何arch)和
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”


这一切都涉及到相当多的工作,但它确实允许您缩小“虚拟PC”在原始源代码中的位置。

我想它说明了一切:“不支持优化调试”。您可以尝试使用
printf
进行调试,尽管我有120个块在运行,并且在每一步都必须使用printf。这会使计算速度比调试标志慢得多。这就是为什么我在寻找替代方案,特别是关于将“虚拟PC”映射到源代码行的问题。@aland:我实际上尝试了
printf
语句,但失败了,因为它们只在内核返回后才会刷新。如果内核挂起,那么该调用中的
printf
语句实际上都不会发出。感谢分享此策略。您知道CUDA现在是否支持优化/发布构建调试吗?