Skip to content

Commit e70a30c

Browse files
committed
coll/libnbc: optimize zero size ialltoall{v,w} with MPI_IN_PLACE
and incidentally avoids malloc(0) Thanks Lisandro Dalcin for the report Fixes #2945 Signed-off-by: Gilles Gouaillardet <gilles@rist.or.jp>
1 parent 1294954 commit e70a30c

File tree

2 files changed

+23
-9
lines changed

2 files changed

+23
-9
lines changed

ompi/mca/coll/libnbc/nbc_ialltoallv.c

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* Corporation. All rights reserved.
66
* Copyright (c) 2006 The Technical University of Chemnitz. All
77
* rights reserved.
8-
* Copyright (c) 2014-2016 Research Organization for Information Science
8+
* Copyright (c) 2014-2017 Research Organization for Information Science
99
* and Technology (RIST). All rights reserved.
1010
* Copyright (c) 2015-2017 Los Alamos National Security, LLC. All rights
1111
* reserved.
@@ -74,6 +74,11 @@ int ompi_coll_libnbc_ialltoallv(const void* sendbuf, const int *sendcounts, cons
7474
}
7575
}
7676
span = opal_datatype_span(&recvtype->super, count, &gap);
77+
if (OPAL_UNLIKELY(0 == span)) {
78+
*request = &ompi_request_empty;
79+
NBC_Return_handle (handle);
80+
return MPI_SUCCESS;
81+
}
7782
handle->tmpbuf = malloc(span);
7883
if (OPAL_UNLIKELY(NULL == handle->tmpbuf)) {
7984
NBC_Return_handle (handle);
@@ -85,6 +90,7 @@ int ompi_coll_libnbc_ialltoallv(const void* sendbuf, const int *sendcounts, cons
8590
res = ompi_datatype_type_extent (sendtype, &sndext);
8691
if (MPI_SUCCESS != res) {
8792
NBC_Error("MPI Error in ompi_datatype_type_extent() (%i)", res);
93+
NBC_Return_handle (handle);
8894
return res;
8995
}
9096
if (sendcounts[rank] != 0) {
@@ -338,13 +344,15 @@ static inline int a2av_sched_inplace(int rank, int p, NBC_Schedule *schedule,
338344
if (OPAL_UNLIKELY(OMPI_SUCCESS != res)) {
339345
return res;
340346
}
341-
res = NBC_Sched_send ((void *)(-gap), true , counts[peer], type, peer, schedule, false);
342-
if (OPAL_UNLIKELY(OMPI_SUCCESS != res)) {
343-
return res;
344-
}
345-
res = NBC_Sched_recv (tbuf, false , counts[peer], type, peer, schedule, true);
346-
if (OPAL_UNLIKELY(OMPI_SUCCESS != res)) {
347-
return res;
347+
if (0 != counts[peer]) {
348+
res = NBC_Sched_send ((void *)(-gap), true , counts[peer], type, peer, schedule, false);
349+
if (OPAL_UNLIKELY(OMPI_SUCCESS != res)) {
350+
return res;
351+
}
352+
res = NBC_Sched_recv (tbuf, false , counts[peer], type, peer, schedule, true);
353+
if (OPAL_UNLIKELY(OMPI_SUCCESS != res)) {
354+
return res;
355+
}
348356
}
349357
}
350358

ompi/mca/coll/libnbc/nbc_ialltoallw.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* Corporation. All rights reserved.
66
* Copyright (c) 2006 The Technical University of Chemnitz. All
77
* rights reserved.
8-
* Copyright (c) 2014-2016 Research Organization for Information Science
8+
* Copyright (c) 2014-2017 Research Organization for Information Science
99
* and Technology (RIST). All rights reserved.
1010
* Copyright (c) 2015-2017 Los Alamos National Security, LLC. All rights
1111
* reserved.
@@ -67,6 +67,11 @@ int ompi_coll_libnbc_ialltoallw(const void* sendbuf, const int *sendcounts, cons
6767
span = lspan;
6868
}
6969
}
70+
if (OPAL_UNLIKELY(0 == span)) {
71+
*request = &ompi_request_empty;
72+
NBC_Return_handle (handle);
73+
return OMPI_SUCCESS;
74+
}
7075
handle->tmpbuf = malloc(span);
7176
if (OPAL_UNLIKELY(NULL == handle->tmpbuf)) {
7277
NBC_Return_handle (handle);
@@ -80,6 +85,7 @@ int ompi_coll_libnbc_ialltoallw(const void* sendbuf, const int *sendcounts, cons
8085
sbuf = (char *) sendbuf + sdispls[rank];
8186
res = NBC_Copy(sbuf, sendcounts[rank], sendtypes[rank], rbuf, recvcounts[rank], recvtypes[rank], comm);
8287
if (OPAL_UNLIKELY(OMPI_SUCCESS != res)) {
88+
NBC_Return_handle (handle);
8389
return res;
8490
}
8591
}

0 commit comments

Comments
 (0)