2011-02-26 10 views
1

私は、3回の繰り返しでロジックサークルを構築し、その結果を出力する単純なアプリケーションを構築しています。まず、プロセス0からのBlock SendとRecvを使用しています。SendとRecvを使用しています。最後のn-1プロセスまでは、プロセス0に送信されます。プロセス0では、このコードがメインにあります。MPI - ロジックサークルサークル

int i; 
    MPI_Status status; 
    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD,&numtasks); 
    MPI_Comm_rank(MPI_COMM_WORLD;&myrank); 



if(myrank==0){ 


    for(i=0;i<3;i++){ 
     MPI_Send(msg,MPI_CHAR,myrank+1,99,MPI_COMM_WORLD); 
     MPI_Recv(msg,100,MPI_CHAR, numtasks-1,99,MPI_COMM_WORLD,&status); 
     printf("hello"); 
    } 
    } 
    else if(myrank==(numtasks-1)){ 
    MPI_Recv(msg,100,MPI_CHAR,numtasks-2,99,MPI_COMM_WORLD,&status); 
    MPI_Send(msg,100,MPI_CHAR,0,99,MPI_COMM_WORLD); 

    } 
    else{ 
    MPI_Recv(msg,100,MPI_CHAR,myrank-1,99,MPI_COMM_WORLD,&status); 
    MPI_Send(msg,100,MPI_CHAR,myrank+1,99,MPI_COMM_WORLD); 
    } 

私は今3つの結果を得ようとしています、私は正しいですか?しかし、まだ私は1つしか得ていません。残りのコードはシンプルで、0以外のプロセスでは、myrank-1(myrankは実際のプロセスの番号)から受信し、rank + 1に送信します...まだ私はそれを取得しません。

答えて

3

MPI_Sendは、受信側がMPI_Recvに電話するのを待つことを選択できます。したがって、すべてのプロセスがMPI_Sendを呼び出して開始すると、すべてのプロセスがハングします。 MPI_Isendを代わりに使用し、各メッセージがMPI_Waitallで受信されたことを確認してください。

EDIT:どのように私は最初のifブロックにループがあるという事実を見逃してしまったのか分かりません。*恥ずかしい*。私はMPIの部分をあまりにも集中したと思います。 のコードをのループなしで実行してみてください(ループ本体はまだ存在します)。それが正常に機能しなければならない(例えば、であり、n = 3つの工程):

  1. 0が1に送信し、0から2
  2. 1受信からの受信を待機するには、2に送信し、
  3. を出2 1から受信し、0に送信し、そして、2から受信したメッセージを出力し、そして次に

を出る

  • 0を終了し、再度ループを再挿入。プロセス0がステップ4の後に続き、プロセス1に送信されるを終了する点を除いて全く同じことが起こります。 else ifelseブロックにもループを挿入するか、ifブロックからループを削除して、if/else if/elseのループ全体を囲みます。

  • +1

    +1私をビートしてください。 (私はブロックする方法のあなたの応答を修正しました。) – chrisaycock

    +0

    @chrisaycock:ああ; 'MPI_Waitall'はよく知られているようです。 :-) +1。 –

    +0

    最初のプロセスはMPI_Sendで始まり、他はMPI_Recvで始まりMPI_Sendで続行します。そしてそれは私にとって奇妙なことです。たとえそれが3回行っても、それは一度だけ、その後は何もしません。 – Waypoint