CUDA如何为GPU分配设备ID?

sol*_*les 27 cuda gpu gpgpu nvidia

当计算机具有多个支持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.因此,我不打算不断地将GPU交换进机器,而是计划在计算机中保留3个GPU.我希望能够预测当我在计算机中添加或更换某些GPU时会发生什么.

Lia*_*iao 28

将环境变量设置CUDA_DEVICE_ORDER为:

export CUDA_DEVICE_ORDER=PCI_BUS_ID
Run Code Online (Sandbox Code Playgroud)

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

  • 使用此设置,CUDA设备ID与`nvidia-smi`的输出一致!IMO这是多机器上机器学习的必备设置. (4认同)

Prz*_*ych 18

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.
Run Code Online (Sandbox Code Playgroud)

或CUDA驱动程序API cuDeviceGetByPCIBusId cuDeviceGetPCIBusId.

但是,IMO是最可靠的方式来了解哪个设备是使用NVMLnvidia-smi来获取每个设备的唯一标识符(UUID)nvmlDeviceGetUUID,然后匹配它使用pciBusId进行CUDA设备nvmlDeviceGetPciInfo.

  • "速度最快"是指时钟速度吗? (4认同)
  • 一些启发式方法用于估计GPU的理论速度.它们考虑了例如芯片架构,时钟速度,驱动器模型(在Windows TCC上提供). (2认同)
  • 只有索引为0的GPU才是最快的.其余索引不按速度排序.GTX 9800的索引是否为0?如果没有,那么一切都按预期工作. (2认同)

Tho*_*tto 9

我发现(在 中测试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
Run Code Online (Sandbox Code Playgroud)

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


Jac*_*ern 5

CUDA支持/选择GPU建议

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

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

编辑

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

  • 我同意。我曾遇到过机器有现代 GTX6xx Kepler 和古老的 G80,而设备 0 是 G80 的情况。相反的情况也发生在我身上。“PCIe 插槽顺序”的解释听起来很合理。除了尝试为兼容 PCIe_3 的 GPU 保留 PCIe_3 插槽之外,我并没有太注意我使用的 PCIe 插槽顺序。 (2认同)