+ /* The root collects and broadcasts the messages. */
+ else {
+ MPI_Request* requests;
+ requests = (MPI_Request*)malloc( size * sizeof(MPI_Request) );
+ for (i = 1; i < size; ++i) {
+ requests[i] = smpi_mpi_irecv(NULL, 0, MPI_BYTE, MPI_ANY_SOURCE,
+ COLL_TAG_BARRIER, MPI_COMM_WORLD
+ );
+ }
+ smpi_mpi_waitall( size-1, requests+1, MPI_STATUSES_IGNORE );
+ for (i = 1; i < size; ++i) {
+ requests[i] = smpi_mpi_issend(NULL, 0, MPI_BYTE, i,
+ COLL_TAG_BARRIER,
+ MPI_COMM_WORLD
+ );
+ }
+ smpi_mpi_waitall( size-1, requests+1, MPI_STATUSES_IGNORE );
+ free( requests );
+ }
+