CUDA 프로그램이 CUDA_VISIBLE_DEVICES 변수를 무시합니까?

CUDA 프로그램이 CUDA_VISIBLE_DEVICES 변수를 무시합니까?

CUDA_VISIBLE_DEVICES저는 Ubuntu Server 14.04 및 GPU 3개(Tesla K20C 2개 및 GeForce GT 630 1개)가 설치된 시스템에서 CUDA 7.5를 사용하고 있습니다 . 코드가 두 Tesla GPU에서만 실행되도록 해당 ID를 설정하려고 했습니다 . 어떤 이유에서인지 프로그램은 변수를 무시하고 3개의 GPU 모두에서 코드를 실행하려고 시도하며 이로 인해 오류가 발생합니다.

/etc/environment지금까지 파일 내부 와 파일에서도 변수를 설정하려고 했습니다 bash.bashrc(나중에 재부팅했습니다). 를 사용하면 echo $CUDA_VISIBLE_DEVICES올바른 값이 표시됩니다. 또한 그에 따라 환경 변수가 설정된 SSH를 통해 NSight에서 원격으로 프로그램을 시작하면 실행이 의도한 대로 작동하고 2개의 Tesla GPU만 사용합니다. 하지만 로컬에서(터미널을 통해 또는 웹 인터페이스의 Gearman 작업자를 통해) 프로그램을 시작하면 환경 변수가 무시되는 것 같습니다.

setenv("CUDA_VISIBLE_DEVICES","0,2",1)해결 방법으로 코드 내에서 사용하고 있습니다 . 하지만 이로 인해 내 프로그램은 이식성이 없게 됩니다.

내가 여기서 무엇을 놓치고 있는 걸까요? 감사해요!

답변1

고무 오리 디버깅이 정말 효과적입니다.

cuInit 또는 cudaSetDevice를 호출하기 전에 unsetenv를 사용하는 것으로 충분하며, Environmetal 변수의 초기 값은 무시됩니다.

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

관련 정보