CUDA プログラムは CUDA_VISIBLE_DEVICES 変数を無視しますか?

CUDA プログラムは CUDA_VISIBLE_DEVICES 変数を無視しますか?

私は、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/environmentbash.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;
}

関連情報