c - cudaSetDevice() 编号是否跨进程一致?
问题描述
我想调用cudaGetDeviceCount(&N)
一个父进程,然后创建N
子进程,每个找到的 GPU 一个,并向每个进程(通过命令行)传递一个唯一的 GPU 编号,以便有效地有一个(并且只有一个)进程处理每个显卡。我计划cudaSetDevice(i)
在每个进程中调用,并i
从命令行接收。
但是,我怀疑一个进程中的 GPU #3 可能是另一个进程中的 GPU #4,而后一个进程中的 GPU #3 与前一个进程中的 GPU #1 完全不同,等等。
你知道GPU编号在整个系统内是否一致吗?还是每个进程通常都会收到自己的 GPU 排列?
解决方案
编辑
编号是一致的。我引用@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);
推荐阅读
- angular - 可视化或以图形表示我的应用程序中的路线?
- powershell - 仅 PowerShell Get-Childitem 顶级文件夹
- python - 循环遍历 pandas 数据框,将收件人和数据框插入 Outlook 电子邮件
- reactjs - 提前输入,反应表带
- continuous-integration - 从 Build Defintion X 获取最新工件并使用它来生成新工件
- symfony - 为什么在 symfony 中使用 liip 想象包无法显示带有 volley 的上传图像?
- angular - 角 | 导航时将参数传递给多个组件
- sql-server - SSRS 报告转移到不同的服务器
- php - 如何为我的图片上传器创建一个唯一的文件名?
- symfony - Symfony 4 学说,如果没有检测到更改,是否有办法执行命令“doctrine:migrations:diff”而不会出错?