【发布时间】:2016-10-12 02:00:08
【问题描述】:
来自question 众所周知,PTX 可以跨各种架构移植。我相信这允许迁移例如:sm_20 到 sm_30。我有一个从 sm_20 到 sm_10 的特殊用例。那么是否可以为 sm_10 目标生成诸如 cubin 之类的二进制文件,并为 sm_20 目标编译 PTX。
【问题讨论】:
来自question 众所周知,PTX 可以跨各种架构移植。我相信这允许迁移例如:sm_20 到 sm_30。我有一个从 sm_20 到 sm_10 的特殊用例。那么是否可以为 sm_10 目标生成诸如 cubin 之类的二进制文件,并为 sm_20 目标编译 PTX。
【问题讨论】:
PTX 在针对特定架构编译时向前兼容(即,使用sm_* 标志),但它不向后兼容。克服这个问题的一种方法是指定一个特定的虚拟架构,然后为您想要定位的所有真实架构生成二进制图像。例如,
nvcc -arch=compute_20 -code=sm_20,sm_30,sm_35
为计算 2.0 虚拟架构生成 PTX,并为 2.0、3.0 和 3.5 设备生成二进制映像。请注意,从 CUDA 7.0 开始不推荐使用计算 1.0。这被称为fat binary 方法。
请参阅code generation options,了解真实架构和虚拟架构之间的区别。
编辑:实际上,指定-arch=compute_35 和-code=sm_35 有点多余,因为JIT 编译器会干预并为您构建它。只要你不介意在你的 fat 二进制文件中有一点额外的脂肪,那么我想这并不重要。
EDIT2:code 必须大于或等于 arch,因为 PTX 不向后兼容。感谢 Robert Crovella 指出了这个愚蠢的错误。
【讨论】: