Skip to content

Commit 2374d8f

Browse files
committed
Merge pull request #1536 from kawashima-fj/pr/inplace-fix
mpi/c, mpi/fortran: Fix `MPI_IN_PLACE`-related bugs
2 parents b4e5b5c + d3d6386 commit 2374d8f

File tree

6 files changed

+21
-13
lines changed

6 files changed

+21
-13
lines changed

ompi/mpi/c/ialltoallv.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,12 @@ int MPI_Ialltoallv(const void *sendbuf, const int sendcounts[], const int sdispl
8989
FUNC_NAME);
9090
}
9191

92+
if (MPI_IN_PLACE == sendbuf) {
93+
sendcounts = recvcounts;
94+
sdispls = rdispls;
95+
sendtype = recvtype;
96+
}
97+
9298
if ((NULL == sendcounts) || (NULL == sdispls) ||
9399
(NULL == recvcounts) || (NULL == rdispls) ||
94100
(MPI_IN_PLACE == sendbuf && OMPI_COMM_IS_INTER(comm)) ||
@@ -103,10 +109,8 @@ int MPI_Ialltoallv(const void *sendbuf, const int sendcounts[], const int sdispl
103109

104110
size = OMPI_COMM_IS_INTER(comm)?ompi_comm_remote_size(comm):ompi_comm_size(comm);
105111
for (i = 0; i < size; ++i) {
106-
if (MPI_IN_PLACE != sendbuf) {
107-
OMPI_CHECK_DATATYPE_FOR_SEND(err, sendtype, sendcounts[i]);
108-
OMPI_ERRHANDLER_CHECK(err, comm, err, FUNC_NAME);
109-
}
112+
OMPI_CHECK_DATATYPE_FOR_SEND(err, sendtype, sendcounts[i]);
113+
OMPI_ERRHANDLER_CHECK(err, comm, err, FUNC_NAME);
110114
OMPI_CHECK_DATATYPE_FOR_RECV(err, recvtype, recvcounts[i]);
111115
OMPI_ERRHANDLER_CHECK(err, comm, err, FUNC_NAME);
112116
}

ompi/mpi/c/ialltoallw.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ int MPI_Ialltoallw(const void *sendbuf, const int sendcounts[], const int sdispl
6969
memchecker_datatype(recvtypes[i]);
7070
ompi_datatype_type_extent(recvtypes[i], &recv_ext);
7171
memchecker_call(&opal_memchecker_base_isaddressable,
72-
(char *)(recvbuf)+sdispls[i]*recv_ext,
72+
(char *)(recvbuf)+rdispls[i]*recv_ext,
7373
recvcounts[i], recvtypes[i]);
7474
}
7575
);
@@ -85,6 +85,12 @@ int MPI_Ialltoallw(const void *sendbuf, const int sendcounts[], const int sdispl
8585
FUNC_NAME);
8686
}
8787

88+
if (MPI_IN_PLACE == sendbuf) {
89+
sendcounts = recvcounts;
90+
sdispls = rdispls;
91+
sendtypes = recvtypes;
92+
}
93+
8894
if ((NULL == sendcounts) || (NULL == sdispls) || (NULL == sendtypes) ||
8995
(NULL == recvcounts) || (NULL == rdispls) || (NULL == recvtypes) ||
9096
(MPI_IN_PLACE == sendbuf && OMPI_COMM_IS_INTER(comm)) ||
@@ -99,10 +105,8 @@ int MPI_Ialltoallw(const void *sendbuf, const int sendcounts[], const int sdispl
99105

100106
size = OMPI_COMM_IS_INTER(comm)?ompi_comm_remote_size(comm):ompi_comm_size(comm);
101107
for (i = 0; i < size; ++i) {
102-
if (MPI_IN_PLACE != sendbuf) {
103-
OMPI_CHECK_DATATYPE_FOR_SEND(err, sendtypes[i], sendcounts[i]);
104-
OMPI_ERRHANDLER_CHECK(err, comm, err, FUNC_NAME);
105-
}
108+
OMPI_CHECK_DATATYPE_FOR_SEND(err, sendtypes[i], sendcounts[i]);
109+
OMPI_ERRHANDLER_CHECK(err, comm, err, FUNC_NAME);
106110
OMPI_CHECK_DATATYPE_FOR_RECV(err, recvtypes[i], recvcounts[i]);
107111
OMPI_ERRHANDLER_CHECK(err, comm, err, FUNC_NAME);
108112
}

ompi/mpi/fortran/mpif-h/alltoallw_f.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ void ompi_alltoallw_f(char *sendbuf, MPI_Fint *sendcounts,
9898
--size;
9999
}
100100

101-
/* Alltoallw does not support MPI_IN_PLACE */
101+
sendbuf = (char *) OMPI_F2C_IN_PLACE(sendbuf);
102102
sendbuf = (char *) OMPI_F2C_BOTTOM(sendbuf);
103103
recvbuf = (char *) OMPI_F2C_BOTTOM(recvbuf);
104104

ompi/mpi/fortran/mpif-h/exscan_f.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ void ompi_exscan_f(char *sendbuf, char *recvbuf, MPI_Fint *count,
8080
c_type = PMPI_Type_f2c(*datatype);
8181
c_op = PMPI_Op_f2c(*op);
8282

83-
/* MPI_IN_PLACE is not supported */
83+
sendbuf = (char *) OMPI_F2C_IN_PLACE(sendbuf);
8484
sendbuf = (char *) OMPI_F2C_BOTTOM (sendbuf);
8585
recvbuf = (char *) OMPI_F2C_BOTTOM (recvbuf);
8686

ompi/mpi/fortran/mpif-h/ialltoallw_f.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ void ompi_ialltoallw_f(char *sendbuf, MPI_Fint *sendcounts,
9999
--size;
100100
}
101101

102-
/* Ialltoallw does not support MPI_IN_PLACE */
102+
sendbuf = (char *) OMPI_F2C_IN_PLACE(sendbuf);
103103
sendbuf = (char *) OMPI_F2C_BOTTOM(sendbuf);
104104
recvbuf = (char *) OMPI_F2C_BOTTOM(recvbuf);
105105

ompi/mpi/fortran/mpif-h/iexscan_f.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ void ompi_iexscan_f(char *sendbuf, char *recvbuf, MPI_Fint *count,
8181
c_type = PMPI_Type_f2c(*datatype);
8282
c_op = PMPI_Op_f2c(*op);
8383

84-
/* MPI_IN_PLACE is not supported */
84+
sendbuf = (char *) OMPI_F2C_IN_PLACE(sendbuf);
8585
sendbuf = (char *) OMPI_F2C_BOTTOM (sendbuf);
8686
recvbuf = (char *) OMPI_F2C_BOTTOM (recvbuf);
8787

0 commit comments

Comments
 (0)