170 likes | 245 Views
Collectives. Reduce Scatter Gather Many more. Prototype of MPI_Reduce(). int MPI_Reduce ( void *operand, /* addr of 1st reduction element */ void *result, /* addr of 1st reduction result */ int count,
E N D
Collectives • Reduce • Scatter • Gather • Many more
Prototype of MPI_Reduce() int MPI_Reduce ( void *operand, /* addr of 1st reduction element */ void *result, /* addr of 1st reduction result */ int count, /* reductions to perform */ MPI_Datatype type, /* type of elements */ MPI_Op operator, /* reduction operator */ int root, /* process getting result(s) */ MPI_Comm comm /* communicator */ )
MPI_Datatype Options • MPI_CHAR • MPI_DOUBLE • MPI_FLOAT • MPI_INT • MPI_LONG • MPI_LONG_DOUBLE • MPI_SHORT • MPI_UNSIGNED_CHAR • MPI_UNSIGNED • MPI_UNSIGNED_LONG • MPI_UNSIGNED_SHORT
MPI_Op Options • MPI_BAND • MPI_BOR • MPI_BXOR • MPI_LAND • MPI_LOR • MPI_LXOR • MPI_MAX • MPI_MAXLOC • MPI_MIN • MPI_MINLOC • MPI_PROD • MPI_SUM
Only process 0 will get the result Our Call to MPI_Reduce() MPI_Reduce (&count, &global_count, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); if (!id) printf ("There are %d different solutions\n", global_count);
MPI_Allgatherv int MPI_Allgatherv ( void *send_buffer, int send_cnt, MPI_Datatype send_type, void *receive_buffer, int *receive_cnt, int *receive_disp, MPI_Datatype receive_type, MPI_Comm communicator)
File Reading a Block-Column Matrix
Header for MPI_Scatterv int MPI_Scatterv ( void *send_buffer, int *send_cnt, int *send_disp, MPI_Datatype send_type, void *receive_buffer, int receive_cnt, MPI_Datatype receive_type, int root, MPI_Comm communicator)
Printing a Block-Column Matrix • Data motion opposite to that we did when reading the matrix • Replace “scatter” with “gather” • Use “v” variant because different processes contribute different numbers of elements
Header for MPI_Gatherv int MPI_Gatherv ( void *send_buffer, int send_cnt, MPI_Datatype send_type, void *receive_buffer, int *receive_cnt, int *receive_disp, MPI_Datatype receive_type, int root, MPI_Comm communicator)
Header for MPI_Alltoallv int MPI_Gatherv ( void *send_buffer, int *send_cnt, int *send_disp, MPI_Datatype send_type, void *receive_buffer, int *receive_cnt, int *receive_disp, MPI_Datatype receive_type, MPI_Comm communicator)
create_mixed_xfer_arrays builds these Count/Displacement Arrays • MPI_Alltoallv requires two pairs of count/displacement arrays • First pair for values being sent • send_cnt: number of elements • send_disp: index of first element • Second pair for values being received • recv_cnt: number of elements • recv_disp: index of first element