我有一个问题:
假设我的系统中有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模式。
答案 0 :(得分:2)
这个问题中的两个要素。将流程分配给GPU并确保GPU可用于单个流程。
使用CUDA_VISIBLE_DEVICES环境变量有一种简单的方法可以实现此目的:首先使用CUDA_VISIBLE_DEVICES=0
进行处理,然后使用CUDA_VISIBLE_DEVICES=1
启动第二个进程。每个进程都会看到一个GPU,设备索引为0,并且会看到不同的GPU。
运行nvidia-smi topo -m
将显示GPU拓扑并为您提供相应的CPU亲和力。
然后,您可以在Linux上使用taskset
或numactl
或在Windows上使用SetProcessAffinityMask
为您的流程设置CPU亲和力。
要确保没有其他进程可以访问您的GPU,请将GPU驱动程序配置为独占进程:nvidia-smi --compute-mode=1
。