gpt4 book ai didi

cuda - 'code=sm_X' 是否仅嵌入二进制(cubin)代码,或 PTX 代码,或两者?

转载 作者:行者123 更新时间:2023-12-01 12:39:35 32 4
gpt4 key购买 nike

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

一个例子:NVCC 编译器选项有什么作用

-gencode arch=compute_13,code=sm_13

嵌入库中?

只有机器代码(cubin 代码)用于 CC 1.3 的 GPU,或者还有用于 CC 1.3 的 GPU 的 PTX 代码?

在“Maxwell 兼容性指南”中,声明“只有由‘code=’子句指定的后端目标版本将保留在生成的二进制文件中”。

据此,我可以推断给定的编译器选项仅嵌入用于 GPU 的机器代码与 CC 1.3 和没有 PTX 代码。这意味着它不可能运行这个库,例如在 Maxwell 生成卡上,因为库中没有嵌入 PTX 代码,机器代码可以从中“即时”(JIT) 编译。

另一方面,在 NVIDIA 的 GTC 2013 演示文稿“CUDA 工具包作为应用程序构建工具的介绍”中指出,“-gencode arch=compute_13,code=sm_13”对于所有具有 CC 的 GPU 就足够了>= 1.3,并且对于 CC > 1.3 的 GPU,使用此编译器选项,机器代码是从 PTX 代码进行 JIT 编译的。因此,在我看来,Maxwell 兼容性指南中提供的信息和这个 GTC 演示文稿是相互矛盾的。

最佳答案

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 版本,从而实现所建议的那种前向兼容性。

关于cuda - 'code=sm_X' 是否仅嵌入二进制(cubin)代码,或 PTX 代码,或两者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26232500/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com