Параллельная компиляция нескольких архитектур CUDA на одной и той же. Cu файл - PullRequest
0 голосов
/ 29 июня 2018

Я хочу, чтобы мой скомпилированный код 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'

Во всех примерах, использующих ссылку на устройство, всегда используется только одна арка. Можно ли таким образом комбинировать архитектуры?

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

nvcc - это просто интерфейс, выдающий команды ряду других инструментов. Если вы добавите флаг --dryrun к вашему вызову nvcc, он напечатает точные команды, которые вам нужно выполнить, чтобы заменить использование nvcc.

Оттуда должно быть легко преобразовать этот список команд в скрипт или make-файл

0 голосов
/ 29 июня 2018

Цепочка инструментов не поддерживает это, и вы не должны ожидать, что сможете сделать это вручную, как это делает nvcc.

Однако вы, безусловно, можете написать какой-нибудь процесс сортировки для

  1. Выполнить параллельную компиляцию кода для нескольких кубин-файлов, по одному для каждой целевой архитектуры
  2. Выполните проход связи устройства, чтобы объединить кубины в одну полезную нагрузку эльфа
  3. Свяжите конечный исполняемый файл с результирующим объектным файлом, выданным на этапе соединения устройства

Возможно, вам потребуется включить отдельную компиляцию кода устройства, и в результате вам, возможно, также понадобится немного реорганизовать код. Будьте бдительны и все такое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...