Ответ 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
.