首页 文章

CUDA如何为GPU分配设备ID?

提问于
浏览
21

当计算机具有多个支持CUDA的GPU时,每个GPU都会分配一个 device ID . 默认情况下,CUDA内核在 device ID 0 上执行 . 您可以使用 cudaSetDevice(int device) 选择其他设备 .

假设我的机器中有两个GPU:GTX 480和GTX 670. How does CUDA decide which GPU is device ID 0 and which GPU is device ID 1?


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

  • 计算能力的降序

  • PCI插槽号

  • 设备添加到系统的日期/时间(刚刚添加到计算机的设备ID更高)


Motivation :我'm working on some HPC algorithms, and I'm对多个GPU进行基准测试并自动调整它们 . 我的处理器有足够的PCIe通道,可以在全带宽下将cudaMemcpys驱动到3个GPU . 因此,我不希望不断地将GPU交换进机器,而是希望能够预测当我在计算机中添加或更换某些GPU时会发生什么 .

3 回答

  • 3

    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 执行CUDA设备和pciBusId .

  • 17

    将环境变量 CUDA_DEVICE_ORDER 设置为:

    export CUDA_DEVICE_ORDER=PCI_BUS_ID
    

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

  • 18

    CUDA Support/Choosing a GPU暗示了这一点

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

    此外,No GPU selected, code working properly, how's this possible?的讨论表明,CUDA通常不会将"best"卡映射到设备0 .

    EDIT

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

相关问题