2016-11-27 4 views
0

私は、パイプライン通信の手法を使って並列バージョンのガウス消去を解決しようとしていました。 MPI_SendMPI_Recvを使用し、MPI_Sendrecv_replaceに切り替えようとしたときにコードがデッドロックしました。ここで私が書いたものだ。ここではパイプライン通信でMPI_Sendrecvを使用するには?

 int pred, succ,k; 
     MPI_Status stat; 
     pred = (size + (rank -1))%size; 
     succ = (rank + 1) %size; 

     for(k=0;k<matrix_size;++k) 
     { 
      if(k%size == rank) { 
       MPI_Sendrecv_replace(row_comm, matrix_size+1, MPI_DOUBLE,succ,0, 
            pred, 1, MPI_COMM_WORLD, &stat); 
      } else { 
        MPI_Sendrecv_replace(row_comm, matrix_size+1,MPI_DOUBLE,succ,0, 
             pred, 1, MPI_COMM_WORLD, &stat); 
        if(succ != k%size) { 
         MPI_Send(row_comm, matrix_size+1, MPI_DOUBLE,succ,0,MPI_COMM_WORLD); 
         } 


        } 
} 

sizerankは、プロセッサと通信トポロジーにおけるプロセッサのランクの合計数です。 row_commは、サイズがmatrix_size+1のベクターです。パイプライン通信では、前任者は後継者に送信します。後継者のランクがsize-1の場合、ロールオーバーしてランク0のプロセスに送信します。しかし、私はこの権利をしていますか?

+0

セパレートセンドのポイントは何ですか?コードを適切にフォーマットしてください。 – Zulan

+0

別個の送信はすぐに行の通信を次のプロセッサに送ります。これはパイプライン通信要件です。 –

+0

それとペアになっているのはどちらですか?それはどうやってサンズの送付部分と違うはずですか? – Zulan

答えて

0

私はデッドロックを避けるために、この方式をお勧めします: IReceive(PREV) IReceive(SUCC) ISend(PREV) ISend(SUCC) Waitall(4つのハンドル)

すべてのプロセスが同期している場合は、 MPIはまったくバッファリングしなくなる可能性があります。

関連する問題