Skip to content

Commit 152c21b

Browse files
committed
memchecker: fix some problems with arg checking
The code which is conditionally compiled when Open MPI is configured with the --enable-memchecker had some bugs. In particular the ompi_datatype_type_extent function was being invoked for some rooted collectives for ranks where the datatype being checked doesn't have to be defined. Also in certain cases the wrong datatype (send,recv) was not being correctly checked. These problems only show up when using the --enable-memchecker config option. Signed-off-by: Howard Pritchard <[email protected]>
1 parent 96864aa commit 152c21b

File tree

7 files changed

+15
-8
lines changed

7 files changed

+15
-8
lines changed

ompi/mpi/c/gather.c.in

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,13 @@ PROTOTYPE ERROR_CLASS gather(BUFFER sendbuf, COUNT sendcount, DATATYPE sendtype,
5050
ptrdiff_t ext;
5151

5252
rank = ompi_comm_rank(comm);
53-
ompi_datatype_type_extent(recvtype, &ext);
5453

5554
memchecker_comm(comm);
5655
if(OMPI_COMM_IS_INTRA(comm)) {
5756
if(ompi_comm_rank(comm) == root) {
5857
/* check whether root's send buffer is defined. */
58+
memchecker_datatype(recvtype);
59+
ompi_datatype_type_extent(recvtype, &ext);
5960
if (MPI_IN_PLACE == sendbuf) {
6061
memchecker_call(&opal_memchecker_base_isdefined,
6162
(char *)(recvbuf)+rank*ext,

ompi/mpi/c/gather_init.c.in

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,14 @@ PROTOTYPE ERROR_CLASS gather_init(BUFFER sendbuf, COUNT sendcount, DATATYPE send
5050
ptrdiff_t ext;
5151

5252
rank = ompi_comm_rank(comm);
53-
ompi_datatype_type_extent(recvtype, &ext);
5453

5554
memchecker_comm(comm);
5655
if(OMPI_COMM_IS_INTRA(comm)) {
5756
if(ompi_comm_rank(comm) == root) {
5857
/* check whether root's send buffer is defined. */
5958
if (MPI_IN_PLACE == sendbuf) {
59+
memchecker_datatype(recvtype);
60+
ompi_datatype_type_extent(recvtype, &ext);
6061
memchecker_call(&opal_memchecker_base_isdefined,
6162
(char *)(recvbuf)+rank*ext,
6263
recvcount, recvtype);

ompi/mpi/c/gatherv.c.in

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,12 @@ PROTOTYPE ERROR_CLASS gatherv(BUFFER sendbuf, COUNT sendcount, DATATYPE sendtype
4949
ptrdiff_t ext;
5050

5151
size = ompi_comm_remote_size(comm);
52-
ompi_datatype_type_extent(recvtype, &ext);
5352

5453
memchecker_comm(comm);
5554
if(OMPI_COMM_IS_INTRA(comm)) {
5655
if(ompi_comm_rank(comm) == root) {
56+
memchecker_datatype(recvtype);
57+
ompi_datatype_type_extent(recvtype, &ext);
5758
/* check whether root's send buffer is defined. */
5859
if (MPI_IN_PLACE == sendbuf) {
5960
for (i = 0; i < size; i++) {
@@ -66,7 +67,6 @@ PROTOTYPE ERROR_CLASS gatherv(BUFFER sendbuf, COUNT sendcount, DATATYPE sendtype
6667
memchecker_call(&opal_memchecker_base_isdefined, sendbuf, sendcount, sendtype);
6768
}
6869

69-
memchecker_datatype(recvtype);
7070
/* check whether root's receive buffer is addressable. */
7171
for (i = 0; i < size; i++) {
7272
memchecker_call(&opal_memchecker_base_isaddressable,
@@ -82,6 +82,7 @@ PROTOTYPE ERROR_CLASS gatherv(BUFFER sendbuf, COUNT sendcount, DATATYPE sendtype
8282
if (MPI_ROOT == root) {
8383
memchecker_datatype(recvtype);
8484
/* check whether root's receive buffer is addressable. */
85+
ompi_datatype_type_extent(recvtype, &ext);
8586
for (i = 0; i < size; i++) {
8687
memchecker_call(&opal_memchecker_base_isaddressable,
8788
(char *)(recvbuf)+displs[i]*ext,

ompi/mpi/c/igather.c.in

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,14 @@ PROTOTYPE ERROR_CLASS igather(BUFFER sendbuf, COUNT sendcount, DATATYPE sendtype
5151
ptrdiff_t ext;
5252

5353
rank = ompi_comm_rank(comm);
54-
ompi_datatype_type_extent(recvtype, &ext);
5554

5655
memchecker_comm(comm);
5756
if(OMPI_COMM_IS_INTRA(comm)) {
5857
if(ompi_comm_rank(comm) == root) {
5958
/* check whether root's send buffer is defined. */
6059
if (MPI_IN_PLACE == sendbuf) {
60+
memchecker_datatype(recvtype);
61+
ompi_datatype_type_extent(recvtype, &ext);
6162
memchecker_call(&opal_memchecker_base_isdefined,
6263
(char *)(recvbuf)+rank*ext,
6364
recvcount, recvtype);

ompi/mpi/c/iscatterv.c.in

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,12 @@ PROTOTYPE ERROR_CLASS iscatterv(BUFFER sendbuf, COUNT_ARRAY sendcounts, DISP_ARR
4949
ptrdiff_t ext;
5050

5151
size = ompi_comm_remote_size(comm);
52-
ompi_datatype_type_extent(recvtype, &ext);
5352

5453
memchecker_comm(comm);
5554
if(OMPI_COMM_IS_INTRA(comm)) {
5655
if(ompi_comm_rank(comm) == root) {
5756
memchecker_datatype(sendtype);
57+
ompi_datatype_type_extent(sendtype, &ext);
5858
/* check whether root's send buffer is defined. */
5959
for (i = 0; i < size; i++) {
6060
memchecker_call(&opal_memchecker_base_isdefined,
@@ -74,6 +74,7 @@ PROTOTYPE ERROR_CLASS iscatterv(BUFFER sendbuf, COUNT_ARRAY sendcounts, DISP_ARR
7474
} else {
7575
if(MPI_ROOT == root) {
7676
memchecker_datatype(sendtype);
77+
ompi_datatype_type_extent(sendtype, &ext);
7778
/* check whether root's send buffer is defined. */
7879
for (i = 0; i < size; i++) {
7980
memchecker_call(&opal_memchecker_base_isdefined,

ompi/mpi/c/scatterv.c.in

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,12 @@ PROTOTYPE ERROR_CLASS scatterv(BUFFER sendbuf, COUNT_ARRAY sendcounts, DISP_ARRA
4949
ptrdiff_t ext;
5050

5151
size = ompi_comm_remote_size(comm);
52-
ompi_datatype_type_extent(recvtype, &ext);
5352

5453
memchecker_comm(comm);
5554
if(OMPI_COMM_IS_INTRA(comm)) {
5655
if(ompi_comm_rank(comm) == root) {
5756
memchecker_datatype(sendtype);
57+
ompi_datatype_type_extent(sendtype, &ext);
5858
/* check whether root's send buffer is defined. */
5959
for (i = 0; i < size; i++) {
6060
memchecker_call(&opal_memchecker_base_isdefined,
@@ -74,6 +74,7 @@ PROTOTYPE ERROR_CLASS scatterv(BUFFER sendbuf, COUNT_ARRAY sendcounts, DISP_ARRA
7474
} else {
7575
if(MPI_ROOT == root) {
7676
memchecker_datatype(sendtype);
77+
ompi_datatype_type_extent(sendtype, &ext);
7778
/* check whether root's send buffer is defined. */
7879
for (i = 0; i < size; i++) {
7980
memchecker_call(&opal_memchecker_base_isdefined,

ompi/mpi/c/scatterv_init.c.in

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,12 @@ PROTOTYPE ERROR_CLASS scatterv_init(BUFFER sendbuf, COUNT_ARRAY sendcounts, DISP
4949
ptrdiff_t ext;
5050

5151
size = ompi_comm_remote_size(comm);
52-
ompi_datatype_type_extent(recvtype, &ext);
5352

5453
memchecker_comm(comm);
5554
if(OMPI_COMM_IS_INTRA(comm)) {
5655
if(ompi_comm_rank(comm) == root) {
5756
memchecker_datatype(sendtype);
57+
ompi_datatype_type_extent(sendtype, &ext);
5858
/* check whether root's send buffer is defined. */
5959
for (i = 0; i < size; i++) {
6060
memchecker_call(&opal_memchecker_base_isdefined,
@@ -74,6 +74,7 @@ PROTOTYPE ERROR_CLASS scatterv_init(BUFFER sendbuf, COUNT_ARRAY sendcounts, DISP
7474
} else {
7575
if(MPI_ROOT == root) {
7676
memchecker_datatype(sendtype);
77+
ompi_datatype_type_extent(sendtype, &ext);
7778
/* check whether root's send buffer is defined. */
7879
for (i = 0; i < size; i++) {
7980
memchecker_call(&opal_memchecker_base_isdefined,

0 commit comments

Comments
 (0)