Я хочу, чтобы мой скомпилированный код CUDA работал на любом графическом процессоре Nvidia, поэтому я компилирую каждый файл .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 компилирует каждую из этих целей синхронно, что может занять довольно много времени. Есть ли способ разделить это на несколько процессорных ядер? Я использую систему сборки Make.
Я могу вручную создать файл .ptx или .cubin для каждой архитектуры в отдельном асинхронном вызове nvcc, легко используя разные цели Make для каждой архитектуры. Однако как мне объединить их в окончательный файл .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'
Во всех примерах, использующих ссылку на устройство, всегда используется только одна арка. Можно ли таким образом комбинировать архитектуры?