MPI_Isend()为非阻塞式发送,若下列代码MPI_Irecv后未直接跟上MPI_Wait()则打印出的结果不正确,因为此时结果尚未完全接收。而MPI_Recv()为阻塞式接收,需结果接收完才会往下继续执行
#include<mpi.h> #include<stdio.h> int main(int argc ,char * argv[]) { MPI_Request req[2]; int s1,r1; MPI_Status sta[2]; int nprocs,rank; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&nprocs); MPI_Comm_rank(MPI_COMM_WORLD,&rank); s1=5; if(rank==0){ //MPI_Send(&s1,1,MPI_DOUBLE,2,1,MPI_COMM_WORLD); MPI_Isend(&s1,1,MPI_DOUBLE,2,1,MPI_COMM_WORLD,req); MPI_Wait(req,sta); } if(rank==2){ //MPI_Recv(&r1,1,MPI_DOUBLE,0,1,MPI_COMM_WORLD,sta); MPI_Irecv(&r1,1,MPI_DOUBLE,0,1,MPI_COMM_WORLD,&req[1]); MPI_Wait(&req[1],&sta[1]); printf("%d\n",r1); } printf("rank %d process is running\n",rank); MPI_Finalize(); }