如何简单将多个CUDA源文件合并为单个fatbinary文件
实现方案
你可以通过单次nvcc调用直接完成多源文件到含PTX的fatbin文件的编译,无需分步生成PTX再手动打包,命令如下:
# 单架构PTX打包示例 nvcc --fatbin -gencode arch=compute_80,code=compute_80 mysource1.cu mysource2.cu mysource3.cu -o mysources.fatbin
核心参数说明
--fatbin:指定输出格式为fatbin,支持直接传入多个CUDA源文件作为输入,nvcc会自动完成编译合并-gencode arch=compute_XX,code=compute_XX:这是保留PTX的关键配置,code=compute_XX要求nvcc将对应架构版本的PTX代码直接打包进fatbin,而非仅编译为特定硬件的二进制机器码
如果需要兼容多代NVIDIA显卡,可以添加多组-gencode参数,同时打包不同架构的二进制码和PTX:
# 多架构兼容示例 nvcc --fatbin \ -gencode arch=compute_70,code=sm_70 \ -gencode arch=compute_75,code=sm_75 \ -gencode arch=compute_80,code=sm_80 \ -gencode arch=compute_86,code=sm_86 \ -gencode arch=compute_90,code=compute_90 \ mysource1.cu mysource2.cu -o mysources.fatbin
上述命令生成的fatbin会包含sm70、sm75、sm80、sm86架构的设备二进制码,以及sm90版本的PTX,可支持更高架构显卡的JIT编译。
验证方法
执行编译后可以用cuobjdump工具确认PTX是否正常打包:
cuobjdump --dump-ptx mysources.fatbin
你之前使用--fatbin --device-link没有找到PTX的原因是--device-link会触发设备端链接流程,默认仅生成对应架构的可执行二进制码,不会保留PTX中间产物,去掉--device-link参数并添加上述-gencode配置即可正常输出包含PTX的fatbin。
内容的提问来源于stack exchange,提问作者brenocfg
相关产品推荐
相关产品推荐

