#include #include #define CHKERRMPI(ierr) do { if (ierr) MPI_Abort(MPI_COMM_WORLD,MPI_ERR_OTHER); } while (0) int main(int argc, char** argv) { int ierr; MPI_Request req[1]; double buf[4] = {.1,.2,.3,.4}; MPI_Datatype dtype; int rank,size,tag=100; ierr = MPI_Init(&argc,&argv);CHKERRMPI(ierr); ierr = MPI_Comm_rank(MPI_COMM_WORLD,&rank);CHKERRMPI(ierr); ierr = MPI_Comm_size(MPI_COMM_WORLD,&size);CHKERRMPI(ierr); if (size != 2) { if (!rank) printf("This test requires two MPI ranks\n"); MPI_Abort(MPI_COMM_WORLD,MPI_ERR_COMM); } ierr = MPI_Type_contiguous(4,MPI_DOUBLE,&dtype);CHKERRMPI(ierr); ierr = MPI_Type_commit(&dtype);CHKERRMPI(ierr); if (!rank) { ierr = MPI_Send_init(buf,1,dtype,1,tag,MPI_COMM_WORLD,req);CHKERRMPI(ierr); } else { ierr = MPI_Recv_init(buf,1,dtype,0,tag,MPI_COMM_WORLD,req);CHKERRMPI(ierr); } for (int i=0; i<2; i++) { ierr = MPI_Startall(1,req);CHKERRMPI(ierr); ierr = MPI_Waitall(1,req,MPI_STATUSES_IGNORE);CHKERRMPI(ierr); } ierr = MPI_Type_free(&dtype);CHKERRMPI(ierr); ierr = MPI_Request_free(req);CHKERRMPI(ierr); ierr = MPI_Finalize();CHKERRMPI(ierr); return 0; }