1

A現在、スケーラビリティに深刻な問題を引き起こしている 1 つのプロセス ( と呼びます) を持つ MPI アプリケーションがあります。現在、他のすべてのプロセスはMPI_Recv、その 1 つのプロセスが情報を送信するのを待っています。

できるだけ少ない労力でこれを高速化したいので、OpenMP の並列化プロセスを使用することを考えていましA。これは実用的ですか?

ノードを共有する他のプロセスAは にあるMPI_Recvため、そのノードのすべてのリソースを使用してプロセスで作業できますかA、またはそれをMPI_Recv防ぐことができますか?

AOpenMP を使用するもう 1 つの利点は、処理に時間がかかるため、メモリを共有できることです。

ところで、プロセッサがMPI_Sendではなく で待機している場合、何か変化はありMPI_Recvますか?

4

2 に答える 2

3

はい、OpenMP を使用して、作業分散を処理する OpenMPI とローカルに組み合わせた特定のプロセスを並列化することができます (つまり、ノード間の OpenMPI とノード内の OpenMP)。この概念は、OpenMP と MPI を使用したハイブリッド プログラミングとして知られています (これについてググると、いくつかの役立つリンクが見つかります)。

MPI_SendおよびMPI_Recv呼び出しは呼び出しをブロックしています (詳細については、メッセージ パッシング (MPI) mpi_send および recv でこの投稿を確認できます)。これは、ノードがブロックされMPI_Recvている場合、データを待機してブロックされることを意味します。ただし、それぞれの非同期メソッドMPI_IsendおよびMPI_Irecvを使用してパフォーマンスを向上させることができますが、競合状態や慎重なバッファー処理に対処する必要があります。例と詳細については、こちらを参照してください。

私の意見では、次の 2 つの選択肢があります。

  1. OpenMPI を使用してワークロードを均等に分散し、OpenMP を使用してローカルでワークロードを並列化します (複数のコアと複数のコアを持つ複数のノードがある場合は、OpenMP を使用して各コアにタスクを割り当てることができます。OpenMPI を使用すると、ノードを介してその一部を分散できます。各ノードのローカル アーキテクチャを活用し、OpenMP を使用します);
  2. 必要に応じて他のノードがノード A の計算を支援するように、非同期メソッドを使用するようにプログラムを再プログラムします。

これが役立つことを願っています。

于 2012-05-30T02:23:12.933 に答える
0

OpenMP と MPI を使用するのは比較的簡単です。正しく理解すれば、速度が向上するはずです。しかし、全体がハックのように見えます。プログラムの再設計 (設計方法論の育成)を検討したことがありますか? 1 つのノードで他のノードをすべてブロックするのは、適切な設計ではありません。

于 2012-05-29T20:42:35.590 に答える