0
私は、パイプライン通信の手法を使って並列バージョンのガウス消去を解決しようとしていました。 MPI_Send
とMPI_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);
}
}
}
、size
とrank
は、プロセッサと通信トポロジーにおけるプロセッサのランクの合計数です。 row_comm
は、サイズがmatrix_size+1
のベクターです。パイプライン通信では、前任者は後継者に送信します。後継者のランクがsize-1
の場合、ロールオーバーしてランク0
のプロセスに送信します。しかし、私はこの権利をしていますか?
セパレートセンドのポイントは何ですか?コードを適切にフォーマットしてください。 – Zulan
別個の送信はすぐに行の通信を次のプロセッサに送ります。これはパイプライン通信要件です。 –
それとペアになっているのはどちらですか?それはどうやってサンズの送付部分と違うはずですか? – Zulan