私は、Ubuntu Server 14.04 と 3 つの GPU (2 つの Tesla K20C と 1 つの GeForce GT 630) を搭載したマシンで CUDA 7.5 を使用しています。CUDA_VISIBLE_DEVICES
コードが両方の Tesla GPU でのみ実行されるように、対応する ID を設定しようとしました。何らかの理由で、プログラムは変数を無視し、3 つの GPU すべてでコードを実行しようとするため、エラーが発生します。
これまで、変数を/etc/environment
とbash.bashrc
ファイル (後で再起動) に設定しようとしました。 を使用するとecho $CUDA_VISIBLE_DEVICES
、正しい値が表示されます。また、環境変数を適切に設定して NSight から SSH 経由でリモートでプログラムを起動すると、実行は意図したとおりに機能し、2 つの Tesla GPU のみが使用されます。ただし、プログラムをローカルで起動すると (ターミナル経由、または Web インターフェイスから Gearman ワーカー経由)、環境変数は無視されるようです。
回避策として、setenv("CUDA_VISIBLE_DEVICES","0,2",1)
コード内で を使用しています。しかし、そうするとプログラムの移植性が失われます。
ここで何が欠けているのでしょうか? ありがとうございます!
答え1
ラバーダックデバッグは本当に効果があります。
cuInit または cudaSetDevice を呼び出す前に unsetenv を使用するだけで十分であることが判明し、環境変数の初期値は無視されます。
#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;
}