CUDA-Programm ignoriert die Variable CUDA_VISIBLE_DEVICES?

CUDA-Programm ignoriert die Variable CUDA_VISIBLE_DEVICES?

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_DEVICESentsprechenden 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/environmentund auch in der bash.bashrcDatei festzulegen (danach neu gestartet). Bei Verwendung echo $CUDA_VISIBLE_DEVICESwerden 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;
}

verwandte Informationen