PTX 和 CUBIN w.r.t 有啥区别? NVCC 编译器?

Posted

技术标签:

【中文标题】PTX 和 CUBIN w.r.t 有啥区别? NVCC 编译器?【英文标题】:What's the difference between PTX and CUBIN w.r.t. the NVCC compiler?PTX 和 CUBIN w.r.t 有什么区别? NVCC 编译器? 【发布时间】:2011-12-03 12:26:21 【问题描述】:

我安装了 CUDA 4.0,并且设备具有 Compute Capability 2.0(GTX 460 卡)。

“cubin”和“ptx”文件有什么区别?

我认为 cubin 是 gpu 的本机代码,因此这是特定于微架构的,而 ptx 是通过 JIT 编译在 Fermi 设备(例如 Geforce GTX 460)上运行的中间语言。当我编译 .cu 源文件时,我可以在 ptx 或 cubin 目标之间进行选择。如果我想要 cubin 文件,我选择code=sm_20。但如果我想要一个 ptx 文件,我会使用 code=compute_20

对吗?

【问题讨论】:

.cubin 是 CUDA 二进制文件,.ptx 是传递给 ptxas 汇编器的 CUDA 汇编器源代码(文本) 【参考方案1】:

您将选择编译阶段的选项(-ptx-cubin)与控制目标设备的选项(-code)混为一谈,因此您应该重新查看文档。

NVCC 是 NVIDIA 编译器驱动程序。 -ptx-cubin 选项用于选择编译的特定阶段,默认情况下,没有任何特定于阶段的选项 nvcc 将尝试从输入生成可执行文件。大多数人使用-c 选项来使nvcc 生成一个目标文件,该文件稍后将通过默认平台链接器链接到可执行文件中,-ptx-cubin 选项只有在您使用驱动程序API 时才真正有用.有关中间阶段的更多信息,请查看安装 CUDA Toolkit 时安装的 nvcc 手册。

-ptx 的输出是纯文本 PTX 文件。 PTX 是 NVIDIA GPU 的中间汇编语言,尚未完全优化,稍后将被汇编为特定于设备的代码(例如,不同的设备具有不同的寄存器计数,因此完全优化 PTX 是错误的)。 -cubin 的输出是一个胖二进制文件,其中可能包含一个或多个特定于设备的二进制图像以及(可选)PTX。

你提到的-code 参数完全有不同的目的。我鼓励您查看包含几个示例的 nvcc 文档,通常我建议使用 -gencode 选项,因为它允许更多控制并允许您在一个二进制文件中定位多个设备。举个简单的例子:

-gencode arch=compute_xx,code=\'compute_xx,sm_yy,sm_zz\' 使 nvcc 以所有具有计算能力 xx(即 arch= 位)的设备为目标,并将 PTX (code=compute_xx) 以及 sm_yy 和 sm_zz 的设备特定二进制文件嵌入到最终的胖二进制文件中。

【讨论】:

以上是关于PTX 和 CUBIN w.r.t 有啥区别? NVCC 编译器?的主要内容,如果未能解决你的问题,请参考以下文章

prefetch 和 prefetchu ptx 指令有啥区别?

NVRTC 编译何时应生成 CUBIN?

使用内联 PTX asm() 指令时,'volatile' 有啥作用?

NVCC 和 NVRTC 在编译到 PTX 上的区别

试图唤醒 gpu 中的断点

alloca(n) 和 char x[n] 有啥区别?