システム内の他の粒子によって加えられる粒子にかかる総力を計算するOpenCLカーネルと、粒子の位置/速度を統合する別のカーネルがあります。これらのカーネルを複数のGPUに並列化して、基本的に各GPUにある程度のパーティクルを割り当てたいと思います。ただし、このカーネルを複数回実行する必要があり、各GPUからの結果が相互に使用されます。それについてもう少し説明させてください。
GPU 0にパーティクル0があり、GPU 1にパーティクル1があるとします。パーティクル1にかかる力と同様に、パーティクル0にかかる力が変更され、それに応じてインテグレータによってそれらの位置と速度が変更されます。次に、これらの新しい位置を各GPUに配置する必要があり(両方のGPUは、パーティクル0とパーティクル1の両方がどこにあるかを知る必要があります)、これらの新しい位置を使用して、次のステップで各パーティクルにかかる力を計算します。積分器。その結果は力などの計算に使用されます。基本的に、力の計算が実行されるまでに、すべてのバッファーに同じ情報が含まれている必要があります。
したがって、問題は次のとおりです。各GPUに異なるバッファーがある場合、GPU間でバッファーを同期するための最良の方法は何ですか?最後の質問のように、並列処理を維持したい場合は、単一の共有バッファーを持つことはできません(ただし、共有バッファーを作成し、複数のGPUを維持する方法がある場合は、それで十分です)。各ステップで結果をコピーすると、GPU間でアルゴリズムを並列化する価値があるよりも速度が低下するのではないかと思います。
私はこのスレッドを見つけましたが、答えはあまり明確ではなく、すべてのGPUの単一のバッファーにのみ適用されました。具体的には、Nvidia GPU(より具体的には、Tesla M2090)について知りたいです。
編集:実際、Khronosフォーラムのこのスレッドによると、OpenCLワーキンググループの代表者は、共有コンテキスト上の単一のバッファーが実際に複数のGPUに分散され、それぞれがメモリ内に最新の情報を持っていることを確認すると述べています。ただし、NvidiaGPUではその動作は見られません。プログラムをバックグラウンドで実行しているときに使用するwatch -n .5 nvidia-smi
と、あるGPUのメモリ使用量がしばらく増加し、次に別のGPUのメモリ使用量が増加する間に減少します。これで私を正しい方向に向けることができる人はいますか?多分それは彼らの実装だけですか?