1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
/*
* Copyright (c) 2014-2020 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "ompi/op/op.h"
#include "coll_adapt.h"
#include "coll_adapt_algorithms.h"
/* MPI_Reduce and MPI_Ireduce in the ADAPT module only work for commutative operations */
int ompi_coll_adapt_reduce(const void *sbuf, void *rbuf, int count, struct ompi_datatype_t *dtype,
struct ompi_op_t *op, int root, struct ompi_communicator_t *comm,
mca_coll_base_module_t * module)
{
/* Fall-back if operation is commutative */
if (!ompi_op_is_commute(op)){
mca_coll_adapt_module_t *adapt_module = (mca_coll_adapt_module_t *) module;
OPAL_OUTPUT_VERBOSE((30, mca_coll_adapt_component.adapt_output,
"ADAPT cannot handle reduce with this (commutative) operation. It needs to fall back on another component\n"));
return adapt_module->previous_reduce(sbuf, rbuf, count, dtype, op, root,
comm,
adapt_module->previous_reduce_module);
}
ompi_request_t *request = NULL;
int err = ompi_coll_adapt_ireduce(sbuf, rbuf, count, dtype, op, root, comm, &request, module);
if( MPI_SUCCESS != err ) {
if( NULL == request )
return err;
}
ompi_request_wait(&request, MPI_STATUS_IGNORE);
return err;
}
|