PGI openACC:目标特定的 GPU 设备

PGI openACC: target specific gpu device

我有两张NVIDIA显卡:

$ ls /dev/nv*
/dev/nvidia0  /dev/nvidia1  /dev/nvidiactl  /dev/nvidia-uvm

使用 pgcc,我如何定位特定的卡?我如何确保代码是为 nvidia0 (device=0) 或 nvidia1 (device=1) 生成的?

预先感谢您的帮助。

target a particular device 的 OpenACC API 例程是:

acc_set_device_num( i, acc_device_nvidia );

如果您在程序开始时调用一次,将 i 设置为您希望使用的设备序号,那么您可以通过编程方式定位该设备。

但是,根据您的用例,您可能会发现不使用此类 API 例程编写代码更容易,而是使用 CUDA_VISIBLE_DEVICES environment variable。例如,您可以这样做:

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" 可用于设置要使用的设备编号。