NVIDIA NVCC和CUDA:Cubin vs. PTX

时间:2011-10-08 10:35:23

标签: cuda nvidia nvcc

我使用CUDA 4.0 arch。,带有Compute_Capability 2.0设备(GTX460)。 'cubin'和'ptx'文件有什么区别? 我认为cubin是gpu的本机代码,所以这是拱门。具体而言,ptx是一种通过JIT编译在费米设备(例如Geforce GTX 460)上运行的中间语言。当我编译cu源时,我可以在ptx或cubin目标之间进行选择。如果我想要cubin文件,我选择“code = sm_20”。但如果我想要一个ptx文件,我会使用“code = compute_20”。 这是对的吗?

1 个答案:

答案 0 :(得分:17)

您已经混合了选项以选择编译阶段(-ptx-cubin)以及用于控制要定位的设备(-code)的选项,因此您应该重新访问文档

NVCC是NVIDIA编译器驱动程序。 -ptx-cubin选项用于选择编译的特定阶段,默认情况下,没有任何阶段特定的选项,nvcc将尝试从输入生成可执行文件。大多数人使用-c选项导致nvcc生成一个目标文件,该文件稍后将由默认平台链接器链接到可执行文件中,-ptx-cubin选项仅在以下情况下才有用您正在使用Driver 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的设备特定二进制文件嵌入到最后的胖二进制文件。