我对代码= 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演示中提供的信息在我看来是相互矛盾的。
答案 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版本,从而产生了一种向前兼容性建议。