如何获取CUDA核函数的汇编代码?

10

我编写了一些OpenCL和CUDA内核。在AMD分析器中运行OpenCL程序时,它允许我查看内核的汇编代码。我想将此与CUDA内核的汇编代码进行比较,以比较两种语言之间的编译器优化。我一直在使用Nvidia分析器进行尝试,但仍然不知道如何获得我的内核的汇编代码。如何进行此操作?


我对GPGPU的了解还不足以让它成为一个答案,但我怀疑在这里没有什么有用的比较。 AMD和Nvidia的部件差异足够大,它们可能甚至不使用相同的汇编语言。 - user149341
我意识到会有很大的差异,但我正在寻找一种特定的优化进行比较。无论差异如何,我只需要查看汇编代码,并应该能够确定相对相似之处。 - PseudoPsyche
1
$.02说即使你在签订保密协议时付出巨大代价,你也不会得到任何官方信息。还可参见https://dev59.com/E2s05IYBdhLWcg3wQvoe和https://dev59.com/AGkw5IYBdhLWcg3wkLf2。 - nos
@PseudoPsyche:即使你能让CUDA发出一些汇编代码,与ATI的汇编代码之间的差异可能是如此之大,以至于你根本无法找到任何相似之处。 - user149341
@duskwuff 发现 PTX 就是我正在寻找的东西。它为我提供了足够的信息来进行所需的比较。 - PseudoPsyche
显示剩余3条评论
2个回答

2
如turboscrew所说,与CUDA最接近的汇编语言是PTX代码。我认为将实际生成PTX代码的方法添加到此答案中会更有用。可以按照以下方式生成PTX代码:使用命令nvcc -ptx -o kernel.ptx kernel.cu,其中kernel.cu是源文件,kernel.ptx是目标PTX文件。此外,以下是NVidia的PTX文档链接:http://docs.nvidia.com/cuda/parallel-thread-execution/index.html。如果您了解一些汇编知识,则大部分内容都很简单明了。但在使用某些特殊函数时,查找更多详细信息可能会很有用。

8
“CUDA中最接近汇编的东西是PTX代码”这句话是错误的。可以直接使用cuobjdump工具来检查汇编代码。 - Robert Crovella
@RobertCrovella,是否有方法可以使用nvcc直接从.cu源代码转换成当前GPU的汇编代码?我主要关注寄存器的使用情况,但如果我的理解正确,PTX是一种SSA格式。 - Todd Sewell
1
是的,这就是 nvcc 的作用。它将 .cu 源代码编译为 SASS。将其编译为二进制格式(如可执行文件),然后在可执行文件上使用 cuobjdump 实用程序。在 cuda 标签中有许多关于此问题的问题。如果您想查看寄存器使用情况,还有其他二进制实用程序可以帮助解决。 - Robert Crovella

-2

你想阅读PTX吗?你并不能更靠近汇编。NVIDIA 没有发布其 GPU 的汇编代码。该“汇编”是 PTX,由驱动程序中的字节码解释器执行的“伪汇编”。


谢谢!是的,PTX代码正是我想要的!我之前听说过PTX,但并没有意识到它实际上就是我在寻找的东西。我还以为有另一层级的汇编或者其他什么东西。 - PseudoPsyche
12
CUDA已经与官方工具cuobjdump一起发布,可以将任何目标文件、cubin、库或应用程序反汇编为实际的二进制机器码。同时,PTX不是由驱动程序中的“字节码解释器”执行的,不存在这样的东西。 PTX使用传统的汇编程序(称为ptxas,在每个工具包中都提供)组装成微代码并在GPU上“直接运行”。很抱歉,这篇答案中几乎所有的内容都是错误的。 - talonmies
从我之前的问题答案中,我有了不同的理解:JIT编译。根据我的理解,机器码因GPU而异,以至于学习它毫无意义。看起来nVidia并没有承诺任何机器码级别的兼容性。 - turboscrew
1
Jit编译只是在运行时驱动程序在PTX代码上运行汇编程序。这里没有像Android Dalvik或Java VM这样的东西。NVIDIA 发行了一份描述最新架构机器代码的文档。确实,原始的Telsa指令集与Fermi和Kepler有些不同,但后两者(代表约4年的硬件设计)即使硅本身已经发生了很大变化,也是相当进化的。 - talonmies
"NVIDIA发布了一份描述机器码的文档。真遗憾,我曾经特别要求过机器码规格,但得到的回复是:“无法做到”。AMD已经公布了其主要架构的机器码。" - turboscrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接