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