PGI openACC:目标特定的gpu设备

时间:2015-10-13 00:57:09

标签: cuda nvidia openacc pgi pgi-accelerator

我有两张NVIDIA卡:

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

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

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

还有OpenACC环境变量“ACC_DEVICE_NUM”,可用于设置要使用的设备号。

答案 1 :(得分:2)

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
...