3

バックグラウンド:

一連のシンボルを処理する CUDA プログラムを作成しました。プログラムは、すべてのシーケンスが同じ長さであるという規定に従って、シンボルのすべてのシーケンスを並行して処理します。データをグループに分類しています。各グループは完全に同じ長さのシーケンスで構成されています。プログラムは一度に 1 つのグループを処理します。

質問:

4 つの GPU を搭載した Linux マシンでコードを実行しており、プログラムの 4 つのインスタンス (GPU ごとに 1 つ) を実行して 4 つの GPU すべてを利用したいと考えています。別の CUDA アプリケーションで使用されていない GPU をプログラムで選択して実行することは可能ですか? GPU の数が多い、または少ない別のハードウェアでプログラムを実行したときに、後で問題を引き起こす可能性のあるものをハードコーディングしたくありません。

4

2 に答える 2

0

巨大な (そして異なる) クラスターで実行される PIConGPU で使用する、より良い (より自動化された) 方法があります。ここで実装を参照してください: https://github.com/ComputationalRadiationPhysics/picongpu/blob/909b55ee24a7dcfae8824a22b25c5aef6bd098de/src/libPMacc/include/Environment.hpp#L169

基本的に: cudaGetDeviceCountGPU の数を取得するために呼び出し、それらを反復処理し、cudaSetDeviceこれを現在のデバイスとして設定するために呼び出し、それが機能するかどうかを確認します。このチェックには、setDevice を成功させた CUDA のバグが原因で、ストリームのテスト作成が含まれる可能性がありますが、デバイスが実際に使用されていたため、その後の呼び出しはすべて失敗しました。注: GPU を排他モードに設定して、GPU を 1 つのプロセスでのみ使用できるようにする必要がある場合があります。1 つの「バッチ」の十分なデータがない場合は、反対の方法が必要になる場合があります。複数のプロセスが 1 つの GPU に作業を送信します。したがって、必要に応じて調整してください。

その他のアイデアは次のとおりです。 GPU と同じランクあたりのプロセス数で MPI アプリケーションを開始し、ローカル ランク番号と同じデバイス番号を使用します。これは、配布するデータセットが異なるアプリケーションの場合にも役立ちます。したがって、たとえば、MPI ランク 0 で length1-data を処理し、MPI ランク 1 で length2-data を処理することができます。

于 2016-10-07T09:18:11.187 に答える