From 9bd9c92dbdeb0edcf090d5257ceafea0ff4d279f Mon Sep 17 00:00:00 2001 From: Jelena Pjesivac-Grbovic Date: Mon, 13 Aug 2007 17:35:50 +0000 Subject: [PATCH] Making sure that the decision function for scatter and gather correctly computes everything for MPI_IN_PLACE case. This commit was SVN r15841. --- .../coll/tuned/coll_tuned_decision_fixed.c | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/ompi/mca/coll/tuned/coll_tuned_decision_fixed.c b/ompi/mca/coll/tuned/coll_tuned_decision_fixed.c index 6316ad3043..3c8bab9afb 100644 --- a/ompi/mca/coll/tuned/coll_tuned_decision_fixed.c +++ b/ompi/mca/coll/tuned/coll_tuned_decision_fixed.c @@ -655,17 +655,23 @@ int ompi_coll_tuned_gather_intra_dec_fixed(void *sbuf, int scount, const int large_communicator_size = 60; const int small_communicator_size = 10; - int communicator_size; - size_t sdsize, block_size; + int communicator_size, rank; + size_t dsize, block_size; OPAL_OUTPUT((ompi_coll_tuned_stream, "ompi_coll_tuned_gather_intra_dec_fixed")); communicator_size = ompi_comm_size(comm); - + rank = ompi_comm_rank(comm); + /* Determine block size */ - ompi_ddt_type_size(sdtype, &sdsize); - block_size = sdsize * scount; + if (rank == root) { + ompi_ddt_type_size(rdtype, &dsize); + block_size = dsize * rcount; + } else { + ompi_ddt_type_size(sdtype, &dsize); + block_size = dsize * scount; + } if (block_size > large_block_size) { return ompi_coll_tuned_gather_intra_linear_sync (sbuf, scount, sdtype, @@ -710,17 +716,23 @@ int ompi_coll_tuned_scatter_intra_dec_fixed(void *sbuf, int scount, { const size_t small_block_size = 300; const int small_comm_size = 10; - int communicator_size; - size_t rdsize, block_size; + int communicator_size, rank; + size_t dsize, block_size; OPAL_OUTPUT((ompi_coll_tuned_stream, "ompi_coll_tuned_scatter_intra_dec_fixed")); communicator_size = ompi_comm_size(comm); + rank = ompi_comm_rank(comm); /* Determine block size */ - ompi_ddt_type_size(rdtype, &rdsize); - block_size = rdsize * rcount; - + if (root == rank) { + ompi_ddt_type_size(sdtype, &dsize); + block_size = dsize * scount; + } else { + ompi_ddt_type_size(rdtype, &dsize); + block_size = dsize * rcount; + } + if ((communicator_size > small_comm_size) && (block_size < small_block_size)) { return ompi_coll_tuned_scatter_intra_binomial (sbuf, scount, sdtype,