#include #include #define CHK(err) if(err) return err int main (int argc, char **argv) { MPI_Comm comm; MPI_Request req; MPI_Message message; MPI_Status status; int send, recv; int rank, size, err; err = MPI_Init(&argc, &argv); CHK(err); comm = MPI_COMM_WORLD; err = MPI_Comm_size(comm, &size); CHK(err); err = MPI_Comm_rank(comm, &rank); CHK(err); send = rank; if ((size % 2 == 0) || rank < size - 1) { err = MPI_Isend(&send, 1, MPI_INT, rank ^ 1, 0, comm, &req); CHK(err); printf("[%d]: post Isend\n", rank); err = MPI_Mprobe(rank ^ 1, 0, comm, &message, MPI_STATUS_IGNORE); CHK(err); printf("[%d]: post Mprobe\n", rank); err = MPI_Mrecv(&recv, 1, MPI_INT, &message, MPI_STATUS_IGNORE); CHK(err); printf("[%d]: post Mrecv\n", rank); err = MPI_Wait(&req, MPI_STATUS_IGNORE); CHK(err); printf("[%d]: post Wait\n", rank); if (recv != rank ^ 1) printf("[%d]: expected %d, got %d\n",rank, rank ^ 1, recv); } err = MPI_Finalize(); return err; }