This fixes bug #1157 in coll/self module.
All vector functions had incorrect handling of the offset. This commit was SVN r16360.
Этот коммит содержится в:
@ -40,6 +40,12 @@ int mca_coll_self_allgatherv_intra(void *sbuf, int scount,
|
|||||||
if (MPI_IN_PLACE == sbuf) {
|
if (MPI_IN_PLACE == sbuf) {
|
||||||
return MPI_SUCCESS;
|
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,
|
return ompi_ddt_sndrcv(sbuf, scount, sdtype,
|
||||||
((char *) rbuf) + disps[0], rcounts[0], rdtype);
|
((char *) rbuf) + disps[0], rcounts[0], rdtype);
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,18 @@ mca_coll_self_alltoallv_intra(void *sbuf, int *scounts, int *sdisps,
|
|||||||
struct ompi_communicator_t *comm,
|
struct ompi_communicator_t *comm,
|
||||||
struct mca_coll_base_module_1_1_0_t *module)
|
struct mca_coll_base_module_1_1_0_t *module)
|
||||||
{
|
{
|
||||||
return ompi_ddt_sndrcv(((char *) sbuf) + sdisps[0], scounts[0], sdtype,
|
int err;
|
||||||
((char *) rbuf) + rdisps[0], rcounts[0], rdtype);
|
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);
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,19 @@ int mca_coll_self_alltoallw_intra(void *sbuf, int *scounts, int *sdisps,
|
|||||||
struct ompi_communicator_t *comm,
|
struct ompi_communicator_t *comm,
|
||||||
struct mca_coll_base_module_1_1_0_t *module)
|
struct mca_coll_base_module_1_1_0_t *module)
|
||||||
{
|
{
|
||||||
return ompi_ddt_sndrcv(((char *) sbuf) + sdisps[0], scounts[0], sdtypes[0],
|
int err;
|
||||||
((char *) rbuf) + rdisps[0], rcounts[0], rdtypes[0]);
|
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]);
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,14 @@ int mca_coll_self_gatherv_intra(void *sbuf, int scount,
|
|||||||
if (MPI_IN_PLACE == sbuf) {
|
if (MPI_IN_PLACE == sbuf) {
|
||||||
return MPI_SUCCESS;
|
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,
|
return ompi_ddt_sndrcv(sbuf, scount, sdtype,
|
||||||
((char *) rbuf) + disps[0], rcounts[0], rdtype);
|
((char *) rbuf) + disps[0]*extent,
|
||||||
|
rcounts[0], rdtype);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,13 @@ int mca_coll_self_scatterv_intra(void *sbuf, int *scounts,
|
|||||||
if (MPI_IN_PLACE == rbuf) {
|
if (MPI_IN_PLACE == rbuf) {
|
||||||
return MPI_SUCCESS;
|
return MPI_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
return ompi_ddt_sndrcv(((char *) sbuf) + disps[0], scounts[0], sdtype,
|
int err;
|
||||||
rbuf, rcount, rdtype);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Ссылка в новой задаче
Block a user