34

当一台计算机有多个支持 CUDA 的 GPU 时,每个 GPU 都被分配一个device ID. 默认情况下,CUDA 内核在device ID 0. 您可以使用cudaSetDevice(int device)来选择不同的设备。

假设我的机器中有两个 GPU:一个 GTX 480 和一个 GTX 670。CUDA如何确定哪个 GPU 是device ID 0哪个 GPU 是device ID 1


关于 CUDA 如何分配设备 ID 的想法(只是头脑风暴):

  • 计算能力降序
  • PCI 插槽号
  • 设备添加到系统的日期/时间(刚刚添加到计算机的设备的 ID 号较高)

动机:我正在研究一些 HPC 算法,我正在为几个 GPU 进行基准测试和自动调整。我的处理器有足够的 PCIe 通道以全带宽将 cudaMemcpys 驱动到 3 个 GPU。因此,我打算在我的计算机中只保留 3 个 GPU,而不是不断地在我的机器中进出 GPU。我希望能够预测当我在计算机中添加或更换一些 GPU 时会发生什么。

4

4 回答 4

39

将环境变量设置CUDA_DEVICE_ORDER为:

export CUDA_DEVICE_ORDER=PCI_BUS_ID

然后 GPU ID 将按 pci 总线 ID 排序。

于 2017-03-31T02:47:25.027 回答
23

CUDA 选择最快的设备作为设备 0。因此,当您交换 GPU 时,顺序可能会完全改变。使用以下方法根据 PCI 总线 ID 选择 GPU 可能会更好:

cudaError_t cudaDeviceGetByPCIBusId ( int* device, char* pciBusId )
   Returns a handle to a compute device.

cudaError_t cudaDeviceGetPCIBusId ( char* pciBusId, int  len, int  device )
   Returns a PCI Bus Id string for the device.

或 CUDA 驱动程序 API cuDeviceGetByPCIBusId cuDeviceGetPCIBusId

但是 IMO 知道哪个设备是哪个设备的最可靠方法是使用NVMLnvidia-smi来获取每个设备的唯一标识符 (UUID) 使用nvmlDeviceGetUUID,然后使用 CUDA 设备与 pciBusId 匹配nvmlDeviceGetPciInfo

于 2012-12-09T08:21:08.967 回答
5

CUDA 支持/选择GPU建议

在具有多个 GPU 的机器上运行 CUDA 程序时,默认情况下,CUDA 内核将在主显卡插槽中安装的任何 GPU 上执行。

另外,没有选择 GPU 的讨论,代码工作正常,这怎么可能?建议 CUDA 通常不会将“最佳”卡映射到设备 0。

编辑

今天我安装了一台带有用于计算的 Tesla C2050 卡和用于可视化的 8084 GS 卡的 PC,在前两个 PCI-E 插槽之间切换它们的位置。我使用了 deviceQuery 并注意到 GPU0始终位于第一个 PCI 插槽中,而 GPU1始终位于第二个 PCI 插槽中。我不知道这是否是一般性陈述,但它证明了我的系统 GPU 的编号不是根据其“功率”,而是根据其位置。

于 2013-09-09T10:36:54.857 回答
2

我发现(在 中测试tensorflow==2.3.0)的最佳解决方案是在可能导入的任何内容之前添加以下内容tensorflow

import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]="0,3"  # specify which GPU(s) to be used

这样,TensorFlow 对 GPU 的排序顺序将与nvidia-smi或等工具报告的顺序相同nvtop

于 2020-09-22T11:18:26.697 回答