diff --git a/ompi/mca/coll/hierarch/coll_hierarch.c b/ompi/mca/coll/hierarch/coll_hierarch.c index 330789b96e..6ecc9279ea 100644 --- a/ompi/mca/coll/hierarch/coll_hierarch.c +++ b/ompi/mca/coll/hierarch/coll_hierarch.c @@ -28,8 +28,6 @@ #include "mca/coll/coll.h" #include "mca/coll/base/base.h" #include "ompi/mca/coll/base/coll_tags.h" -#include "coll_hierarch.h" - #include "class/ompi_bitmap.h" #include "mca/bml/bml.h" diff --git a/ompi/mca/coll/hierarch/coll_hierarch_bcast.c b/ompi/mca/coll/hierarch/coll_hierarch_bcast.c index 82182ac134..f672e680ae 100644 --- a/ompi/mca/coll/hierarch/coll_hierarch_bcast.c +++ b/ompi/mca/coll/hierarch/coll_hierarch_bcast.c @@ -22,9 +22,6 @@ #include "opal/util/output.h" #include "communicator/communicator.h" #include "mca/coll/coll.h" -#include "mca/coll/base/base.h" -#include "mca/coll/base/coll_tags.h" -#include "coll_hierarch.h" /* * bcast_intra diff --git a/ompi/mca/coll/hierarch/coll_hierarch_reduce.c b/ompi/mca/coll/hierarch/coll_hierarch_reduce.c index 204957aba5..a508750a91 100644 --- a/ompi/mca/coll/hierarch/coll_hierarch_reduce.c +++ b/ompi/mca/coll/hierarch/coll_hierarch_reduce.c @@ -22,15 +22,15 @@ #include "mpi.h" #include "ompi/include/constants.h" #include "opal/util/output.h" +#include "communicator/communicator.h" +#include "datatype/datatype.h" #include "mca/coll/coll.h" -#include "mca/coll/base/base.h" -#include "coll_hierarch.h" /* * reduce_intra * - * Function: - reduction using O(N) algorithm + * Function: - reduction using two level hierarchy algorithm * Accepts: - same as MPI_Reduce() * Returns: - MPI_SUCCESS or error code */ @@ -39,5 +39,57 @@ int mca_coll_hierarch_reduce_intra(void *sbuf, void *rbuf, int count, struct ompi_op_t *op, int root, struct ompi_communicator_t *comm) { - return OMPI_SUCCESS; + struct mca_coll_base_comm_t *data=NULL; + struct ompi_communicator_t *llcomm=NULL; + struct ompi_communicator_t *lcomm=NULL; + int rank, lrank; + int ret; + int lleader, llroot; + long extent, true_extent, lb, true_lb; + char *tmpbuf=NULL, *tbuf=NULL; + + rank = ompi_comm_rank ( comm ); + data = comm->c_coll_selected_data; + lcomm = data->hier_lcomm; + + if ( MPI_COMM_NULL != lcomm ) { + mca_coll_hierarch_get_lleader ( root, data, &lleader ); + + lrank = ompi_comm_rank (lcomm); + if ( lrank == lleader ) { + ompi_ddt_get_extent(dtype, &lb, &extent); + ompi_ddt_get_true_extent(dtype, &true_lb, &true_extent); + + tbuf = malloc(true_extent + (count - 1) * extent); + if (NULL == tbuf) { + return OMPI_ERR_OUT_OF_RESOURCE; + } + tmpbuf = tbuf - lb; + } + + if ( MPI_IN_PLACE != sbuf ) { + ret = lcomm->c_coll.coll_reduce (sbuf, tmpbuf, count, dtype, + op, lleader, lcomm); + } + else { + ret = lcomm->c_coll.coll_reduce (rbuf, tmpbuf, count, dtype, + op, lleader, lcomm); + } + if ( OMPI_SUCCESS != ret ) { + goto exit; + } + } + + llcomm = mca_coll_hierarch_get_llcomm ( root, data, &llroot); + if ( MPI_UNDEFINED != llroot ) { + ret = llcomm->c_coll.coll_reduce (tmpbuf, rbuf, count, dtype, + op, llroot, llcomm); + } + + exit: + if ( NULL != tmpbuf ) { + free ( tmpbuf ); + } + + return ret; }