Я использую 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;
}