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

Posted

技术标签:

【中文标题】我应该研究 PTX 来优化我的内核吗?如果是这样,怎么做?【英文标题】:Should I look into PTX to optimize my kernel? If so, how? 【发布时间】:2011-12-26 05:28:03 【问题描述】:

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

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

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

【问题讨论】:

可以反汇编二进制代码。您应该查看 IMO,以避免陷入“我认为它会优化那种”类型的陷阱,并且能够在优化内核时看到您实际在做什么。 【参考方案1】:

首先要说明的是,它只是在 GPU 上运行的代码的一种中间表示形式——一种虚拟机汇编语言。 PTX 在编译时由ptxas 或在运行时由驱动程序组装成目标机器代码。因此,当您查看 PTX 时,您查看的是编译器发出的内容,而不是 GPU 实际运行的内容。也可以从头开始编写您自己的 PTX 代码(这是 CUDA 中唯一支持的 JIT 编译模型),或者作为 CUDA C 代码中内联汇编程序部分的一部分(后者自 CUDA 4.0 起正式支持,但是“非官方”支持的时间要长得多)。 CUDA 始终随工具包一起提供 PTX 语言的完整指南,并且有完整的文档。 ocelot project 使用此文档实现了他们自己的 PTX 交叉编译器,它允许 CUDA 代码在其他硬件上本地运行,最初是 x86 处理器,但最近 AMD GPUs

如果您想查看 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 指令的作用。

【讨论】:

以上是关于我应该研究 PTX 来优化我的内核吗?如果是这样,怎么做?的主要内容,如果未能解决你的问题,请参考以下文章

我可以将“静态”CUDA 内核启动与 PTX 代码结合起来并获得一个工作二进制文件吗?

PTX“位桶”寄存器

PTX 中的变量“已降级”是啥意思?

OpenCL 内核的 LLVM IR 到 PTX 到二进制

PTX - 啥是 CTA?

NVCC和NVRTC在编译为PTX时的差异