我想在父进程中调用cudaGetDeviceCount(&N)
,然后创建N
子进程,每个找到的GPU都创建一个子进程,并将唯一的GPU号(通过命令行)传递给每个进程,以便有效地,将有一个(并且只有一个)进程来处理每个GPU。我计划在每个进程中调用cudaSetDevice(i)
,并从命令行收到i
。
但是,我对此感到怀疑一个进程中的GPU#3可能是另一进程中的GPU#4,而后一个进程中的GPU#3与前一个进程中的GPU#1完全不同,等等。
您知道GPU编号在整个系统中是否一致?还是每个进程通常都会收到自己的GPU排列?
答案 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);