将CUDA PTX编译为旧目标的二进制文件



根据问题已知PTX在各种体系结构之间是可移植的。我相信这允许迁移,例如:sm_20到sm_30。我有一个从sm_20到sm_10的特殊用例。因此,用为sm_20目标编译的PTX为sm_10目标生成诸如cubin之类的二进制文件是可能的。

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已被弃用。这就是所谓的胖二元方法。

有关真实体系结构和虚拟体系结构之间的区别,请参阅代码生成选项。


EDIT:实际上,指定-arch=compute_35-code=sm_35有点多余,因为JIT编译器会介入并为您构建它。只要你不介意你的脂肪二元中有一点多余的脂肪,那么我想这并不重要。

EDIT2:code必须大于或等于arch,因为PTX不向后兼容。感谢Robert Crovella指出了那个愚蠢的错误。

相关内容

最新更新