Некоторые связанные вопросы / ответы: здесь и здесь.
Я до сих пор не уверен, как правильно указать архитектуры для генерации кода при сборке с помощью nvcc.
Полное описание несколько сложно, но предполагаются относительно простые, легко запоминающиеся канонические употребления. Скомпилируйте для архитектуры (как виртуальной, так и реальной), которая представляет графические процессоры, на которые вы хотите ориентироваться. Достаточно простая форма:
-gencode arch=compute_XX,code=sm_XX
где XX - это двузначная вычислительная мощность графического процессора, на который вы хотите ориентироваться. Если вы хотите настроить таргетинг на несколько графических процессоров, просто повторите всю последовательность для каждой цели XX. Это примерно тот же подход, который используется в проектах примеров кода CUDA. (Если вы хотите включить PTX в свой исполняемый файл, включите дополнительный -gencode
с параметром code
, указав ту же виртуальную архитектуру PTX, что и параметр arch
).
Еще одна довольно простая форма, нацеленная только на один графический процессор, - это просто использовать:
-arch=sm_XX
с таким же описанием для XX. Эта форма будет включать как SASS, так и PTX для указанной архитектуры.
Теперь, согласно этому, помимо двух флагов компилятора, есть также два способа указания архитектур: sm_XX и compute_XX, где compute_XX относится к виртуальной, а sm_XX - к реальной архитектуре. Флаг -arch принимает только идентификаторы для виртуальных архитектур (например, compute_XX), тогда как флаг -code принимает и идентификаторы для реальной, и для виртуальной архитектуры.
Это в основном правильно, когда arch
и code
используются в качестве суб-переключателей в -gencode
переключателе или если оба используются вместе, как вы описываете автономно. Но, например, когда -arch
используется сам по себе (без -code
), он представляет собой другой вид «сокращенной» записи, и в этом случае вы можете передать реальную архитектуру, например -arch=sm_52
Однако неясно, какой PTX или двоичный код будет встроен в двоичный файл. Если я укажу, например, -arch = compute_30 -code = sm_52, означает ли это, что мой код сначала будет скомпилирован до уровня функций 3.0 PTX, из которого впоследствии будет создан машинный код для уровня функций 5.2? А что будет встроено?
Точное определение того, что внедряется, зависит от формы использования. Но для этого примера:
-gencode arch=compute_30,code=sm_52
или для аналогичного случая, который вы укажете:
-arch=compute_30 -code=sm_52
тогда да, это значит, что:
- Временный код PTX будет сгенерирован из вашего исходного кода, и он будет использовать cc3.0 PTX.
- Из этого PTX инструмент
ptxas
сгенерирует код SASS, совместимый с cc5.2.
- Код SASS будет встроен в ваш исполняемый файл.
- Код PTX будет удален.
(Я не уверен, почему вы на самом деле указали такую комбинацию, но это законно.)
Если я просто укажу -code = sm_52, что тогда будет? Будет встроен только машинный код для V5.2, созданный из кода PTX V5.2? И в чем будет разница для -code = compute_52?
-code=sm_52
будет генерировать код SASS cc5.2 из промежуточного кода PTX. Код SASS будет встроен, PTX будет удален. Обратите внимание, что указание этой опции отдельно в этой форме, без опции -arch
, было бы незаконным. (1)
-code=compute_52
сгенерирует код PTX cc5.x (только) и встроит этот PTX в исполняемый / двоичный файл. Обратите внимание, что указание этой опции отдельно в этой форме, без опции -arch
, было бы незаконным. (1)
cuobjdump
инструмент можно использовать для определения того, какие именно компоненты находятся в заданном двоичном формате.
(1) Когда не используется переключатель -gencode
и не используется переключатель -arch
, nvcc
предполагает, что к вашей команде компиляции добавлено значение по умолчанию -arch=sm_20
(это для CUDA 7.5, настройка -arch
по умолчанию может отличаться в зависимости от версии CUDA). sm_20
- это настоящая архитектура, и недопустимо указывать настоящую архитектуру для параметра -arch
, если также указан параметр -code
.
person
Robert Crovella
schedule
26.02.2016