現在、MPI 並列化を使用して C で記述されたプログラムを使用しています。計算グリッドは、一般的なドメイン分割手法を使用して分割されます。プロセスのレイアウトは、2D 分解 (簡略化) に関して次のとおりです。
/////////////////////////////
/ / / /
/ 1 / 2 / 3 /
/ / / /
/////////////////////////////
/ / / /
/ 4 / 5 / 6 /
/ / / /
/////////////////////////////
/ / / /
/ 7 / 8 / 9 /
/ / / /
/////////////////////////////
コードのある時点で、X 依存のみを持つ一連の方程式を解かなければなりません。現在の形式のトポロジでは、x 依存関係のために一度に 3 つのプロセスでしか並列化できません。これが私の質問につながります...現在のトポロジを別のトポロジにマップする便利で効率的な方法はありますかコード内で、完全な並列化、つまり 9 つのプロセスすべてを使用することを好むのはどれですか? たとえば、次のようなものです。
/////////////////////////////
/ 1 /
/////////////////////////////
/ 2 /
/////////////////////////////
/ 3 /
/////////////////////////////
/ 4 /
/////////////////////////////
/ 5 /
/////////////////////////////
/ 6 /
/////////////////////////////
/ 7 /
/////////////////////////////
/ 8 /
/////////////////////////////
/ 9 /
/////////////////////////////
なぜこれから始めないのかと尋ねる人がいるかもしれません.2Dドメイン分解は全体的な問題に対してはるかに効率的です.さらに、トポロジーで同様のことを行う必要があるy依存関係もあります.したがって、上の画像は次のようになります.転置。
したがって、9 つのプロセスで完全な並列化を可能にするために、いくつかの通信ルーチンを使用してコード内で (オンザフライで) 2D トポロジーを 1D トポロジーにマップする必要がありますが、これを行う効率的で効果的な方法があるかどうかはわかりません。 VSは、3つのプロセスを並行して元の問題を実行しています。どんな提案も役に立ちます。ありがとう!!