mirror of https://gitee.com/openkylin/openmpi.git
41 lines
1.5 KiB
C
41 lines
1.5 KiB
C
/*
|
|
* 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;
|
|
}
|