マルチ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実行可能ファイルを実行するときにコマンドラインからこれを管理するにはどうすればよいですか?
この問題は、シェル内で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