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

Posted

技术标签:

【中文标题】如何获取 CUDA 内核的汇编代码?【英文标题】:How to get the assembly code of a CUDA kernel? 【发布时间】:2013-12-27 06:35:06 【问题描述】:

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

【问题讨论】:

我对 GPGPU 不够熟悉,无法回答这个问题,但我怀疑这里没有有用的比较。 AMD 和 Nvidia 的部件完全不同,它们甚至可能不使用相同的汇编语言。 我意识到会有显着差异,但我希望比较一个特定的优化。我真的只需要查看程序集,无论差异如何,并且应该能够识别相对相似之处。 $.02 表示即使在 NDA 中签署了一条胳膊和一条腿,您也不会获得任何官方信息。另见***.com/questions/7353136/… 和***.com/questions/9798258/what-is-sass-short-for @PseudoPsyche:即使您可以让 CUDA 发出一些程序集,但它与 ATI 程序集之间的差异可能如此之大,以至于您根本无法识别任何相似之处。 @nos 感谢您提供第二个链接!原来这就是我要找的! 【参考方案1】:

正如 turboscrew 所提到的,最接近 CUDA 组装的是 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

如果你有一些汇编知识,大部分都相当简单。有一些特殊功能可能会用到,但如果您需要查找它们以了解更多详细信息会很有用。

【讨论】:

“最接近 CUDA 组装的是 PTX 代码”是错误的。可以使用the cuobjdump tool 直接检查程序集。【参考方案2】:

您想阅读 PTX 吗?你离大会更近了。 vidia 尚未发布其 GPU 的组装。 “程序集”是 PTX,它是由驱动程序中的字节码解释器执行的“伪程序集”。

【讨论】:

谢谢!是的,PTX 代码正是我想要的!我读过 PTX,但没有意识到它实际上是我正在寻找的。我认为还有另一个层次是实际的组装或其他东西。 Err CUDA 已经附带了一个名为 cuobjdump 的官方工具,它将反汇编由汇编程序发出的实际二进制机器代码。任何目标文件、cubin、库或应用程序都可以用这种方式处理。此外,PTX 不是由驱动程序中的“字节码解释器”执行的,没有这样的事情。 PTX 使用传统的汇编器(称为 ptxas,也在每个工具包中提供)组装成微码,并在 GPU 中“在金属上”运行。恐怕这个答案中的所有内容都是错误的。 从前段时间对我的问题的回答中,我有了不同的理解:JIT 编译。 devtalk.nvidia.com/default/topic/551214/gpu-assembly 据我了解,GPU 与 GPU 的机器代码差异很大,因此尝试学习它毫无意义。看起来 nVidia 不承诺任何机器代码级别的兼容性。 Jit 编译只是在运行时在 PTX 代码上运行汇编程序的驱动程序。这里没有像 android Dalvik 或 Java VM 这样的东西。并且 NVIDIA ship 文档描述了最新架构的机器代码。的确,最初的 Telsa 指令集与 Fermi 和 Kepler 略有不同,但后两者(代表大约 4 年的硬件设计价值)是相当进化的,即使硅本身发生了很大变化 “NVIDIA 发布了一份描述机器代码的文档”——该死。我曾经专门询问机器代码规格,但我得到了答复:“不能做”。 AMD 已发布其主要架构的机器代码。

以上是关于如何获取 CUDA 内核的汇编代码?的主要内容,如果未能解决你的问题,请参考以下文章

在 CUDA 中,如何在内核函数中将屏幕空间坐标转换为世界空间坐标

如何从活动 CUDA 设备获取属性?

如何从主机代码中中断或取消 CUDA 内核

如何使用 g++ 获取 C++ 头文件 (.hpp) 的汇编代码?

如何编写汇编代码,实现自定位获取当前EIP

cuda Thrust 如何获取与键关联的值