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

тогда да, это означает, что:

  1. временный код PTX будет сгенерирован из вашего исходного кода, и он будет использовать cc3.0 PTX.
  2. из этого PTX,ptxas инструмент будет генерировать cc5.2-совместимый код SASS.
  3. код SASS будет встроен в исполняемый файл.
  4. код 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 это реальные архитектура, и это не является законным, чтобы указать реальные на когда поставляли.