CUDA: как использовать-arch и-code и SM vs COMPUTE
я все еще не уверен, как правильно указать архитектуры для генерации кода при построении с помощью nvcc. Я знаю, что есть машинный код, а также код PTX, встроенный в мой двоичный файл, и что это можно контролировать с помощью переключателей контроллера -code
и -arch
(или сочетание обоих с помощью -gencode
).
теперь, согласно этой помимо двух флагов компилятора существует также два способа указания архитектур:sm_XX
и compute_XX
, где compute_XX
относится к виртуальному и sm_XX
к реальной архитектуре. Флаг -arch
принимает только идентификаторы для виртуальных архитектур (например,compute_XX
), а -code
флаг принимает оба, идентификаторы для реальных и для виртуальных архитектур.
в документации указано, что -arch
указывает виртуальные архитектуры, для которых компилируются входные файлы. Однако этот код PTX не компилируется автоматически в машинный код, но это скорее " предварительная обработка шаг."
теперь -code
предполагается указать, для каких архитектур собирается и оптимизируется код PTX.
однако неясно, какой PTX или двоичный код будет встроен в двоичный файл. Если я укажу например -arch=compute_30 -code=sm_52
, означает ли это, что мой код сначала будет скомпилирован на уровень функций 3.0 PTX, из которого впоследствии будет создан машинный код для уровня функций 5.2? А что будет встроено?
если я просто указать -code=sm_52
что будет а потом? Только машинный код для V5.2 будет встроен, который был создан из V5.2 PTX код? И какая будет разница -code=compute_52
?
1 ответов
некоторые связанные вопросы/ответы здесь и здесь.
я все еще не уверен, как правильно указать архитектуры для генерации кода при построении с помощью nvcc.
полное описание несколько сложно, но предполагается, что будут относительно простые, легко запоминающиеся канонические обычаи. Скомпилируйте для архитектуры (как виртуальной, так и реальной), которая представляет графические процессоры, которые вы хотите настроить. Ля довольно простая форма:
-gencode arch=compute_XX,code=sm_XX
где XX-двухзначная вычислительная способность для GPU, на который вы хотите нацелиться. Если вы хотите нацелиться на несколько графических процессоров, просто повторите всю последовательность для каждой цели XX. Это примерно подход с примерами проектов технологии CUDA код. (Если вы хотите включить PTX в исполняемый файл, включите дополнительный -gencode
С code
параметр, указывающий ту же виртуальную архитектуру PTX, что и arch
опцион.)
еще одна довольно простая форма, при целеуказании только одного GPU, просто использовать:
-arch=sm_XX
С тем же описанием для XX. Эта форма будет включать как SASS, так и PTX для указанной архитектуры.
теперь, в соответствии с этим, помимо двух флагов компилятора есть также два способа указания архитектур: sm_XX и compute_XX, где compute_XX относится к виртуальной и sm_XX к реальной архитектуре. Только флаг-арка принимает идентификаторов виртуальных архитектур (таких как compute_XX), а -код флаг берет, идентификаторы для реальных и виртуальных архитектур.
это в основном правильно, когда 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
инструмент будет генерировать cc5.2-совместимый код SASS. - код SASS будет встроен в исполняемый файл.
- код PTX будет быть отвергнутым.
(я не уверен, почему вы бы на самом деле указать такую комбинацию, но это законно.)
если я просто укажу-code=sm_52, что произойдет тогда? Только машинный код для V5.2 будет встроен, который был создан из V5.2 PTX код? И в чем будет разница с-code=compute_52?
-code=sm_52
будет генерировать cc5.2 код SASS из промежуточного кода PTX. Код SASS будет встроен, PTX будет отброшенный. Обратите внимание, что указание этой опции само по себе в этой форме, без -arch
вариант, был бы незаконным. (1)
-code=compute_52
будет генерировать cc5.X PTX-код (только) и внедрить этот PTX в исполняемый / двоичный файл. Обратите внимание, что указание этой опции само по себе в этой форме, без -arch
вариант, был бы незаконным. (1)
на cuobjdump
может использоваться для определения того, какие компоненты точно находятся в данном двоичном файле.
(1) Когда нет -gencode
переключатель используется, а не -arch
переключатель используется, nvcc
предполагает значение по умолчанию -arch=sm_20
добавляется к вашей команде компиляции (это для CUDA 7.5, по умолчанию -arch
настройка может варьироваться в зависимости от версии CUDA). sm_20
это реальные архитектура, и это не является законным, чтобы указать реальные на когда поставляли.