首页 > 解决方案 > cudaSetDevice() 编号是否跨进程一致?

问题描述

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

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

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

标签: capicudamultiprocessinggpgpu

解决方案


编辑

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

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


设备枚举和属性,有一个名为 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);

推荐阅读