Какова цель использования нескольких флагов "arch" в компиляторе Nvcc Nvidia?
недавно я понял, как NVCC компилирует код устройства CUDA для разных вычислительных архитектур.
из моего понимания, при использовании опции-gencode NVCC "arch" - это минимальная вычислительная архитектура, требуемая приложением программиста, а также минимальная вычислительная архитектура устройства, для которой компилятор JIT NVCC будет компилировать код PTX.
Я также понимаю, что параметр " код " - gencode является вычислительной архитектурой, которая NVCC полностью компилирует приложение для, так что никакая компиляция JIT не требуется.
после проверки различных файлов Makefile проекта 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.
мои вопросы: почему так много пар arch / code необходимо? Все ли значения "arch" используются в наверху?
в чем разница между этим и сказать:
-arch compute_20
-code sm_20
-code sm_21
выбирается ли самая ранняя виртуальная архитектура в полях "arch" автоматически или есть какое-то другое неясное поведение?
есть ли другие компиляции и поведение во время выполнения, о которых я должен знать?
Я прочитал руководство,http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-compilation и я все еще не понимаю, что происходит при компиляции или во время выполнения.
2 ответов
грубо говоря, поток компиляции кода выглядит так:
источник кода устройства CUDA C/C++ -- > PTX --> SASS
виртуальная архитектура (например,compute_20
, что указанный -arch compute...
) определяет, какой тип кода PTX будет сгенерирован. Дополнительные переключатели (например,-code sm_21
) определите, какой тип кода SASS будет сгенерирован. SASS - это фактически исполняемый объектный код для GPU (машинного языка). Исполняемый файл может содержать несколько версий SASS и / или PTX, и есть механизм загрузчика времени выполнения, который будет выбирать соответствующие версии на основе фактически используемого GPU.
как вы указываете, одной из удобных функций работы GPU является JIT-компиляция. JIT-компиляция будет выполняться драйвером GPU (не требует установки инструментария CUDA) в любое время, когда доступен подходящий код PTX, но подходящий код SASS отсутствует.
одно преимущество включения нескольких виртуальных архитектур (т. е. нескольких версий PTX), затем у вас есть исполняемая совместимость с более широким спектром целевых устройств GPU (хотя некоторые устройства могут запускать JIT-компиляцию для создания необходимого SASS).
одним из преимуществ включения нескольких "реальных целей GPU" (т. е. нескольких версий SASS) является то, что вы можете избежать шага JIT-компиляции, когда присутствует одно из этих целевых устройств.
если вы укажете плохой набор параметров, можно создать исполняемый файл, который не будет работать (правильно) на конкретном ГПУ.
одним из возможных недостатков указания многих из этих параметров является раздувание размера кода. Другим возможным недостатком является время компиляции, которое, как правило, будет больше по мере указания дополнительных параметров.
также можно создавать excutables, которые не содержат PTX, что может представлять интерес для тех, кто пытается скрыть свой IP.
создание PTX, подходящего для JIT, должно быть сделано указание виртуальной архитектуры на code
переключатель.
цель несколько -arch
флаги использовать __CUDA_ARCH__
макрос для условной компиляции (т. е. с помощью #ifdef
) по-разному оптимизированных путей кода.
смотрите здесь: http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#virtual-architecture-identification-macro