我正在尝试将每个进程的一些数据发送给它的两个邻居(按等级)。为此,我尝试使用非阻塞发送和接收调用MPI_Isend
/MPI_Irecv
以及相应的调用来MPI_Waitall
确保在使用数据之前发生传输。
下面是我正在尝试做的一个最小示例
#include <mpi.h>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
MPI_Init(&argc,&argv);
int rank,comm_size;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&comm_size);
MPI_Request reqs[4];
int sbuff1[10];
int sbuff2[10];
int rbuff1[10];
int rbuff2[10];
int count = 0;
if(rank>0)
{
MPI_Irecv(rbuff1,10,MPI_INT,rank-1,0,MPI_COMM_WORLD,&reqs[count]);
count++;
MPI_Isend(sbuff1,10,MPI_INT,rank-1,1,MPI_COMM_WORLD,&reqs[count]);
count++;
}
if(rank<comm_size-1)
{
MPI_Irecv(rbuff2,10,MPI_INT,rank+1,2,MPI_COMM_WORLD,&reqs[count]);
count++;
MPI_Isend(sbuff2,10,MPI_INT,rank+1,3,MPI_COMM_WORLD,&reqs[count]);
count++;
}
MPI_Waitall(count,reqs,MPI_STATUS_IGNORE);
if(rank==0)
cout << "Successfully exchanged data." << endl;
MPI_Finalize();
return 0;
}
不幸的是,这段代码永远无法在最后打印出消息。
那么我的问题是:数据是否正确发送,但我的调用MPI_Waitall
是错误的?如果是这样,我需要更改什么才能使这个简单的代码运行,如果不是,还有什么问题?