2014-09-30 3 views
8

Io corro questo comando in un guscio e ottenere:Incoerenza degli ID tra 'nvidia-smi -L' e cuDeviceGetName()

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) 

Ma nel mio codice, quando corro cuDeviceGetName (.. , ID) dove ID è l'ID fornito dall'uscita nvidia-smi, i dispositivi sono stati invertiti: GPU 0 diventa Quadro 2000 e GPU 1 diventa Quadro K2000.

È un comportamento previsto o un bug? Qualcuno sa una soluzione alternativa per far sì che nvidia-smi ottenga l'ID "reale" delle GPU? Potrei usare l'UUID per ottenere il dispositivo corretto con nvmlDeviceGetUUID() ma usare l'API nvml sembra un po 'troppo complicato per quello che sto cercando di ottenere.

This domanda discutere come Čuda assegnare ID ai dispositivi senza chiara conclusione.

Sto usando CUDA 6.5.

EDIT: Ho dato un'occhiata alla manpage di nvidia-smi (avrei dovuto farlo prima ...). Essa afferma:

"Si raccomanda che gli utenti desiderano consistencyuse sia UUDI o bus PCI ID, dal momento che l'enumerazione dispositivo ordinamento non è garantito per essere coerenti"

Stai ancora cercando un kludge ...

risposta

9

È un comportamento previsto.

nvidia-smi enumera nell'ordine PCI.

Per impostazione predefinita, il driver CUDA e le API di runtime no.

La domanda che hai collegato mostra chiaramente come associare i due schemi di numerazione/ordine.

Non v'è alcun modo per provocare nvidia-smi di modificare il suo schema di ordinamento per abbinare tutto ciò sarà generato dal runtime o del driver API CUDA. Tuttavia è possibile modificare l'ordine di enumerazione del runtime CUDA mediante l'uso di uno environment variable in CUDA 8.

+0

Comunque Anche la documentazione precisa inoltre che si ordina da pciBusId, dubito che sia l'unico criterio da quando sulla mia macchina 2x Tesla K80 sono sullo stesso pciBusId. Mi chiedo quale non sia l'ordine corretto per quei due bambini. –

+0

"2x Tesla K80 sono sullo stesso pciBusid" non possibile. Dai un'occhiata al tuo dispositivoQuery output –

+0

Beh, ci possono essere diverse carte sullo stesso pciBusId (segnalato da http://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__DEVICE.html#group__CUDART__DEVICE_1g1bf9d625a931d657e08db2b4391170f0), solo differenziabili da pciDeviceID. Tensorflow per esempio stampe: Prima carta: pciBusID: 0000: 00: 04.0 seconda carta: pciBusID: 0000: 00: 05.0 Tuttavia, entrambi hanno lo stesso ID bus. "0000: 00: 05.0" è creato da "[dominio]: [bus]: [dispositivo]. [Funzione]" (vedere http://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__DEVICE. html # group__CUDART__DEVICE_1gea264dad3d8c4898e0b82213c0253def) –

2

È il comportamento previsto.

nvidia-smi man dice che

indice 0-based GPU/dell'Unità nell'enumerazione naturale restituita dal driver,

CUDA API enumera in ordine di capacità di elaborazione decrescente secondo "Guida alla programmazione" 3.2.6.1 Elenco dei dispositivi.

Ho avuto questo problema e ho scritto un programma è analogico di nvidia-smi, ma con dispositivi elencati in un ordine coerente con CUDA API. Più in là nel ref di testo sul programma

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

Ho scritto il programma perché nvidia-smi non può enumerati dispositivo in un ordine coerente con CUDA API.

2

È possibile impostare l'ordine del dispositivo per l'ambiente CUDA nella propria shell per seguire l'ID del bus anziché il valore predefinito della scheda più veloce. Richiede CUDA 7 e versioni successive.

export CUDA_DEVICE_ORDER = PCI_BUS_ID