同一平台上多个CUDA架构的并行编译。 cu文件

时间:2018-06-29 00:21:11

标签: cuda

我希望已编译的CUDA代码可在任何Nvidia GPU上运行,因此我使用以下选项编译每个.cu文件:

-gencode arch=compute_20,code=sm_20
-gencode arch=compute_30,code=sm_30
-gencode arch=compute_32,code=sm_32
-gencode arch=compute_35,code=sm_35
-gencode arch=compute_50,code=sm_50
-gencode arch=compute_52,code=sm_52
-gencode arch=compute_53,code=sm_53
-gencode arch=compute_60,code=sm_60
-gencode arch=compute_61,code=sm_61
-gencode arch=compute_61,code=compute_61

(这使用的是CUDA 8.0,因此我还没有列出较新的体系结构。)

问题在于nvcc会同步编译每个目标,这可能需要很长时间。有没有办法将其拆分为多个CPU内核?我正在使用Make构建系统。

我可以为每个体系结构使用不同的Make目标轻松地在不同的异步nvcc调用中为每个体系结构手动创建.ptx或.cubin文件。但是,如何将它们组合成最终的.o文件,以与主机代码链接在一起?

此: https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#cuda-compilation-trajectory 似乎暗示我应该将多个.cubin文件合并到一个.fatbin文件中。但是,当我尝试这样做时,我得到了错误:

nvcc fatal   : A single input file is required for a non-link phase when an outputfile is specified

这可能吗?我想念什么? 谢谢!

编辑1: 以下达隆美答复。我试图做:

F:/SDKs/CUDASDK/9.2/bin/WIN64/bin/nvcc  -ccbin=C:/MVS14/VC/bin --machine=64 --ptxas-options=-v -D_DEBUG -D_CONSOLE -Xcompiler /EHsc,/MDd,-Od,-Z7,/W2,/RTCs,/RTCu,/we4390,/wd4251,/we4150,/we4715,/we4047,/we4028,/we4311,/we4552,/we4553,/we4804,/we4806,/we4172,/we4553,/we4700,/we4805,/we4743,/we4717,/we4551,/we4533,/we6281,/we4129,/we4309,/we4146,/we4133,/we4083,/we4477,/we4473,/FS,/J,/EHsc -I"F:/SDKs/CUDASDK/9.2/include"  -DWIN32 --device-c -cubin -gencode arch=compute_30,code=sm_30 -o ms_30.cubin ms.cu
F:/SDKs/CUDASDK/9.2/bin/WIN64/bin/nvcc  -ccbin=C:/MVS14/VC/bin --machine=64 --ptxas-options=-v -D_DEBUG -D_CONSOLE -Xcompiler /EHsc,/MDd,-Od,-Z7,/W2,/RTCs,/RTCu,/we4390,/wd4251,/we4150,/we4715,/we4047,/we4028,/we4311,/we4552,/we4553,/we4804,/we4806,/we4172,/we4553,/we4700,/we4805,/we4743,/we4717,/we4551,/we4533,/we6281,/we4129,/we4309,/we4146,/we4133,/we4083,/we4477,/we4473,/FS,/J,/EHsc -I"F:/SDKs/CUDASDK/9.2/include"  -DWIN32 --device-c -cubin -gencode arch=compute_35,code=sm_35 -o ms_35.cubin ms.cu

然后链接:

F:/SDKs/CUDASDK/9.2/bin/WIN64/bin/nvcc -o out.o -dlink ms_35.cubin ms_30.cubin -I"F:/SDKs/CUDASDK/9.2/include"

但是我得到了错误:

fatbinary fatal   : fatbinary elf mismatch: elf arch '35' does not match '30'

所有使用设备链接的示例始终仅使用一个拱。可以这样组合架构吗?

2 个答案:

答案 0 :(得分:2)

nvcc仅仅是向许多其他工具发出命令的前端。 如果将--dryrun标志添加到nvcc调用中,它将打印出您需要运行的确切命令以替换对nvcc的使用。

从那里可以轻松地将此命令列表转换为脚本或makefile

答案 1 :(得分:1)

工具链不支持此功能,您也不应该期望像nvcc那样能够手动完成此操作。

但是,您当然可以编写一些排序过程来编写脚本

  1. 对多个cubin文件执行代码的并行编译,每个目标架构对应一个
  2. 执行设备链接传递以将立方组合成单个elf负载
  3. 将最终可执行文件与设备链接阶段发出的结果目标文件链接

您可能需要启用单独的设备代码编译,因此可能还需要稍微重构代码。警告购买者之类的东西。