nvcc: получение вычислительных возможностей устройства во время выполнения

У меня есть приложение, которое использует графический процессор и работает на разных машинах. В настоящее время я вручную указываю NVCC параметры -arch=compute_xx -code=sm_xx в соответствии с моделью графического процессора, установленной на машине, на которой я работаю.

Я хочу написать автоматизацию, которая сможет извлекать эти значения из хост-машины, чтобы мне не нужно было указывать их вручную. Есть ли способ сделать это действительно автоматически?


person SomethingSomething    schedule 16.01.2018    source источник
comment
Вы можете скомпилировать код для каждого графического процессора, на котором вы будете работать, в один исполняемый файл. не вижу для этого случая применения   -  person talonmies    schedule 16.01.2018
comment
Это докер, который создается автоматически каждый раз на другой машине. Это вариант использования. И в настоящее время мне приходится каждый раз указывать эти значения вручную, после проверки какой-то таблицы в википедии   -  person SomethingSomething    schedule 16.01.2018
comment
Нет, ты не понимаешь. Вы можете указать каждую архитектуру сразу, и тогда это не имеет значения.   -  person talonmies    schedule 16.01.2018
comment
В противном случае запустите nvidia-smi, grep и создайте таблицу где-нибудь   -  person Regis Portalez    schedule 16.01.2018
comment
ой :) :) Я этого не знал. Я сначала не понял, что вы имеете в виду, что я могу построить их все сразу   -  person SomethingSomething    schedule 16.01.2018
comment
@talonmies, может быть случай использования, когда вам нужны совершенно разные ядра / последовательность вызовов ядра в зависимости от вычислительных возможностей. Получение этой информации во время выполнения имеет приложения.   -  person Florent DUGUET    schedule 17.01.2018
comment
@FlorentDUGUET: Действительно, и именно для этого предназначены API-интерфейс драйвера PTX JIT и средства связывания во время выполнения. Но вопрос не в этом.   -  person talonmies    schedule 17.01.2018


Ответы (1)


С помощью API среды выполнения C++ CUDA вы можете сделать следующее, чтобы найти основную и дополнительную версии вычислительных возможностей CUDA:

cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, dev);
std::printf("%d.%d\n", deviceProp.major, deviceProp.minor);

Это напечатает, например, «6.1» на карте Pascal.

Если у вас есть демонстрационный пакет CUDA в вашей установке, в каталоге extras/demo_suite исполняемый файл deviceQuery использует этот API для получения версии вычислительных возможностей:

$ /path/to/cuda/extras/demo_suite/deviceQuery | grep 'CUDA Capability'
  CUDA Capability Major/Minor version number:    6.1
  CUDA Capability Major/Minor version number:    6.1

Однако при создании программ CUDA, предназначенных для работы на нескольких возможных графических процессорах, лучший способ справиться с этим — создать код PTX/двоичного устройства для каждой архитектуры/вычислительных возможностей, которые вы хотите, например:

nvcc x.cu \
    --generate-code arch=compute_50,code=sm_50 \
    --generate-code arch=compute_50,code=sm_52 \
    --generate-code arch=compute_53,code=sm_53

Это подробно описано в документах NVCC. Также обратите внимание, что добавление записи с code=compute_XX, а также code=sm_XX будет включать в себя переносимый код PTX для кода устройства в вашей программе и позволит JIT-компиляцию и поддержку новых архитектур, которые вы явно не включили в свою компиляцию. Вы можете обнаружить, что все, что вам нужно, это что-то вроде -arch=compute_50 -code=compute_50 для работы со всеми картами Maxwell и новее, но не обязательно лучший код для некоторых новых графических процессоров.

person Candy Gumdrop    schedule 16.01.2018
comment
Вы говорите, что я действительно могу указать несколько архитектур для nvcc? - person SomethingSomething; 16.01.2018
comment
@SomethingSomething Да. Запускается / JIT-компилируется только соответствующий код для вашего текущего графического процессора. Код встроен в ваш двоичный файл для всех указанных вами архитектур. - person Candy Gumdrop; 16.01.2018
comment
@SomethingSomething: Да. Как и я. Дважды - person talonmies; 16.01.2018
comment
Но кто-то другой объяснил. - person Regis Portalez; 17.01.2018