O programa CUDA ignora a variável CUDA_VISIBLE_DEVICES?

O programa CUDA ignora a variável CUDA_VISIBLE_DEVICES?

Estou usando CUDA 7.5 em uma máquina com Ubuntu Server 14.04 e 3 GPUs: 2x Tesla K20C e 1x GeForce GT 630. Tentei definir os CUDA_VISIBLE_DEVICESIDs correspondentes para que o código seja executado apenas em ambas as GPUs Tesla. Por algum motivo, o programa parece ignorar a variável e tenta executar o código em todas as 3 GPUs, o que resulta em um erro.

Até agora, tentei definir a variável /etc/environmente também no bash.bashrcarquivo (reinicializado posteriormente). Ao usar echo $CUDA_VISIBLE_DEVICES, os valores corretos são mostrados. Além disso, ao iniciar o programa remotamente do NSight via SSH com a variável de ambiente definida adequadamente, a execução funciona conforme o esperado e usa apenas as 2 GPUs Tesla. Mas quando inicio o programa localmente (via terminal ou via Gearman Worker a partir de uma interface web), a variável ambiental parece ser ignorada.

Como solução alternativa, estou usando setenv("CUDA_VISIBLE_DEVICES","0,2",1)dentro do código. Mas isso torna meu programa não portátil.

O que estou perdendo aqui? Obrigado!

Responder1

A depuração do pato de borracha realmente funciona.

Acontece que basta usar unsetenv antes de chamar cuInit ou cudaSetDevice, e o valor inicial da variável environmetal será ignorado.

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

informação relacionada