cudaSetDevice() 编号是不是跨进程一致?

Posted

技术标签:

【中文标题】cudaSetDevice() 编号是不是跨进程一致?【英文标题】:Is cudaSetDevice() numbering consistent across processes?cudaSetDevice() 编号是否跨进程一致? 【发布时间】:2019-12-29 19:48:15 【问题描述】:

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

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

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

【问题讨论】:

他们在同一台机器上吗? @Oblivion,当然,这些进程在同一台机器上。只是有多个 GPU。这是亚马逊的p3.16xlarge 实例。 相关:How does CUDA assign device IDs to GPUs? @RobertCrovella 你介意我编辑你对我的答案的评论,或者你给出一个答案然后我删除我的吗? @RobertCrovella 谢谢。完成 【参考方案1】:

编辑

编号一致。我引用@Robert Crovella

顺序跨进程一致,运行时一致 跑步。无论您选择默认的 CUDA,此说法都是正确的 编号,或基于 PCI 的排序。运行语句是 true 只要你不切换 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);

【讨论】:

@Shadow 我的意思是,如果我要求设备 ID 0,我总是会在同一个插槽上安装同一个设备。如果 Id 是基于最快的设备生成的,我不确定该 Id 是否会从运行变为运行。我过去有问题 @Shadow 对我来说碰巧最旧的设备被选为设备 0。我自己不会依赖 FASTEST_FIRST。在我找到一些文档之前,我仍然不确定。 @Shadow 感谢罗伯特,我们对这个问题进行了澄清。您可以检查编辑。 如果识别出可重现的场景,表明从运行到运行的设备顺序不一致,如讨论的那样,则可能是 CUDA 中的错误。 @RobertCrovella 我相信我的观察属于您解释的一种情况。驱动程序版本有更新。这完美地解释了。

以上是关于cudaSetDevice() 编号是不是跨进程一致?的主要内容,如果未能解决你的问题,请参考以下文章

cudaSetDevice() 分配超过 580 MB 的全局内存

等效于 cudaSetDevice 的 CUDA 驱动程序 API

Cuda learn record two

python-协程一(常识)

Windows 中跨进程的共享内存是不是一致?

iCore3 双核心板_FPGA例程一:认识FPGA