Ich verwende CUDA 7.5 auf einer Maschine mit Ubuntu Server 14.04 und 3 GPUs: 2x Tesla K20C und 1x GeForce GT 630. Ich habe versucht, die CUDA_VISIBLE_DEVICES
entsprechenden IDs einzustellen, damit der Code nur auf beiden Tesla-GPUs läuft. Aus irgendeinem Grund scheint das Programm die Variable zu ignorieren und versucht, den Code auf allen 3 GPUs auszuführen, was zu einem Fehler führt.
Bisher habe ich versucht, die Variable in /etc/environment
und auch in der bash.bashrc
Datei festzulegen (danach neu gestartet). Bei Verwendung echo $CUDA_VISIBLE_DEVICES
werden die richtigen Werte angezeigt. Auch wenn ich das Programm remote von NSight über SSH mit der entsprechend festgelegten Umgebungsvariable starte, funktioniert die Ausführung wie vorgesehen und verwendet nur die 2 Tesla-GPUs. Aber wenn ich das Programm lokal starte (über Terminal oder über Gearman Worker von einer Weboberfläche aus), scheint die Umgebungsvariable ignoriert zu werden.
Als Workaround verwende ich setenv("CUDA_VISIBLE_DEVICES","0,2",1)
innerhalb des Codes. Dadurch ist mein Programm jedoch nicht mehr portierbar.
Was übersehe ich hier? Danke!
Antwort1
Das Rubber-Duck-Debugging funktioniert wirklich.
Es stellt sich heraus, dass es ausreicht, unsetenv zu verwenden, bevor cuInit oder cudaSetDevice aufgerufen wird, und der Anfangswert der Umgebungsvariable wird ignoriert.
#include <stdio.h>
#include <stdlib.h>
#include <cuda.h>
int
main(int argc, char **argv, char **env)
{
int x;
unsetenv("CUDA_VISIBLE_DEVICES");
cuInit(0);
// Now we see all the devices on machine
cuDeviceGetCount(&x);
printf("%d\n",x);
return 0;
}