我应该调查PTX来优化我的内核吗?如果是这样,怎么样?

时间:2011-11-10 14:22:37

标签: performance cuda gpgpu ptx loop-unrolling

您是否建议阅读内核的PTX代码以进一步优化内核?

一个例子:我读过,如果自动循环展开有效,可以从PTX代码中找到。如果不是这种情况,则必须在内核代码中手动展开循环。

  • PTX代码还有其他用例吗?
  • 你看看你的PTX代码了吗?
  • 我在哪里可以找到如何读取CUDA为我的内核生成的PTX代码?

1 个答案:

答案 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 nvccdocumentation for the PTX language。两个文档中都包含大量信息,既可以学习如何将CUDA C / C ++内核代码编译到PTX,也可以了解PTX指令的作用。