2017-01-18 3 views
1

バッファを左から右へ(0→1、2→2→3など)送信しようとしています。私はプロセスが正しいパートナーから送受信しているが、コードがハングしたり、segフォルトを出力していることは確かです。あなたは条件付きでMPI_Isend/MPI_Irecvを行うのに対し、なぜMPI_Isendがここにぶら下がっていますか?

#include "mpi.h" 
#include <iostream> 
int main(int argc, char *argv[]) 
{ 
int comm_rank, num_procs, recieve1, send1; 
int buffer[10]; 
MPI_Request request, request2; 
MPI_Status status; 

MPI_Init(&argc,&argv); 
MPI_Comm_size(MPI_COMM_WORLD, &num_procs); 
MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank); 


send1 = (comm_rank + 1) % num_procs; 
recieve1 = comm_rank - 1; 
if (recieve1 < 0) 
    recieve1 = num_procs - 1; 

//std::cout << "Comm Rank = " << comm_rank << "\trecieve1 = " << recieve1 << "\tsend1 = " << send1 << std::endl;  

if (comm_rank == 0) 
    send1 = 1; 
if (comm_rank == num_procs-1) 
    recieve1 = num_procs-2; 

if (comm_rank != 0) 
{ 
    MPI_Irecv(buffer, 10, MPI_INT, recieve1, 123, MPI_COMM_WORLD, &request); 
    std::cout << comm_rank << " <- " << recieve1 << std::endl; 
} 
if (comm_rank != num_procs-1) 
{ 
    MPI_Isend(buffer, 10, MPI_INT, send1, 123, MPI_COMM_WORLD, &request2); 
    std::cout << comm_rank << " -> " << send1 << std::endl; 
} 
MPI_Wait(&request, &status); 
MPI_Wait(&request2, &status); 


MPI_Finalize(); 
return 0; 
} 

答えて

0

あなたは無条件に、requestrequest2の両方にMPI_Waitを行っています。実際に開始された要求を待つだけで済みます。

+0

ああありがとうございました! –

+1

@MichaelPortobello: 'request'と' request2'の両方を 'MPI_REQUEST_NULL'に初期化します。そうすれば、無条件に 'MPI_Wait'を呼び出すことができます。 –

関連する問題