¿El programa CUDA ignora la variable CUDA_VISIBLE_DEVICES?

¿El programa CUDA ignora la variable CUDA_VISIBLE_DEVICES?

Estoy usando CUDA 7.5 en una máquina con Ubuntu Server 14.04 y 3 GPU: 2x Tesla K20C y 1x GeForce GT 630. Intenté configurar los CUDA_VISIBLE_DEVICESID correspondientes para que el código solo se ejecute en ambas GPU Tesla. Por alguna razón, el programa parece ignorar la variable e intenta ejecutar el código en las 3 GPU, lo que genera un error.

Hasta ahora, he intentado configurar la variable en /etc/environmenty también en el bash.bashrcarchivo (luego reinicié). Al utilizar echo $CUDA_VISIBLE_DEVICES, se muestran los valores correctos. Además, al iniciar el programa de forma remota desde NSight a través de SSH con la variable de entorno configurada en consecuencia, la ejecución funciona según lo previsto y solo utiliza las 2 GPU Tesla. Pero cuando inicio el programa localmente (a través de una terminal o mediante el trabajador Gearman desde una interfaz web), la variable ambiental parece ignorarse.

Como solución alternativa, estoy usando setenv("CUDA_VISIBLE_DEVICES","0,2",1)dentro del código. Pero eso hace que mi programa no sea portátil.

¿Que me estoy perdiendo aqui? ¡Gracias!

Respuesta1

La depuración con pato de goma realmente funciona.

Resulta que es suficiente usar unsetenv antes de llamar a cuInit o cudaSetDevice, y se ignorará el valor inicial de la variable ambiental.

#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;
}

información relacionada