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