Skip to content

Commit 917d96b

Browse files
committed
coll/libnbc: cleanup handling of the second temporary buffer in ireduce
1 parent ed9139c commit 917d96b

File tree

1 file changed

+12
-10
lines changed

1 file changed

+12
-10
lines changed

ompi/mca/coll/libnbc/nbc_ireduce.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
#include "nbc_internal.h"
2121

22-
static inline int red_sched_binomial (int rank, int p, int root, const void *sendbuf, void *redbuf, int count, MPI_Datatype datatype,
22+
static inline int red_sched_binomial (int rank, int p, int root, const void *sendbuf, void *redbuf, char tmpredbuf, int count, MPI_Datatype datatype,
2323
MPI_Op op, char inplace, NBC_Schedule *schedule, NBC_Handle *handle);
2424
static inline int red_sched_chain (int rank, int p, int root, const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
2525
MPI_Op op, int ext, size_t size, NBC_Schedule *schedule, NBC_Handle *handle, int fragsize);
@@ -56,6 +56,7 @@ int ompi_coll_libnbc_ireduce(const void* sendbuf, void* recvbuf, int count, MPI_
5656
MPI_Aint ext;
5757
NBC_Schedule *schedule;
5858
char *redbuf=NULL, inplace;
59+
char tmpredbuf = 0;
5960
enum { NBC_RED_BINOMIAL, NBC_RED_CHAIN } alg;
6061
NBC_Handle *handle;
6162
ompi_coll_libnbc_module_t *libnbc_module = (ompi_coll_libnbc_module_t*) module;
@@ -107,7 +108,8 @@ int ompi_coll_libnbc_ireduce(const void* sendbuf, void* recvbuf, int count, MPI_
107108
/* recvbuf may not be valid on non-root nodes */
108109
ptrdiff_t span_align = OPAL_ALIGN(span, datatype->super.align, ptrdiff_t);
109110
handle->tmpbuf = malloc (span_align + span);
110-
redbuf = (char*) handle->tmpbuf + span_align - gap;
111+
redbuf = (char*)span_align - gap;
112+
tmpredbuf = 1;
111113
}
112114
} else {
113115
handle->tmpbuf = malloc (span);
@@ -144,7 +146,7 @@ int ompi_coll_libnbc_ireduce(const void* sendbuf, void* recvbuf, int count, MPI_
144146

145147
switch(alg) {
146148
case NBC_RED_BINOMIAL:
147-
res = red_sched_binomial(rank, p, root, sendbuf, redbuf, count, datatype, op, inplace, schedule, handle);
149+
res = red_sched_binomial(rank, p, root, sendbuf, redbuf, tmpredbuf, count, datatype, op, inplace, schedule, handle);
148150
break;
149151
case NBC_RED_CHAIN:
150152
res = red_sched_chain(rank, p, root, sendbuf, recvbuf, count, datatype, op, ext, size, schedule, handle, segsize);
@@ -291,10 +293,10 @@ int ompi_coll_libnbc_ireduce_inter(const void* sendbuf, void* recvbuf, int count
291293
if (vrank == 0) rank = root; \
292294
if (vrank == root) rank = 0; \
293295
}
294-
static inline int red_sched_binomial (int rank, int p, int root, const void *sendbuf, void *redbuf, int count, MPI_Datatype datatype,
296+
static inline int red_sched_binomial (int rank, int p, int root, const void *sendbuf, void *redbuf, char tmpredbuf, int count, MPI_Datatype datatype,
295297
MPI_Op op, char inplace, NBC_Schedule *schedule, NBC_Handle *handle) {
296298
int vroot, vrank, vpeer, peer, res, maxr;
297-
char *rbuf, *lbuf, *buf;
299+
char *rbuf, *lbuf, *buf, tmpbuf;
298300
int tmprbuf, tmplbuf;
299301
ptrdiff_t gap;
300302
(void)opal_datatype_span(&datatype->super, count, &gap);
@@ -312,12 +314,12 @@ static inline int red_sched_binomial (int rank, int p, int root, const void *sen
312314
rbuf = (void *)(-gap);
313315
tmprbuf = true;
314316
lbuf = redbuf;
315-
tmplbuf = false;
317+
tmplbuf = tmpredbuf;
316318
} else {
317319
lbuf = (void *)(-gap);
318320
tmplbuf = true;
319321
rbuf = redbuf;
320-
tmprbuf = false;
322+
tmprbuf = tmpredbuf;
321323
if (inplace) {
322324
res = NBC_Copy(rbuf, count, datatype, ((char *)handle->tmpbuf)-gap, count, datatype, MPI_COMM_SELF);
323325
if (OPAL_UNLIKELY(OMPI_SUCCESS != res)) {
@@ -354,7 +356,7 @@ static inline int red_sched_binomial (int rank, int p, int root, const void *sen
354356
}
355357
/* swap left and right buffers */
356358
buf = rbuf; rbuf = lbuf ; lbuf = buf;
357-
tmprbuf ^= 1; tmplbuf ^= 1;
359+
tmpbuf = tmprbuf; tmprbuf = tmplbuf; tmplbuf = tmpbuf;
358360
}
359361
} else {
360362
/* we have to send this round */
@@ -379,9 +381,9 @@ static inline int red_sched_binomial (int rank, int p, int root, const void *sen
379381
/* send to root if vroot ! root */
380382
if (vroot != root) {
381383
if (0 == rank) {
382-
res = NBC_Sched_send (redbuf, false, count, datatype, root, schedule, false);
384+
res = NBC_Sched_send (redbuf, tmpredbuf, count, datatype, root, schedule, false);
383385
} else if (root == rank) {
384-
res = NBC_Sched_recv (redbuf, false, count, datatype, vroot, schedule, false);
386+
res = NBC_Sched_recv (redbuf, tmpredbuf, count, datatype, vroot, schedule, false);
385387
}
386388
}
387389

0 commit comments

Comments
 (0)