2014-01-12 4 views
5

ノンブロッキング・センド/ recvsはMPIですぐに戻り、操作はバックグラウンドで完了します。私が起こっていることを見る唯一の方法は、現在のプロセス/スレッドが別のプロセス/スレッドを呼び出して作成し、それにsend/recvコードのイメージをロードし、それ自身が戻るということです。この新しいプロセス/スレッドはこの操作を完了し、Wait/Testが返すどこかのフラグを設定します。私は正しいですか?要約ノンブロッキングMPIコールの実装

答えて

6

進展が起こることができる2つの方法があります。別のスレッドで

  1. が。これは通常、ほとんどのMPI実装(通常はconfigure /コンパイル時)のオプションです。このバージョンでは、あなたが推測したように、MPI実装には別の進捗エンジンを実行する別のスレッドがあります。そのスレッドは、すべてのMPIメッセージとデータの送受信を管理します。この方法は、他のMPI呼び出しにオーバーヘッドを追加することなく、バックグラウンドで進行しているので、マシン上のすべてのコアを使用していない場合にうまく機能します。

  2. 他のMPI呼び出しの内部。これはもっと一般的なやり方であり、私が信じるほとんどの実装のデフォルトです。このバージョンでは、非ブロッキングコールは、コールを開始するときに開始され(MPI_I<something>)、本質的に内部キューに追加されます。実際に何らかのブロッキング通信を行う(または以前のノンブロッキング呼び出しが完了するのを待つ)後に、別のMPI呼び出しを行うまで、その呼び出しで何も起きません。そのMPI呼び出しを入力すると、実行するように求められたことに加えて、進捗エンジンも実行されます(バージョン1のスレッドで実行されているものと同じ)。起こっているはずのMPIコールが何をしているのかに応じて、プログレスエンジンはしばらく実行されるか、1回だけ実行されることがあります。たとえば、MPI_IRECVMPI_WAITを呼び出した場合は、待機中のメッセージが表示されるまで進捗エンジンの内部にとどまります。 MPI_TESTを実行しているだけの場合は、進捗エンジンを1回循環してから戻ってくることがあります。

  3. もっとエキゾチックな方法。 Jeffが彼の記事で言及しているように、あなたが走っているハードウェアに依存するよりエキゾチックな方法があります。バックグラウンドでメッセージを移動するなど、MPIコールをスピードアップするために、いくつかの魔法をかけるNICがあるかもしれません。一般に、これらは実行しているハードウェアと実装に固有のものなので、詳細を知りたい場合は、より具体的に質問する必要があります。

これはすべてあなたの実装に特有ですが、ほとんどはこのような方法で動作します。

+0

精巧な答えをありがとう! –

4

メッセージ処理用の別のスレッドがノンブロッキング操作の唯一の解決策であるかどうか尋ねられますか?

もしそうなら、答えはいいえです。私は思う、多くのセットアップは別の戦略を使用します。通常、メッセージ処理の進行は、すべてのMPIコール中に実行されます。 Jeff SquyresのBlog entryをご覧になることをお勧めします。

より完全な答えは、Wesley Blandの回答をご覧ください。

+0

複雑な投稿ですが、はい、メッセージを渡すためのハードウェアアシスタンスは実現可能な解決策であると指摘しています。それは私の質問に答えます。ありがとうございました ! –

+0

しかし、誰かが簡単な言葉でこの「進歩」が実装されているさまざまな「方法」を説明することができれば、素晴らしいことになるでしょう。 –

+0

私がMPI実装で作業していないので、私がこれに答えるのが正しいかどうかは確かではありませんが、基本的には、MPI呼び出し中に保留通信に関する作業が行われます。したがって、MPIを呼び出すたびに、保留中の通信操作が進行している可能性があります。これは、実際の呼び出しに関連していません。 – haraldkl

関連する問題