Программа CUDA игнорирует переменную CUDA_VISIBLE_DEVICES?

Программа CUDA игнорирует переменную CUDA_VISIBLE_DEVICES?

Я использую CUDA 7.5 на машине с Ubuntu Server 14.04 и 3 GPU: 2x Tesla K20C и 1x GeForce GT 630. Я попытался установить CUDA_VISIBLE_DEVICESсоответствующие идентификаторы, чтобы код запускался только на обоих GPU Tesla. По какой-то причине программа, похоже, игнорирует переменную и пытается запустить код на всех 3 GPU, что приводит к ошибке.

До сих пор я пытался установить переменную в /etc/environmentи также в bash.bashrcфайле (после перезагрузки). При использовании echo $CUDA_VISIBLE_DEVICESотображаются правильные значения. Кроме того, при запуске программы удаленно из NSight через SSH с соответствующим образом установленной переменной окружения выполнение работает так, как и предполагалось, и использует только 2 графических процессора Tesla. Но когда я запускаю программу локально (через терминал или через Gearman worker из веб-интерфейса), переменная окружения, похоже, игнорируется.

В качестве обходного пути я использую setenv("CUDA_VISIBLE_DEVICES","0,2",1)в коде. Но это делает мою программу непереносимой.

Что я тут упускаю? Спасибо!

решение1

Метод отладки с помощью резиновой уточки действительно работает.

Оказывается, достаточно использовать unsetenv перед вызовом cuInit или cudaSetDevice, и начальное значение переменной 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;
}

Связанный контент