diff --git a/include/fmpi_task.h b/include/fmpi_task.h index 5f65604a3fda279fc7fc8677394f01d999c67049..39e26cad537fb3f28fadee7ef3896c3425f0dae5 100644 --- a/include/fmpi_task.h +++ b/include/fmpi_task.h @@ -55,7 +55,8 @@ ------------------------------------------------------------------------------*/ typedef enum fmpi_task_op { FMPI_TASK_OP_NONE = 0, - FMPI_TASK_OP_SUM + FMPI_TASK_OP_SUM, + FMPI_TASK_OP_GATHER } fmpi_task_op; /*------------------------------------------------------------------------------ fmpi_task_args diff --git a/src/fmpi_task.c b/src/fmpi_task.c index 66c017845f85067d8133af8c2acc3111ceffb9bd..8b482f4fb87fae383364183b7d65f5fc7edc6fb8 100644 --- a/src/fmpi_task.c +++ b/src/fmpi_task.c @@ -194,5 +194,18 @@ int fmpi_task_finalize( } return err; } + if(op == FMPI_TASK_OP_GATHER) { + const size_t cnt = task->domains[0].parts[ctx->mpi->rank].inner.cnt; + MPI_Datatype type = fmpi_mpi_type(task->args.out.type.base); + const int err = fmpi_mpi_world_gather_in_place( + ctx->mpi, task->args.out.raw, type, cnt, cnt + ); + if(err != FMPI_SUCCESS) { + FMPI_RAISE_ERROR(ctx->err_handler, "FMPI", + "fmpi_mpi_world_gather_in_place() failed!" + ); + } + return err; + } return FMPI_SUCCESS; }