您是否建议阅读内核的PTX代码以进一步优化内核?
一个例子:我读过,如果自动循环展开有效,可以从PTX代码中找到。如果不是这种情况,则必须在内核代码中手动展开循环。
答案 0 :(得分:14)
关于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
的二进制反汇编工具,可以在编译的代码中显示实际的机器代码段。费米GPU。有一个名为decuda
的旧的,非官方的工具,适用于G80和G90 GPU。
话虽如此,从PTX输出中可以学到很多东西,特别是编译器如何应用优化以及它为实现某些C结构而发出的指令。每个版本的NVIDIA CUDA工具包都附带a guide to nvcc
和documentation for the PTX language。两个文档中都包含大量信息,既可以学习如何将CUDA C / C ++内核代码编译到PTX,也可以了解PTX指令的作用。