首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“code=sm_X”是只嵌入二进制(cubin)代码,还是也嵌入PTX代码,还是两者都嵌入?

“code=sm_X”是只嵌入二进制(cubin)代码,还是也嵌入PTX代码,还是两者都嵌入?
EN

Stack Overflow用户
提问于 2014-10-07 09:10:23
回答 1查看 2.7K关注 0票数 3

我对“-gencode”语句中的“code=sm_X”选项感到有点困惑。

一个例子: NVCC编译器选项是什么?

代码语言:javascript
复制
-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演示文稿在我看来是相互矛盾的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-07 14:56:14

nvcc有许多格式,可以通过这些格式指定代码生成选项。读一读“国家职业资格证书手册”第6节可能会有指导意义。

使用此格式时:

代码语言:javascript
复制
nvcc -gencode arch=compute_13,code=sm_13 ...

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

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

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

代码语言:javascript
复制
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)似乎表明

代码语言:javascript
复制
nvcc -gencode arch=compute_13,code=sm_13 ...

对于计算能力1.3或更高的所有设备都足够。事实并非如此,这很容易证明。如果您使用上述格式编译代码,并试图在cc 2.0设备上运行它,它将失败,导致与代码中的任何内核或内核相关联的“无效设备函数”错误。

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

代码语言:javascript
复制
nvcc -arch=sm_13 ...

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26232500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档