'code = sm_X'只嵌入二进制(cubin)代码,还是PTX代码,还是两者兼而有之?

时间:2014-10-07 09:10:23

标签: cuda nvcc

我对代码= sm_X'有点困惑。 ' -gencode'中的选项言。

一个例子:NVCC编译器选项

是什么
-gencode arch=compute_13,code=sm_13

嵌入图书馆?

只有带有CC 1.3的GPU的机器代码(立方码),或带有CC 1.3的GPU的PTX代码?

在' Maxwell兼容性指南'中,声明"只有'代码指定的后端目标版本='子句将保留在生成的二进制文件中。

由此,我推断给定的编译器选项仅嵌入具有CC 1.3和 no PTX代码的GPU的机器代码。这意味着可以运行此库,例如在麦克斯韦尔代卡上,因为库中没有嵌入的PTX代码,机器代码可以在这些代码中及时地使用' (JIT)编译。

另一方面,在GTC 2013演讲中,作为应用程序构建工具的CUDA工具包简介'根据NVIDIA的说法,表示' -gencode arch = compute_13,code = sm_13'对于CC> = 1.3的所有GPU,以及具有CC>的GPU的此编译器选项, 1.3机器代码由PTX代码进行JIT编辑。因此,Maxwell兼容性指南和本GTC演示中提供的信息在我看来是相互矛盾的。

1 个答案:

答案 0 :(得分:3)

nvcc有许多格式可用于指定代码生成选项。阅读section 6 of the nvcc manual可能具有指导意义。

使用此格式时:

nvcc -gencode arch=compute_13,code=sm_13 ...

将保留sm_13(cc 1.3)设备的SASS代码。可执行对象中不会保留PTX,因此代码只能在能够运行cc1.3 SASS的设备上运行

使用上述命令格式,为了将源代码的PTX版本嵌入到可执行对象中,必须使用虚拟架构规范来提供给code=...的选项。由于这种特殊格式(使用-gencode)不允许在单个交换机中指定多个目标,因此我们必须多次将-gencode开关传递给nvcc,每个目标对应一个我们想要嵌入的目标。可执行对象。

因此扩展上面的例子,我们可以使用以下内容:

nvcc -gencode arch=compute_13,code=sm_13 -gencode arch=compute_13,code=compute_13 ...

这将在可执行文件中嵌入cc1.3 SASS(通过第一个gencode开关)和cc1.3 PTX(通过第二个gencode开关)。能够直接运行cc1.3 SASS代码的设备将使用它。其他设备(计算能力大于cc 1.3)将由驱动程序执行JIT编译步骤,以将cc1.3 PTX代码转换为具有适合所讨论设备的体系结构的SASS代码。

我同意the GTC 2013 presentation(例如幻灯片37)似乎暗示

nvcc -gencode arch=compute_13,code=sm_13 ...
对于计算能力为1.3或更高的所有设备,

就足够了。它不是,这很容易证明。如果您使用上述格式编译代码,并尝试在cc 2.0设备上运行它,它将失败,并且您的代码中的任何内核或内核都会出现“无效的设备函数”错误。

同样,nvcc具有各种命令格式和用于指定代码生成的“快捷方式”。一些相对简单的,例如:

nvcc -arch=sm_13 ...

将在可执行对象中嵌入代码的PTX和SASS版本,从而产生了一种向前兼容性建议。