2012-01-09 30 views

risposta

9

Il modo canonico per selezionare un dispositivo nell'API runtime utilizza cudaSetDevice. Ciò configurerà il runtime per eseguire la creazione del contesto pigro sul dispositivo nominato. Prima di CUDA 4.0, questa chiamata non ha effettivamente stabilito un contesto, ha solo detto al runtime quale GPU provare e utilizzare. Dal momento che CUDA 4.0, questa chiamata stabilirà un contesto sulla GPU nominata al momento della chiamata. C'è anche cudaChooseDevice, che selezionerà tra i dispositivi disponibili per trovarne uno che corrisponda ai criteri forniti dal chiamante.

È possibile enumerare le GPU disponibili su un sistema con cudaGetDeviceCount e recuperare i relativi dettagli utilizzando cudaGetDeviceProperties. L'esempio di dispositivo SDKQuery mostra tutti i dettagli su come farlo.

Potrebbe essere necessario prestare attenzione, tuttavia, a come si selezionano le GPU in un sistema multi-GPU, a seconda della configurazione dell'host e del driver. Sia nel driver TCC Linux che Windows, esiste l'opzione per le GPU contrassegnate come "compute exculsive", il che significa che il driver limiterà ogni GPU a un contesto attivo alla volta, o al calcolo proibito, il che significa che nessun programma CUDA può stabilire un contesto su quel dispositivo. Se il codice tenta di stabilire un contesto su un dispositivo di calcolo vietato o su un dispositivo esclusivo di calcolo che è in uso, il risultato sarà un errore del dispositivo non valido. In un sistema GPU multiplo in cui la politica prevede l'uso dell'esclusiva di calcolo, l'approccio corretto non consiste nel provare e selezionare una particolare GPU, ma semplicemente nel consentire che lo stabilimento di un contesto pigro si verifichi implicitamente. Il driver selezionerà automaticamente una GPU libera per l'esecuzione del codice. Lo stato della modalità di calcolo di qualsiasi dispositivo può essere verificato leggendo il campo cudaDeviceProp.computeMode utilizzando la chiamata cudaGetDeviceProperties. Si noti che è possibile verificare GPU non disponibili o vietate e interrogare le loro proprietà, ma qualsiasi operazione che richiederebbe la creazione del contesto avrà esito negativo.

Vedere la documentazione di runtime API su tutti questi calls

+3

Un'altra soluzione è utilizzare la variabile di ambiente 'CUDA_VISIBLE_DEVICES'. (https://devblogs.nvidia.com/parallelforall/cuda-pro-tip-control-gpu-visibility-cuda_visible_devices/) – Soravux

1

È possibile impostare la variabile di ambiente CUDA_VISIBLE_DEVICES a un elenco separato da virgole di ID di dispositivo per rendere visibili solo i dispositivi a un'applicazione. Utilizzalo per mascherare i dispositivi o per modificare l'ordine di visibilità dei dispositivi in ​​modo che il runtime CUDA li enumeri in un ordine specifico.

Problemi correlati