web-dev-qa-db-ja.com

MPI vs共有メモリのopenMP

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

25
Shibli

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

質問自体については、提供された情報を踏まえると、正しい答えは常に1つと同じでしたIT DEPENDS

28
Hristo Iliev

MPIまたはOpenMP(またはその両方)が必要か、または必要かは、実行しているアプリケーションのタイプ、および問題がメモリに依存しているかCPUに依存しているか(またはその両方)に大きく依存します。 、実行しているハードウェアのタイプによって異なります。いくつかの例:

例1

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

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

例2

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

この場合、OpenMPが最初の選択です。ほんの数個のステートメントをあちこちに追加するだけで(たとえば、加速したいforループの前)、プログラムが複雑すぎない場合は、OpenMPが残りを自動的に実行します。

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

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

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

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

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

分散メモリマシンへの移行を計画している場合は、MPIを使用してください。同じ問題を2回解決するのに役立ちます。

OpenMPの方が速いかもしれない理由は、MPIの適切な実装は、共有メモリ環境で使用されていることを特定し、それに応じてその動作を最適化するのに十分賢いためです。

4
hcarver

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

一方、データを正しくパーティション分割し、各プロセッサにプライベートキャッシュがある場合、問題が完全にキャッシュに収まると問題が発生する可能性があります。この場合、あなたは超線形スピードアップを持っています。

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

3
RSFalcon7