Я все еще не уверен, как правильно указать архитектуры для генерации кода при создании с помощью nvcc. Я знаю, что есть машинный код, а также код PTX, встроенный в мой двоичный файл, и что это можно контролировать с помощью переключателей контроллера -code
и -arch
(или комбинации обоих с использованием -gencode
).
Теперь, согласно this, кроме двух флагов компилятора, существуют также два способа указания архитектур: sm_XX
и compute_XX
, где compute_XX
относится к виртуальной и sm_XX
к реальной архитектуре. Флаг -arch
принимает только идентификаторы для виртуальных архитектур (например, compute_XX
), тогда как флаг -code
принимает как идентификаторы для реальных, так и для виртуальных архитектур.
В документации указано, что -arch
указывает виртуальные архитектуры, для которых скомпилированы входные файлы. Однако этот код PTX не компилируется автоматически в машинный код, но это скорее "шаг предварительной обработки".
Теперь -code
должен указать, какие архитектуры собираются и оптимизируются для кода PTX.
Однако неясно, какой PTX или двоичный код будет встроен в двоичный файл. Если я укажу, например, -arch=compute_30 -code=sm_52
, означает ли это, что мой код сначала будет скомпилирован для PTX уровня 3.0, из которого впоследствии будет создан машинный код для уровня элемента 5.2? И что будет внедрено?
Если я просто укажу -code=sm_52
, что произойдет? Будет введен только машинный код для V5.2, который был создан из кода V5.2 PTX? И какова будет разница с -code=compute_52
?