From f9788aa64f8305d7c56780a44ab0e70ed2072edf Mon Sep 17 00:00:00 2001 From: Jeff Squyres Date: Tue, 7 Jun 2005 13:56:57 +0000 Subject: [PATCH] Fix buffer allocation problem when running with the log reduce algorithm. This commit was SVN r5966. --- src/mca/coll/basic/coll_basic_reduce.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/mca/coll/basic/coll_basic_reduce.c b/src/mca/coll/basic/coll_basic_reduce.c index 8601ca00be..8ece68a1fd 100644 --- a/src/mca/coll/basic/coll_basic_reduce.c +++ b/src/mca/coll/basic/coll_basic_reduce.c @@ -268,6 +268,7 @@ int mca_coll_basic_reduce_log_intra(void *sbuf, void *rbuf, int count, int mask; long true_lb, true_extent, lb, extent; char *free_buffer = NULL; + char *free_rbuf = NULL; char *pml_buffer = NULL; char *snd_buffer = sbuf; char *rcv_buffer = rbuf; @@ -306,6 +307,18 @@ int mca_coll_basic_reduce_log_intra(void *sbuf, void *rbuf, int count, if( ompi_op_is_commute(op) ) { rcv_buffer = pml_buffer; } + + if (rank != root && 0 == (vrank & 1)) { + /* root is the only one required to provide a valid rbuf. + Assume rbuf is invalid for all other ranks, so fix it up + here to be valid on all non-leaf ranks */ + free_rbuf = malloc(true_extent + (count - 1) * extent); + if (NULL == free_rbuf) { + free(free_buffer); + return OMPI_ERR_OUT_OF_RESOURCE; + } + rbuf = free_rbuf - lb; + } } /* Loop over cube dimensions. High processes send to low ones in the @@ -327,6 +340,9 @@ int mca_coll_basic_reduce_log_intra(void *sbuf, void *rbuf, int count, if (NULL != free_buffer) { free(free_buffer); } + if (NULL != free_rbuf) { + free(free_rbuf); + } return err; } snd_buffer = rbuf; @@ -361,6 +377,9 @@ int mca_coll_basic_reduce_log_intra(void *sbuf, void *rbuf, int count, if (NULL != free_buffer) { free(free_buffer); } + if (NULL != free_rbuf) { + free(free_rbuf); + } return err; } /* Perform the operation. The target is always the user @@ -412,6 +431,9 @@ int mca_coll_basic_reduce_log_intra(void *sbuf, void *rbuf, int count, if (NULL != free_buffer) { free(free_buffer); } + if (NULL != free_rbuf) { + free(free_rbuf); + } /* All done */