Подтвердить что ты не робот

Какова цель использования нескольких флагов "arch" в компиляторе Nvidia NVCC?

Недавно я узнал, как NVCC компилирует код устройства CUDA для разных вычислительных архитектур.

С моей точки зрения, при использовании опции NVCC -gencode "arch" - это минимальная вычислительная архитектура, требуемая программным приложением, а также минимальная вычислительная архитектура устройства, которую компилятор NVCC JIT будет компилировать для кода PTX.

Я также понимаю, что параметр "code" -gencode - это вычислительная архитектура, которую NVCC полностью компилирует для приложения, так что компиляция JIT не нужна.

После проверки различных проектов Make файлов CUDA я заметил, что регулярно происходят следующие события:

-gencode arch=compute_20,code=sm_20
-gencode arch=compute_20,code=sm_21
-gencode arch=compute_21,code=sm_21

и после некоторого чтения я обнаружил, что несколько архитектур устройств могут быть скомпилированы в одном бинарном файле - в этом случае sm_20, sm_21.

Мои вопросы: почему так много пар arc/code необходимо? Используются ли все значения "арки" в приведенном выше?

в чем разница между этим и сказать:

-arch compute_20
-code sm_20
-code sm_21

Является ли самая ранняя виртуальная архитектура в полях "арка" выбрана автоматически или есть какое-то другое неясное поведение?

Есть ли другая компиляция и поведение во время выполнения, о которых я должен знать?

Я прочитал руководство, http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-compilation, и я все еще не понимаю, что происходит при компиляции или времени выполнения.

Приветствия,

Джеймс.

4b9b3361

Ответ 1

Грубо говоря, поток компиляции кода выглядит следующим образом:

Источник кода устройства CUDA C/С++ → PTX → SASS

Виртуальная архитектура (например, compute_20, независимо от того, что указано -arch compute...) определяет, какой тип кода PTX будет сгенерирован. Дополнительные переключатели (например, -code sm_21) определяют, какой тип кода SASS будет сгенерирован. SASS - фактически исполняемый объектный код для графического процессора (машинный язык). Исполняемый файл может содержать несколько версий SASS и/или PTX, и есть механизм загрузчика времени выполнения, который будет выбирать соответствующие версии на основе используемого GPU.

Как вы отмечаете, одной из удобных функций GPU является JIT-компиляция. JIT-компиляция будет выполняться драйвером GPU (не требуется набор инструментов CUDA для установки) в любое время, когда имеется подходящий код PTX, но подходящий код SASS отсутствует.

Одно из преимуществ включения нескольких виртуальных архитектур (т.е. нескольких версий PTX) заключается в том, что у вас есть совместимость с более разнообразными целевыми устройствами GPU (хотя некоторые устройства могут запускать JIT-компиляцию для создания необходимого SASS).

Одно из преимуществ включения нескольких "реальных целевых графических процессоров" (т.е. нескольких версий SASS) заключается в том, что вы можете избежать шага JIT-компиляции, когда присутствует одно из этих целевых устройств.

Если вы укажете плохой набор параметров, возможно создать исполняемый файл, который не будет работать (правильно) на определенном графическом процессоре.

Одним из возможных недостатков определения множества этих опций является раздувание размера кода. Другим возможным недостатком является время компиляции, которое обычно будет больше, поскольку вы укажете больше параметров.

Также возможно создать excutables, которые не содержат PTX, которые могут представлять интерес для тех, кто пытается скрыть свой IP-адрес.

Создание PTX, подходящего для JIT, должно выполняться указанием виртуальной архитектуры для переключателя code.