1

我有两张 NVIDIA 卡:

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

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

预先感谢您的帮助。

4

2 回答 2

3

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

于 2015-10-14T19:27:16.100 回答
3

针对特定设备的 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
...
于 2015-10-13T02:04:29.540 回答