Skip to content
Snippets Groups Projects
Verified Commit 84cbefbf authored by raphael.bach's avatar raphael.bach
Browse files

Add `fmpi_mpi_world_reduce_in_place()`

parent f633bb0a
No related branches found
No related tags found
No related merge requests found
......@@ -230,6 +230,13 @@ 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
);
/*------------------------------------------------------------------------------
fmpi_mpi_world_reduce_in_place()
------------------------------------------------------------------------------*/
int fmpi_mpi_world_reduce_in_place(
const struct fmpi_mpi_ctx * ctx, void * buf, size_t cnt, MPI_Datatype type,
MPI_Op op
);
/*==============================================================================
GUARD
==============================================================================*/
......
......@@ -293,3 +293,24 @@ int fmpi_mpi_reduce_in_place(
}
return fmpi_mpi_check_error(ctx, err, "MPI_Reduce");
}
/*------------------------------------------------------------------------------
fmpi_mpi_world_reduce_in_place()
------------------------------------------------------------------------------*/
int fmpi_mpi_world_reduce_in_place(
const struct fmpi_mpi_ctx * const ctx, void * const buf, const size_t cnt,
MPI_Datatype type, MPI_Op op
){
assert(ctx != NULL);
assert(buf != NULL);
assert(cnt <= INT_MAX);
const int err = fmpi_mpi_reduce_in_place(
ctx, buf, cnt, type, op, ctx->root, ctx->world
);
if(err != FMPI_SUCCESS) {
FMPI_RAISE_ERROR(ctx->err_handler, "FMPI",
"fmpi_mpi_reduce_in_place() failed!"
);
}
return err;
}
......@@ -180,22 +180,19 @@ int fmpi_task_finalize(
assert(ctx != NULL);
assert(task != NULL);
if(op == FMPI_TASK_OP_NONE) {
return 0;
return FMPI_SUCCESS;
}
if(op == FMPI_TASK_OP_SUM) {
if(fmpi_mpi_is_root(ctx->mpi)) {
MPI_Reduce(
MPI_IN_PLACE, task->args.out.raw, (int)task->args.out.cnt,
fmpi_mpi_type(task->args.out.type.base), MPI_SUM,
ctx->mpi->root, ctx->mpi->world
const int err = fmpi_mpi_world_reduce_in_place(
ctx->mpi, task->args.out.raw, task->args.out.cnt,
fmpi_mpi_type(task->args.out.type.base), MPI_SUM
);
} else {
MPI_Reduce(
task->args.out.raw, task->args.out.raw, (int)task->args.out.cnt,
fmpi_mpi_type(task->args.out.type.base), MPI_SUM,
ctx->mpi->root, ctx->mpi->world
if(err != FMPI_SUCCESS) {
FMPI_RAISE_ERROR(ctx->err_handler, "FMPI",
"fmpi_mpi_world_reduce_in_place() failed!"
);
}
return err;
}
return 0;
return FMPI_SUCCESS;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment