PGI openACC: целевое устройство GPU
У меня есть две карты NVIDIA:
$ ls /dev/nv*
/dev/nvidia0 /dev/nvidia1 /dev/nvidiactl /dev/nvidia-uvm
используя pgcc, как мне выбрать конкретную карту? Как убедиться, что код сгенерирован для nvidia0 (устройство =0) или nvidia1 (устройство =1)?
Спасибо заранее за вашу помощь.
2 ответа
Процедура OpenACC API для целевого устройства:
acc_set_device_num( i, acc_device_nvidia );
Если вы вызываете это один раз, в начале вашей программы, с i
установите порядковый номер устройства, которое вы хотите использовать, затем вы можете настроить это устройство программно.
Однако, в зависимости от вашего варианта использования, вам может оказаться проще просто написать свой код без таких процедур API, а вместо этого использовать CUDA_VISIBLE_DEVICES
переменная окружения. Например, вы можете сделать:
CUDA_VISIBLE_DEVICES="0" ./my_app
запустить ваш код на устройстве 0, или
CUDA_VISIBLE_DEVICES="1" ./my_app
запустить тот же код на устройстве 1.
Чтобы убедиться, что код генерируется для определенного типа устройства, вы должны добавить вычислительные возможности этого устройства к -ta
переключиться во время компиляции, например:
pgcc -ta=tesla:cc30 ...
будет генерировать код для устройства cc3.0. Если вы используете справку командной строки для pgcc
:
pgcc -help
в нем будут перечислены другие поддерживаемые параметры для этого. Например, мой pgcc (15.7) показывает:
...
-ta=tesla:{cc20|cc30|cc35|cc50|cuda6.5|cuda7.0|fastmath|[no]flushz|[no]fma|keepbin|keepgpu|keepptx|[no]lineinfo|[no]llvm|loadcache:{L1|L2}|maxregcount:<n>|pin|[no]rdc|[no]unroll|beta}|nvidia|radeon:{keep|[no]llvm|[no]unroll|tahiti|capeverde|spectre|buffercount:<n>}|host
Choose target accelerator
tesla Select NVIDIA Tesla accelerator target
cc20 Compile for compute capability 2.0
cc30 Compile for compute capability 3.0
cc35 Compile for compute capability 3.5
cc50 Compile for compute capability 5.0
...
Также есть переменная среды OpenACC "ACC_DEVICE_NUM", которую можно использовать для установки номера используемого устройства.