您是否建议阅读内核的PTX代码以找出进一步优化内核的方法?
一个例子:我读过,可以从PTX代码中找出自动循环展开是否起作用。如果不是这种情况,则必须在内核代码中手动展开循环。
PTX代码还有其他用例吗?
您是否查看您的PTX代码?
在哪里可以找到如何读取CUDA为我的内核生成的PTX代码?
最佳答案
关于PTX的第一点是,它只是在GPU上运行的代码(一种虚拟机汇编语言)的中间表示。 PTX在编译时由ptxas
或在运行时由驱动程序组装为目标机器代码。因此,当您查看PTX时,您查看的是编译器发出的内容,而不是GPU实际运行的内容。也可以从头开始编写自己的PTX代码(这是CUDA中唯一支持的JIT编译模型),也可以作为CUDA C代码中的内联汇编器部分的一部分(后者自CUDA 4.0开始正式支持,但“非官方”支持的时间要长得多。 CUDA始终随工具包一起提供了有关PTX语言的完整指南,并且已对其进行了全面记录。 ocelot project使用此文档来实现自己的PTX交叉编译器,该编译器允许CUDA代码在其他硬件(最初是x86处理器,但最近是AMD GPU)上本机运行。
如果您想查看GPU实际运行的是什么(而不是编译器发出的),NVIDIA现在提供了一个名为cudaobjdump
的二进制反汇编程序工具,该工具可以显示为Fermi GPU编译的代码中的实际机器代码段。有一个较旧的非官方工具称为decuda
,该工具可用于G80和G90 GPU。
话虽如此,从PTX输出中可以学到很多东西,特别是在编译器如何应用优化以及为实现某些C结构而发出的指令方面。 NVIDIA CUDA工具包的每个版本都随附a guide to nvcc
和documentation for the PTX language。这两个文档中都包含大量信息,既可以学习如何将CUDA C / C ++内核代码编译为PTX,又可以了解PTX指令将执行的操作。