cudaSetDevice()编号在各个进程之间是否一致?

时间:2019-08-25 07:17:07

标签: c api cuda multiprocessing gpgpu

我想在父进程中调用cudaGetDeviceCount(&N),然后创建N子进程,每个找到的GPU都创建一个子进程,并将唯一的GPU号(通过命令行)传递给每个进程,以便有效地,将有一个(并且只有一个)进程来处理每个GPU。我计划在每个进程中调用cudaSetDevice(i),并从命令行收到i

但是,我对此感到怀疑一个进程中的GPU#3可能是另一进程中的GPU#4,而后一个进程中的GPU#3与前一个进程中的GPU#1完全不同,等等。

您知道GPU编号在整个系统中是否一致?还是每个进程通常都会收到自己的GPU排列?

1 个答案:

答案 0 :(得分:2)

修改

编号是一致的。我引用@Robert Crovella

  

顺序在各个流程之间是一致的,并且在运行时是一致的   跑步。无论您选择默认的CUDA,此语句都是正确的   编号或基于PCI的排序。运行运行语句为   只要您不切换CUDA版本,就可以更新系统   BIOS,更改操作系统,更改硬件配置   系统(例如添加/删除设备),或从默认更改为PCI   订购。它还假定您不对   CUDA_VISIBLE_DEVICES环境变量。


Device Enumeration and Properties,具有一个名为CUDA_DEVICE_ORDER的变量,具有两个可能的值FASTEST_FIRST和PCI_BUS_ID。

文档说,FASTEST_FIRST使CUDA使用简单的启发式方法猜测哪个设备最快,并将该设备设置为0,而未指定其余设备的顺序。 PCI_BUS_ID按PCI总线ID升序对设备进行排序。

默认情况下,此环境变量设置为“ FASTEST_FIRST”。因此,如果您的设备碰巧具有不同的速度,则与PCI_BUS_ID相比,它可能会为设备生成不同的ID。

您可以通过以下方式设置CUDA_DEVICE_ORDER:

export CUDA_DEVICE_ORDER=PCI_BUS_ID

此ID将是唯一的。

或者在主机代码中找到deviceId:

int dev = 0;
cudaError_t errCode = cudaDeviceGetByPCIBusId(&dev, "somebusId");
cudaSetDevice(dev);