CUDA如何为GPU分配设备ID?

时间:2012-12-08 20:42:14

标签: 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时会发生什么。

4 个答案:

答案 0 :(得分:25)

将环境变量CUDA_DEVICE_ORDER设置为:

export CUDA_DEVICE_ORDER=PCI_BUS_ID

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

答案 1 :(得分: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.

或CUDA驱动程序API cuDeviceGetByPCIBusId cuDeviceGetPCIBusId

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

答案 2 :(得分:3)

CUDA Support/Choosing a GPU建议

  

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

此外,No GPU selected, code working properly, how's this possible?的讨论表明,CUDA一般不会将“最佳”卡映射到设备0。

修改

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

答案 3 :(得分:0)

我发现的最佳解决方案(在Collection中进行了测试)是在可能导入tensorflow==2.3.0的所有内容之前添加以下内容:

tensorflow