Подтвердить что ты не робот

NVIDIA NVCC и CUDA: Cubin против PTX

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

4b9b3361

Ответ 1

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

NVCC - это драйвер компилятора NVIDIA. Параметры -ptx и -cubin используются для выбора определенных фаз компиляции по умолчанию без каких-либо фазовых опций. Nvcc попытается создать исполняемый файл из входов. Большинство людей используют параметр -c, чтобы заставить nvcc создать объектный файл, который позже будет связан с исполняемым файлом компоновщиком платформы по умолчанию, опции -ptx и -cubin действительно полезны, если вы используете 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 в конечный жирный бинарный файл.