Cuda '之间的ID不一致;英伟达smi-L';和cuDeviceGetName()

Cuda '之间的ID不一致;英伟达smi-L';和cuDeviceGetName(),cuda,Cuda,我在shell中运行此命令并获得: C:\Users\me>nvidia-smi -L GPU 0: Quadro K2000 (UUID: GPU-b1ac50d1-019c-58e1-3598-4877fddd3f17) GPU 1: Quadro 2000 (UUID: GPU-1f22a253-c329-dfb7-0db4-e005efb6a4c7) 但在我的代码中,当我运行cuDeviceGetName(..,ID)时,其中ID是nvidia smi输出给定的I

我在shell中运行此命令并获得:

C:\Users\me>nvidia-smi -L    
GPU 0: Quadro K2000 (UUID: GPU-b1ac50d1-019c-58e1-3598-4877fddd3f17)    
GPU 1: Quadro 2000 (UUID: GPU-1f22a253-c329-dfb7-0db4-e005efb6a4c7)
但在我的代码中,当我运行cuDeviceGetName(..,ID)时,其中ID是nvidia smi输出给定的ID,设备已反转:GPU 0变为Quadro 2000,GPU 1变为Quadro K2000

这是预期的行为还是错误?有人知道一个解决办法,使nvidia smi获得“真实”的GPU ID吗?我可以使用UUID通过nvmlDeviceGetUUID()获得合适的设备,但是使用nvml API对于我试图实现的目标来说似乎有点太复杂了

问题:讨论CUDA如何在没有明确结论的情况下为设备分配ID

我正在使用CUDA 6.5

编辑:我已经看了nvidia smi手册页(应该早点看…)。它说:

“建议希望一致性的用户使用UUDI或PCI总线ID,因为设备枚举顺序不保证一致”


仍在寻找混乱…

这是预期的行为

nvidia smi
按PCI顺序枚举

默认情况下,CUDA驱动程序和运行时API不支持

您链接的问题清楚地显示了如何关联两个编号/排序方案


无法使nvidia smi修改其订购方案,以匹配CUDA运行时或驱动程序API生成的任何内容。但是,您可以通过在CUDA 8中使用来修改CUDA运行时枚举顺序。

这是预期的行为

nvidia smi主页上说

驱动程序返回的自然枚举中GPU/单元的基于0的索引

CUDA API根据“编程指南”3.2.6.1设备枚举按计算能力的降序进行枚举

我有这个问题,我写了一个程序是模拟nvidia smi,但与枚举设备的顺序与CUDA API一致。在程序的文本ref中进一步


我之所以编写该程序,是因为nvidia smi无法按照与CUDA API一致的顺序枚举设备。

您可以在shell中为CUDA环境设置设备顺序,以遵循总线ID,而不是默认的最快卡。需要CUDA 7及以上

export CUDA_DEVICE_ORDER=PCI_BUS_ID

即使文档中也说明它是按pciBusId排序的,但我怀疑这是否是唯一的标准,因为在我的机器上,2x特斯拉K80在同一个pciBusId上。我想知道这两个婴儿的正确顺序是什么。“2x特斯拉K80在同一个pciBusid上”是不可能的。仔细查看您的设备查询输出好的,同一个pciBusId上可能有多张卡(由报告),只能由pciDeviceID进行区分。例如,Tensorflow打印:第一张卡:pciBusID:0000:00:04.0第二张卡:pciBusID:0000:00:05.0但是,这两张卡都有相同的总线id。“0000:00:05.0”由“[domain]:[bus]:[device]。[function]”(请参阅)此处使用的PCI_bus_id令牌指的是PCI设备计数的完整BDF格式。从这个意义上讲,两个单独的GPU设备不能具有相同的完整BDF,环境变量中使用的令牌将按照已排序的BDF顺序对设备进行一致的排序。我明白了,谢谢您的解释。已经认为当有多种格式时,仅“pciBusId”就有点误导。因此,很高兴知道是总线:Device.Function(BDF)符号用于订购设备。