#define large 128 #include "mpi.h" #include <stdio.h> int main(argc, argv) int argc; char **argv; { int rank, size, i, sbuf = 1, cnt; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); MPI_Comm_size( MPI_COMM_WORLD, &size ); if (rank == 0) { MPI_Request requests[large]; MPI_Status statuses[large]; int indices[large]; int buf[large]; int j, ndone; cnt = (size-1)*100; for (i=1; i<size; i++) MPI_Irecv( buf+i, 1, MPI_INT, i, MPI_ANY_TAG, MPI_COMM_WORLD, &requests[i-1] ); while(cnt > 0) { MPI_Waitsome( size-1, requests, &ndone, indices, statuses ); for (i=0; i<ndone; i++) { j = indices[i]; printf( "Msg from %d with tag %d\n", statuses[i].MPI_SOURCE, statuses[i].MPI_TAG ); MPI_Irecv( buf+j, 1, MPI_INT, j+1, MPI_ANY_TAG, MPI_COMM_WORLD, &requests[j] ); } cnt -= ndone; } /* We should really cancel the pending receives */ for (i=0; i<size; i++) MPI_Cancel( &requests[i] ); } else { for (i=0; i<100; i++) MPI_Send( &sbuf, 1, MPI_INT, 0, i, MPI_COMM_WORLD ); } MPI_Finalize(); return 0; }