2016-04-12 19 views
2

ここで類似の質問は見つかりませんでしたので、ここに入ります: 次のコードは常に(False, None)を出力しますか? (True, None)でなければならない場合は、プロセス0の後にtest()が3秒後に呼び出された場合は、メッセージを送信しますか?また、私がtest()の前にreq.wait()と呼ぶと、私は必要な出力が得られますが、ブロック不可能ではないので、test()は目的を失います(3秒間に任意のソースからメッセージを受け取ることができます私はmpi4pyには専門家ではないが、それは公正な仮定のように思えるそのMPI Cの対応()のように振る舞うと仮定すると、その後実際に、少し驚きがここにありますMpi4py mpi_testは常にfalseを返します

import time 
from mpi4py import MPI 

comm = MPI.COMM_WORLD 
rank = comm.Get_rank()  

if rank == 0: 
    req = comm.isend(0, 1, tag=0); 
    req.wait(); 
elif rank == 1: 
    req = comm.irecv(); 
    time.sleep(3); 
    print req.test(); 
+0

実行しているプログラムは本当ですか?属していないいくつかの ';'があります。 'sleep/test'をループに入れるとどうなりますか? – Zulan

+0

奇妙な。 'test'コマンドを2回続けて呼び出すと、2番目(および後で)の出力が良好になります。それでも、正常な動作ではないので、誰でも私に指示を与えることができれば、それは分かります。 –

答えて

1

:それは)

コードを眠りました。

まあ、公平で、あなたのコードの出力はMPI標準では述べられていません。保証とは、関数の呼び出しの番号の後に、それはtrueを返します。この番号は何でもかまいませんので、最初の呼び出しではtrueを返し、2番目の呼び出しでは10億回の呼び出し後にしか返しません。したがって、MPI_Test()関数を使用する通常の/推奨の方法は、無限ループで終了するか(出力に基づく終了条件付き)、またはMPI_Wait()コールを使用します。

ここでその理由は次のとおりです。MPIライブラリは、通常、明示的なMPI呼び出し以外のアクションを実行しません。したがって、非ブロック通信が進行するのを確認するには、 MPIコールを実行する必要があります。これらのコールは常時通信に関連する必要はありません(通常、MPIコールは内部的にメッセージキューのあるレベルの進行をトリガーします)が、MPIライブラリに手を差して取得する必要があります。そしてそれはMPI_Test()への呼び出しがするものです。また、なぜこれが実際に時間に関係しないのかも説明されています。sleep()関数を呼び出すと通信が実際に行われる時間がありますが、MPIライブラリは間に手を入れないので実際には何も起こりません。

最後に、私の上記の説明にはいくつかの節度:

  1. 上記想定していない外部メカニズムは、飛行中のメッセージを進行します。ただし、InfiniBandカードなどの(リモート)ダイレクトメモリアクセスエンジンは、余分なMPIコールを行わなくても実際にメッセージを進めることができます。ただし、これは通常、ノード間通信でのみ発生し、ハードウェアとソフトウェアに大きく依存します。
  2. 一部のMPIライブラリは、MPI呼び出しの外でMPI通信を進めるためにCPUスレッドを専用にする可能性を拡張として提供します。たとえば、インテルMPIなどのMPICHベースのMPIライブラリでは、一旦1に設定されたMPICH_ASYNC_PROGRESSという環境変数が、このMPI通信スレッドの作成をトリガーしてシーンの背後にある非ブロック通信を進めるように提案しています。 OpenMPIのは、同様に、この機能を提案している場合は...わからないあなたは大きなプログラムをダウン編集からこの例を作成しましたので、
0

は、たぶんそれだけだが、私はちょうど彼らはいくつかの根本的な誤解はなかったしているチェックしたいですノンブロッキングMPI通信の...

私はあなたが持っている理由を理解していません:

req = comm.isend(0, 1, tag=0); 
req.wait(); 

を、これはブロッキング・コールもちろん

comm.send(0, 1, tag=0); 

と機能的に同一であることから、非ブロック形式を使用すると、後でもっと挿入できることを意味しますisendとwaitの間のコードはおそらくあなたがやるべきことです。

+0

私はMPIの初心者ですから多かれ少なかれテストです。ポストは私がそれを記述した方法で実行され、それはそれ自身のスクリプトで隔離されています。 –

関連する問題