我对“-gencode”语句中的“code=sm_X”选项感到有点困惑。
一个例子: NVCC编译器选项是什么?
-gencode arch=compute_13,code=sm_13藏在图书馆里?
只有用于具有CC1.3的GPU的机器代码(cubin代码),或者也用于具有CC1.3的GPU的PTX代码?
在'Maxwell兼容性指南‘中,声明“只有'code=’子句指定的后端目标版本将保留在最终的二进制文件中”。
由此,我可以推断,给定的编译器选项只嵌入具有CC1.3的GPU的机器代码,而不包含PTX代码。这意味着不可能运行这个库,例如在aa Maxwell生成卡上,因为库中没有嵌入的PTX代码,机器代码可以从中编译。
另一方面,在2013年GTC介绍的“作为应用程序构建工具的CUDA工具包简介”中指出,“-gencode arch=compute_13,code=sm_13”对CC >= 1.3的所有GPU来说都足够了,对于CC > 1.3的GPU使用此编译器选项时,机器代码是从PTX代码中提取的。因此,在麦克斯韦兼容性指南中给出的信息和这个GTC演示文稿在我看来是相互矛盾的。
发布于 2014-10-07 14:56:14
nvcc有许多格式,可以通过这些格式指定代码生成选项。读一读“国家职业资格证书手册”第6节可能会有指导意义。
使用此格式时:
nvcc -gencode arch=compute_13,code=sm_13 ...只有sm_13 (cc 1.3)设备的SASS代码将被保留。可执行对象中不会保留PTX,因此代码只能在能够运行cc1.3sass的设备上运行。
使用上述命令格式,为了将源代码的PTX版本嵌入到可执行对象中,有必要为code=...提供的选项使用虚拟体系结构规范。由于这种特殊格式(使用-gencode)不允许在单个交换机中指定多个目标,因此我们必须多次将-gencode交换机传递给nvcc,每个目标都需要嵌入到可执行对象中。
因此,扩展上面的示例,我们可以使用以下内容:
nvcc -gencode arch=compute_13,code=sm_13 -gencode arch=compute_13,code=compute_13 ...这将在可执行文件中嵌入cc1.3sass(通过第一个gencode开关)和cc1.3ptx(通过第二个gencode开关)。能够直接运行cc1.3sass代码的设备将使用它。其他设备(计算能力大于cc 1.3)将由驱动程序执行JIT编译步骤,将cc1.3 PTX代码转换为具有适合该设备的体系结构的SASS代码。
我同意GTC 2013年专题介绍 (如幻灯片37)似乎表明
nvcc -gencode arch=compute_13,code=sm_13 ...对于计算能力1.3或更高的所有设备都足够。事实并非如此,这很容易证明。如果您使用上述格式编译代码,并试图在cc 2.0设备上运行它,它将失败,导致与代码中的任何内核或内核相关联的“无效设备函数”错误。
同样,nvcc有多种命令格式和指定代码生成的“快捷方式”。一些相对简单的问题,例如:
nvcc -arch=sm_13 ...将在可执行对象中嵌入PTX和SASS版本的代码,从而产生建议的前向兼容性。
https://stackoverflow.com/questions/26232500
复制相似问题