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 的全局内存