O programa CUDA ignora a variável CUDA_VISIBLE_DEVICES?

0

Estou usando o CUDA 7.5 em uma máquina com o Ubuntu Server 14.04 e 3 GPUs: 2x Tesla K20C e 1x GeForce GT 630. Eu tentei definir o CUDA_VISIBLE_DEVICES para os IDs correspondentes para que o código seja executado somente 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 em /etc/environment e também no arquivo bash.bashrc (reinicializado posteriormente). Ao usar echo $CUDA_VISIBLE_DEVICES , os valores corretos são mostrados. Além disso, ao iniciar o programa remotamente a partir do NSight via SSH com a variável de ambiente definida de acordo, a execução funciona como planejado e usa apenas as GPUs de 2 Tesla. Mas quando estou iniciando 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) no código. Mas isso torna meu programa não portátil.

O que estou perdendo aqui? Obrigado!

    
por Dominic 29.01.2016 / 14:41

1 resposta

0

Depuração de patos de borracha realmente funciona.

Acontece que é suficiente 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;
}
    
por 29.01.2016 / 14:47