/* tab:4 * * msample.c - Sample MPI program * */ #include #include "mpi.h" #define Tag 100 /* All processes start executing in main */ int main(int argc, char **argv) { MPI_Status status; int NPROCS = -1; /* Number of Processes */ int MyProc = -1; /* Process address */ int msg[128]; /* Message buffer area for send and recv */ int nodes = 0; int reports[1024]; /* Record of reports */ int i; /* Initialize MPI environment */ MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &NPROCS); /* Number of Procs */ MPI_Comm_rank(MPI_COMM_WORLD, &MyProc); /* Local address */ if (MyProc == 0) printf ("Process %d: initialized\n", MyProc); /* Everybody sends to node 0. It receives them in any order */ if (MyProc == 0) { reports[0] = 0; nodes = 1; while (nodes < NPROCS) { MPI_Recv(msg, 128, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); reports[nodes] = msg[0]; /* Record source node */ nodes++; } printf ("Process %d: all report in\n", MyProc); for (i = 0; i < NPROCS; i++) { printf ("%d->%d.\n", i, reports[i]); } } else /* Everyone sends to zero */ { msg[0] = MyProc; MPI_Send(msg, 1, MPI_INT, 0, Tag, MPI_COMM_WORLD); } /* Everybody gets a specific message back from node zero */ if (MyProc == 0) /* Node 0 to serve as master */ { for (nodes =1; nodes < NPROCS; nodes++) { msg[0] = nodes; MPI_Send(msg, 16, MPI_INT, nodes, Tag, MPI_COMM_WORLD); } printf ("Process %d: done\n", MyProc); } else { MPI_Recv(msg, 16, MPI_INT, 0, Tag, MPI_COMM_WORLD, &status); printf ("Process %d: done\n", MyProc); } MPI_Finalize(); /* Cleanup MPI environment */ }