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

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

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

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

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

-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 compute_20 -code sm_20 -code sm_21 

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

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

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

Ура,

Джеймс.

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

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

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

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

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

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

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

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

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

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

Назначение нескольких флагов -arch заключается в использовании макроса __CUDA_ARCH__ для условной компиляции (т. __CUDA_ARCH__ использованием __CUDA_ARCH__ ) для разных оптимизированных путей кода.

См. Здесь: http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#virtual-architecture-identification-macro

Давайте будем гением компьютера.