NVIDIA NVCC и CUDA: кубин против PTX - PullRequest
12 голосов
/ 08 октября 2011

Я использую CUDA 4.0 arch. С устройством Compute_Capability 2.0 (GTX460). В чем разница между файлами 'cubin' и 'ptx'? Я думаю, что cubin - это нативный код для GPU, так что это arch. специфический, и ptx - это промежуточный язык, который работает на устройствах Fermi (например, Geforce GTX 460) посредством JIT-компиляции. Когда я компилирую исходный код, я могу выбирать между целями ptx или cubin. Если я хочу файл кубина, я выбираю "code = sm_20". Но если я хочу файл ptx, я использую "code = compute_20". Это правильно?

1 Ответ

17 голосов
/ 10 октября 2011

Вы перепутали параметры для выбора фазы компиляции (-ptx и -cubin) с параметрами для управления целевыми устройствами (-code), поэтому вам следует вернуться к документации.

NVCC - драйвер компилятора NVIDIA. Параметры -ptx и -cubin используются для выбора определенных фаз компиляции, по умолчанию без каких-либо специфических для фазы параметров nvcc будет пытаться создать исполняемый файл из входных данных. Большинство людей используют опцию -c, чтобы nvcc создавал объектный файл, который впоследствии будет связан с исполняемым файлом компоновщика платформы по умолчанию, опции -ptx и -cubin действительно очень полезны, если вы используете Driver API , Для получения дополнительной информации о промежуточных этапах обратитесь к руководству nvcc, которое устанавливается при установке CUDA Toolkit .

  • Выходные данные -ptx представляют собой текстовый файл PTX. PTX - это язык промежуточной ассемблера для графических процессоров NVIDIA, который еще не был полностью оптимизирован и впоследствии будет собран для кода, специфичного для устройства (например, разные устройства имеют различное число регистров, поэтому полная оптимизация PTX будет неправильной).
  • Выходные данные -cubin представляют собой толстый двоичный файл, который может содержать одно или несколько двоичных изображений для конкретного устройства, а также (необязательно) PTX.

Аргумент -code, на который вы ссылаетесь, имеет совершенно другую цель. Я бы посоветовал вам ознакомиться с документацией по nvcc, которая содержит несколько примеров, в общем, я бы посоветовал использовать вместо этого параметр -gencode, поскольку он обеспечивает больший контроль и позволяет ориентироваться на несколько устройств в одном двоичном файле. В качестве быстрого примера:

  • -gencode arch=compute_xx,code=\'compute_xx,sm_yy,sm_zz\' заставляет nvcc нацеливаться на все устройства с вычислительной способностью xx (это бит arch=) и вставлять PTX (code=compute_xx), а также двоичные файлы, специфичные для устройств для sm_yy и sm_zz, в окончательный толстый двоичный файл.
...