28

それぞれ2コアのCPUが4つあるコンピューターがあるとしましょう。つまり、合計8コアです。私の限られた理解では、この場合、すべてのプロセッサが同じメモリを共有していると思います。さて、コードが分散設定と共有設定の両方で機能できるように、openMPを直接使用するか、MPIを使用して一般化する方がよいでしょう。また、共有設定にMPIを使用すると、openMPと比較してパフォーマンスが低下しますか?

4

4 に答える 4

57

MPI または OpenMP (またはその両方) が必要かどうかは、実行しているアプリケーションの種類と、問題が主にメモリ バウンドか CPU バウンド (またはその両方) かによって大きく異なります。さらに、実行しているハードウェアの種類によって異なります。いくつかの例:

例 1

メモリが不足しているため、並列化が必要です。たとえば、シミュレーションがあり、問題のサイズが大きすぎて、データが単一ノードのメモリに収まりません。ただし、データに対して実行する操作はかなり高速であるため、それ以上の計算能力は必要ありません。

この場合、おそらく MPI を使用し、各ノードで 1 つの MPI プロセスを開始して、通信を最小限に制限しながら、使用可能なメモリを最大限に活用することをお勧めします。

例 2

通常、小さなデータセットがあり、計算負荷の高いアプリケーションを高速化したいだけです。また、並列化について考えるのに多くの時間を費やしたくはありませんが、一般的なアルゴリズムにもっと時間を費やしたいと考えています。

この場合、OpenMP が最初の選択肢です。あちこちにいくつかのステートメントを追加するだけで済みます (たとえば、高速化したい for ループの前に)。プログラムがそれほど複雑でない場合は、OpenMP が残りを自動的に行います。

例 3

あなたはそれをすべてしたいです。より多くのメモリ、つまりより多くのコンピューティング ノードが必要ですが、計算をできるだけ高速化したい場合、つまりノードごとに複数のコアで実行する場合もあります。

ハードウェアの出番です。私の個人的な経験から、ノードあたり数コア (4 ~ 8) しかない場合、OpenMP を使用する一般的なオーバーヘッド (つまり、OpenMP スレッドの起動など) によって生じるパフォーマンスの低下は、プロセッサ内部のオーバーヘッドよりも大きくなります。 MPI 通信 (つまり、実際にメモリを共有し、通信に MPI を必要としないプロセス間で MPI メッセージを送信する)。
ただし、ノードあたりのコア数が多い (16 以上) マシンで作業している場合は、ハイブリッドアプローチを使用する必要があります。つまり、MPI と OpenMP を同時に並列化します。この場合、計算リソースを最大限に活用するにはハイブリッド並列化が必要になりますが、コーディングと保守が最も困難です。

まとめ
1 つのノードだけで実行できるほど小さい問題がある場合は、OpenMP を使用してください。複数のノードが必要である (したがって MPI が絶対に必要である) ことがわかっているが、パフォーマンスよりもコードの読みやすさ/労力を優先する場合は、MPI のみを使用してください。MPI のみを使用しても希望/必要な速度向上が得られない場合は、すべてを実行してハイブリッドにする必要があります。

2 番目の質問に対して (明確にならなかった場合):
MPI をまったく必要としないような設定をしている場合 (常に 1 つのノードでのみ実行されるため)、OpenMP を使用すると高速になります。しかし、とにかく MPI が必要であることがわかっている場合は、MPI の合理的な最適化オプションをすべて使い果たしたことがわかったときに、それから始めて、後で OpenMP を追加するだけです。

于 2012-07-05T13:01:44.947 に答える
31

現在、SMP または NUMA ノードで構成されるほとんどの分散メモリ プラットフォームでは、OpenMP を使用しないことは意味がありません。OpenMPMPI は完全に連携できます。OpenMP は各ノードのコアにフィードし、MPI はノード間で通信します。これをハイブリッドプログラミングと呼びます。10 年前には風変わりなものと見なされていましたが、現在ではハイ パフォーマンス コンピューティングの主流になりつつあります。

質問自体に関しては、提供された情報を考えると、正しい答えは常に同じでした: IT DEPENDS .

于 2012-07-04T16:19:58.927 に答える
4

そのような単一の共有メモリ マシンで使用するには、OpenMP をお勧めします。問題のいくつかの側面がより単純になり、より速くなる可能性があります。

分散メモリ マシンに移行する予定がある場合は、MPI を使用してください。同じ問題を 2 回解く必要がなくなります。

OpenMP の方が高速であると私が言う理由は、MPI の優れた実装は、共有メモリ環境で使用されていることを認識し、それに応じてその動作を最適化するのに十分なほど賢いからです。

于 2012-07-04T15:42:16.923 に答える
3

全体像としては、ハイブリッド プログラミングが一般的になったのは、OpenMP が同じアドレス空間を使用することでキャッシュ トポロジの恩恵を受けるためです。MPI は同じデータをメモリ上に複製する可能性があるため (プロセスがデータを共有できないため)、キャッシュのキャンセルが発生する可能性があります。

一方、データを正しく分割し、各プロセッサがプライベート キャッシュを持っている場合、問題が完全にキャッシュに収まるようになる可能性があります。この場合、超線形スピードアップが得られます。

キャッシュについて話すと、最近のプロセッサには非常に異なるキャッシュトポロジがあり、常に次のようになっています: IT DEPENDS...

于 2012-07-04T21:30:42.323 に答える