diff --git a/include/internal/fmpi_mpi.h b/include/internal/fmpi_mpi.h index 91fbf91f3e160a4bcb4bf0e67cc4512fc504ba6b..cfeadf1bdaf89c34edaa3ce94936953b63cd807e 100644 --- a/include/internal/fmpi_mpi.h +++ b/include/internal/fmpi_mpi.h @@ -223,6 +223,13 @@ int fmpi_mpi_world_gather_in_place( const struct fmpi_mpi_ctx * ctx, void * buf, MPI_Datatype type, size_t send_cnt, size_t recv_cnt ); +/*------------------------------------------------------------------------------ + fmpi_mpi_reduce_in_place() +------------------------------------------------------------------------------*/ +int fmpi_mpi_reduce_in_place( + const struct fmpi_mpi_ctx * ctx, void * buf, size_t cnt, MPI_Datatype type, + MPI_Op op, int root, MPI_Comm comm +); /*============================================================================== GUARD ==============================================================================*/ diff --git a/src/fmpi_mpi.c b/src/fmpi_mpi.c index 959b0549c5c403d1148ebe09173b37e62d572283..83dacda40e0bbbeb5ca143a7cbcaa979633cc16a 100644 --- a/src/fmpi_mpi.c +++ b/src/fmpi_mpi.c @@ -274,3 +274,22 @@ int fmpi_mpi_world_gather_in_place( } return err; } +/*------------------------------------------------------------------------------ + fmpi_mpi_reduce_in_place() +------------------------------------------------------------------------------*/ +int fmpi_mpi_reduce_in_place( + const struct fmpi_mpi_ctx * const ctx, void * const buf, const size_t cnt, + MPI_Datatype type, MPI_Op op, const int root, MPI_Comm comm +){ + assert(ctx != NULL); + assert(buf != NULL); + assert(cnt <= INT_MAX); + + int err = MPI_SUCCESS; + if(ctx->rank == root) { + err = MPI_Reduce(MPI_IN_PLACE, buf, (int)cnt, type, op, root, comm); + } else { + err = MPI_Reduce(buf, buf, (int)cnt, type, op, root, comm); + } + return fmpi_mpi_check_error(ctx, err, "MPI_Reduce"); +}