From 97b1e65cf6c516185e4142467783a74839a8354e Mon Sep 17 00:00:00 2001 From: degomme Date: Sat, 11 Feb 2017 18:36:45 +0100 Subject: [PATCH] fix reduce_scatter in place --- src/smpi/smpi_pmpi.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/smpi/smpi_pmpi.cpp b/src/smpi/smpi_pmpi.cpp index 6504976ff0..287b0e887e 100644 --- a/src/smpi/smpi_pmpi.cpp +++ b/src/smpi/smpi_pmpi.cpp @@ -2208,17 +2208,25 @@ int PMPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts, MPI_Datat dt_size_send = smpi_datatype_size(datatype); extra->send_size = 0; extra->recvcounts= xbt_new(int, size); - for(i=0; i< size; i++)//copy data to avoid bad free + int totalcount = 0; + for(i=0; i< size; i++){//copy data to avoid bad free extra->recvcounts[i] = recvcounts[i]*dt_size_send; - TRACE_smpi_collective_in(rank, -1, __FUNCTION__,extra); - + totalcount+= recvcounts[i]; + } void* sendtmpbuf=sendbuf; - if(sendbuf==MPI_IN_PLACE) - sendtmpbuf=recvbuf; + if(sendbuf==MPI_IN_PLACE){ + sendtmpbuf= static_cast(xbt_malloc(totalcount*smpi_datatype_size(datatype))); + memcpy(sendtmpbuf,recvbuf, totalcount*smpi_datatype_size(datatype)); + } - mpi_coll_reduce_scatter_fun(sendtmpbuf, recvbuf, recvcounts, datatype, op, comm); - retval = MPI_SUCCESS; + TRACE_smpi_collective_in(rank, -1, __FUNCTION__,extra); + + mpi_coll_reduce_scatter_fun(sendtmpbuf, recvbuf, recvcounts, datatype, op, comm); + retval = MPI_SUCCESS; TRACE_smpi_collective_out(rank, -1, __FUNCTION__); + + if(sendbuf==MPI_IN_PLACE) + xbt_free(sendtmpbuf); } smpi_bench_begin(); -- 2.20.1