'nvidia-smi -L'和cuDeviceGetName()之间ID的不一致

时间:2014-09-30 14:24:57

标签: 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输出给出的ID时,设备已被倒置:GPU 0成为Quadro 2000,GPU 1成为Quadro K2000。

这是预期的行为还是错误?有没有人知道一个解决方法,让nvidia-smi获得GPU的“真实”ID?我可以使用UUID通过 nvmlDeviceGetUUID()获取正确的设备,但使用nvml API似乎有点过于复杂,无法实现我想要实现的目标。

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

我正在使用CUDA 6.5。

编辑:我看过nvidia-smi手册页(应该早点做过......)。它声明:

  

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

还在寻找一个kludge ......

3 个答案:

答案 0 :(得分:12)

预期的行为。

nvidia-smi以PCI顺序枚举。

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

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

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

答案 1 :(得分:11)

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

  

导出CUDA_DEVICE_ORDER = PCI_BUS_ID

答案 2 :(得分:2)

这是预期的行为。

nvidia-smi manpage说

  

驱动程序返回的自然枚举中GPU / Unit的从0开始的索引

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

我遇到了这个问题而且我编写的程序类似于nvidia-smi,但枚举设备的顺序与CUDA API一致。更远的文本参考程序

https://github.com/smilart/nvidia-cdl

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