From 655b0b79f5c63fc1066fe1cfb347fa1c3cb91b20 Mon Sep 17 00:00:00 2001 From: degomme Date: Sat, 11 Feb 2017 19:31:09 +0100 Subject: [PATCH] add MPI_Reduce_scatter_block support for MPI_IN_PLACE --- src/smpi/smpi_pmpi.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/smpi/smpi_pmpi.cpp b/src/smpi/smpi_pmpi.cpp index 287b0e887e..e51c138b6d 100644 --- a/src/smpi/smpi_pmpi.cpp +++ b/src/smpi/smpi_pmpi.cpp @@ -2248,7 +2248,7 @@ int PMPI_Reduce_scatter_block(void *sendbuf, void *recvbuf, int recvcount, } else if (recvcount < 0) { retval = MPI_ERR_ARG; } else { - int count=smpi_comm_size(comm); + int count=smpi_comm_size(comm); int rank = comm != MPI_COMM_NULL ? smpi_process_index() : -1; instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); @@ -2263,17 +2263,25 @@ int PMPI_Reduce_scatter_block(void *sendbuf, void *recvbuf, int recvcount, extra->recvcounts= xbt_new(int, count); for(i=0; i< count; i++)//copy data to avoid bad free extra->recvcounts[i] = recvcount*dt_size_send; + void* sendtmpbuf=sendbuf; + if(sendbuf==MPI_IN_PLACE){ + sendtmpbuf= static_cast(xbt_malloc(recvcount*count*smpi_datatype_size(datatype))); + memcpy(sendtmpbuf,recvbuf, recvcount*count*smpi_datatype_size(datatype)); + } TRACE_smpi_collective_in(rank, -1, __FUNCTION__,extra); int* recvcounts=static_cast(xbt_malloc(count*sizeof(int))); - for (i=0; i