【问题标题】:Does 'code=sm_X' embed only binary (cubin) code, or also PTX code, or both?'code=sm_X' 是否仅嵌入二进制(立方)代码,或 PTX 代码,或两者兼而有之?
【发布时间】:2014-12-01 16:09:18
【问题描述】:

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

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

-gencode arch=compute_13,code=sm_13

嵌入到库中?

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

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

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

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

【问题讨论】:

    标签: cuda nvcc


    【解决方案1】:

    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 版本的代码,从而产生建议的前向兼容性。

    【讨论】:

    • 感谢简洁明了的答案,解决了我大脑中的所有问号:-)
    • gencode 每个交换机只允许一个虚拟架构,但您可以像这样指定多个目标:nvcc -gencode=arch=compute_13,code=compute_13,sm_13
    猜你喜欢
    • 2010-12-24
    • 2011-04-21
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 2011-06-17
    • 2015-10-14
    • 2017-12-28
    • 1970-01-01
    相关资源
    最近更新 更多