如何将 GPU 关联到每个 CPU



我有一个问题:

假设我的系统中有 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 上的tasksetnumactl或在 Windows 上SetProcessAffinityMask为您的进程设置 CPU 关联。

进程具有对 GPU 的独占访问权限

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

最新更新