From ada43fef9e3f9aa52c1658429427c9969e7a678b Mon Sep 17 00:00:00 2001 From: Jelena Pjesivac-Grbovic Date: Fri, 5 Oct 2007 17:40:16 +0000 Subject: [PATCH] This fixes bug #1157 in coll/self module. All vector functions had incorrect handling of the offset. This commit was SVN r16360. --- ompi/mca/coll/self/coll_self_allgatherv.c | 6 ++++++ ompi/mca/coll/self/coll_self_alltoallv.c | 16 ++++++++++++++-- ompi/mca/coll/self/coll_self_alltoallw.c | 17 +++++++++++++++-- ompi/mca/coll/self/coll_self_gatherv.c | 11 +++++++++-- ompi/mca/coll/self/coll_self_scatterv.c | 10 ++++++++-- 5 files changed, 52 insertions(+), 8 deletions(-) diff --git a/ompi/mca/coll/self/coll_self_allgatherv.c b/ompi/mca/coll/self/coll_self_allgatherv.c index 363f263394..f2a686fff5 100644 --- a/ompi/mca/coll/self/coll_self_allgatherv.c +++ b/ompi/mca/coll/self/coll_self_allgatherv.c @@ -40,6 +40,12 @@ int mca_coll_self_allgatherv_intra(void *sbuf, int scount, if (MPI_IN_PLACE == sbuf) { return MPI_SUCCESS; } else { + int err; + ptrdiff_t lb, extent; + err = ompi_ddt_get_extent(rdtype, &lb, &extent); + if (OMPI_SUCCESS != err) { + return OMPI_ERROR; + } return ompi_ddt_sndrcv(sbuf, scount, sdtype, ((char *) rbuf) + disps[0], rcounts[0], rdtype); } diff --git a/ompi/mca/coll/self/coll_self_alltoallv.c b/ompi/mca/coll/self/coll_self_alltoallv.c index f5710b7063..b2ffcfd8d9 100644 --- a/ompi/mca/coll/self/coll_self_alltoallv.c +++ b/ompi/mca/coll/self/coll_self_alltoallv.c @@ -38,6 +38,18 @@ mca_coll_self_alltoallv_intra(void *sbuf, int *scounts, int *sdisps, struct ompi_communicator_t *comm, struct mca_coll_base_module_1_1_0_t *module) { - return ompi_ddt_sndrcv(((char *) sbuf) + sdisps[0], scounts[0], sdtype, - ((char *) rbuf) + rdisps[0], rcounts[0], rdtype); + int err; + ptrdiff_t lb, rextent, sextent; + err = ompi_ddt_get_extent(sdtype, &lb, &sextent); + if (OMPI_SUCCESS != err) { + return OMPI_ERROR; + } + err = ompi_ddt_get_extent(rdtype, &lb, &rextent); + if (OMPI_SUCCESS != err) { + return OMPI_ERROR; + } + return ompi_ddt_sndrcv(((char *) sbuf) + sdisps[0] * sextent, + scounts[0], sdtype, + ((char *) rbuf) + rdisps[0] * rextent, + rcounts[0], rdtype); } diff --git a/ompi/mca/coll/self/coll_self_alltoallw.c b/ompi/mca/coll/self/coll_self_alltoallw.c index 5a8b7dd9e1..08e63d4add 100644 --- a/ompi/mca/coll/self/coll_self_alltoallw.c +++ b/ompi/mca/coll/self/coll_self_alltoallw.c @@ -37,6 +37,19 @@ int mca_coll_self_alltoallw_intra(void *sbuf, int *scounts, int *sdisps, struct ompi_communicator_t *comm, struct mca_coll_base_module_1_1_0_t *module) { - return ompi_ddt_sndrcv(((char *) sbuf) + sdisps[0], scounts[0], sdtypes[0], - ((char *) rbuf) + rdisps[0], rcounts[0], rdtypes[0]); + int err; + ptrdiff_t lb, rextent, sextent; + err = ompi_ddt_get_extent(sdtypes[0], &lb, &sextent); + if (OMPI_SUCCESS != err) { + return OMPI_ERROR; + } + err = ompi_ddt_get_extent(rdtypes[0], &lb, &rextent); + if (OMPI_SUCCESS != err) { + return OMPI_ERROR; + } + + return ompi_ddt_sndrcv(((char *) sbuf) + sdisps[0] * sextent, + scounts[0], sdtypes[0], + ((char *) rbuf) + rdisps[0] * rextent, + rcounts[0], rdtypes[0]); } diff --git a/ompi/mca/coll/self/coll_self_gatherv.c b/ompi/mca/coll/self/coll_self_gatherv.c index 504dde5779..f0d7461604 100644 --- a/ompi/mca/coll/self/coll_self_gatherv.c +++ b/ompi/mca/coll/self/coll_self_gatherv.c @@ -39,8 +39,15 @@ int mca_coll_self_gatherv_intra(void *sbuf, int scount, { if (MPI_IN_PLACE == sbuf) { return MPI_SUCCESS; - } else { + } else { + int err; + ptrdiff_t lb, extent; + err = ompi_ddt_get_extent(rdtype, &lb, &extent); + if (OMPI_SUCCESS != err) { + return OMPI_ERROR; + } return ompi_ddt_sndrcv(sbuf, scount, sdtype, - ((char *) rbuf) + disps[0], rcounts[0], rdtype); + ((char *) rbuf) + disps[0]*extent, + rcounts[0], rdtype); } } diff --git a/ompi/mca/coll/self/coll_self_scatterv.c b/ompi/mca/coll/self/coll_self_scatterv.c index 24e42aa106..18a6a6123b 100644 --- a/ompi/mca/coll/self/coll_self_scatterv.c +++ b/ompi/mca/coll/self/coll_self_scatterv.c @@ -40,7 +40,13 @@ int mca_coll_self_scatterv_intra(void *sbuf, int *scounts, if (MPI_IN_PLACE == rbuf) { return MPI_SUCCESS; } else { - return ompi_ddt_sndrcv(((char *) sbuf) + disps[0], scounts[0], sdtype, - rbuf, rcount, rdtype); + int err; + ptrdiff_t lb, extent; + err = ompi_ddt_get_extent(sdtype, &lb, &extent); + if (OMPI_SUCCESS != err) { + return OMPI_ERROR; + } + return ompi_ddt_sndrcv(((char *) sbuf) + disps[0]*extent, scounts[0], + sdtype, rbuf, rcount, rdtype); } }