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_DEVICES
IDs 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/environment
e também no bash.bashrc
arquivo (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;
}