web-dev-qa-db-ja.com

ジョブを実行するGPUを選択するにはどうすればよいですか?

マルチGPUコンピューターで、CUDAジョブを実行するGPUを指定するにはどうすればよいですか?

例として、CUDAをインストールするときに、NVIDIA_CUDA-<#.#>_Samplesをインストールすることを選択し、nbodyシミュレーションのいくつかのインスタンスを実行しましたが、それらはすべて1つのGPU 0で実行されました。 GPU 1は完全にアイドル状態でした(watch -n 1 nvidia-dmiを使用して監視)。 CUDA_VISIBLE_DEVICESを使用して確認しています

echo $CUDA_VISIBLE_DEVICES

これは設定されていません。を使用して設定してみました

CUDA_VISIBLE_DEVICES=1

次にnbodyを再度実行しますが、GPU 0にも行きました。

関連する質問、 CUDAプログラムを実行するために指定されたGPUを選択する方法 を調べましたが、deviceQueryコマンドはCUDA 8.0 binディレクトリにありません。 $CUDA_VISIBLE_DEVICES$に加えて、他の投稿が環境変数$CUDA_DEVICESを参照しているのを見ましたが、これらは設定されておらず、使用方法に関する情報が見つかりませんでした。

私の質問とは直接関係ありませんが、nbody -device=1を使用すると、アプリケーションをGPU 1で実行できましたが、nbody -numdevices=2を使用してもGPU 0と1の両方で実行できませんでした。

CentOS 6.8でbashシェルを使用し、CUDA 8.0、2 GTX 1080 GPU、およびNVIDIAドライバー367.44を使用して実行しているシステムでこれをテストしています。

CUDAを使用して作成する場合、使用するCUDAリソースを管理および制御できますが、コンパイル済みのCUDA実行可能ファイルを実行するときにコマンドラインからこれを管理するにはどうすればよいですか?

38

この問題は、シェル内でCUDA_VISIBLE_DEVICES変数を正しく設定していないことが原因でした。

たとえば、CUDAデバイス1を指定するには、次を使用してCUDA_VISIBLE_DEVICESを設定します。

export CUDA_VISIBLE_DEVICES=1

または

CUDA_VISIBLE_DEVICES=1 ./cuda_executable

前者は現在のシェルの存続期間に対して変数を設定し、後者はその特定の実行可能呼び出しの存続期間に対してのみ設定します。

複数のデバイスを指定する場合は、使用します

export CUDA_VISIBLE_DEVICES=0,1

または

CUDA_VISIBLE_DEVICES=0,1 ./cuda_executable
68