如何将GPU与每个CPU关联

时间:2017-11-20 17:21:24

标签: cuda gpu nvidia

我有一个问题:

假设我的系统中有2个GPU:我有2个运行cuda代码的主机进程。我怎么能确定每个都采用GPU?

我正在考虑设置exclusive_thread,但我无法理解如何利用它:一旦我检查设备是免费的,我怎么能确定它在我做cudaSetDevice之前一直是免费的?

编辑:

到目前为止,我已经尝试过这个:

int devN = 0; 
while (cudaSuccess != cudaSetDevice(devN))devN = (devN + 1) % 2; 

但是我得到了

CUDA Runtime API error 77: an illegal memory access was encountered.

这并不奇怪,因为我处于EXCLUSIVE_PROCESS模式。

1 个答案:

答案 0 :(得分:2)

这个问题中的两个要素。将流程分配给GPU并确保GPU可用于单个流程。

将流程分配给GPU

使用CUDA_VISIBLE_DEVICES环境变量有一种简单的方法可以实现此目的:首先使用CUDA_VISIBLE_DEVICES=0进行处理,然后使用CUDA_VISIBLE_DEVICES=1启动第二个进程。每个进程都会看到一个GPU,设备索引为0,并且会看到不同的GPU。

运行nvidia-smi topo -m将显示GPU拓扑并为您提供相应的CPU亲和力。

然后,您可以在Linux上使用tasksetnumactl或在Windows上使用SetProcessAffinityMask为您的流程设置CPU亲和力。

进程具有对GPU

的独占访问权限

要确保没有其他进程可以访问您的GPU,请将GPU驱动程序配置为独占进程:nvidia-smi --compute-mode=1