/** * Shared memory reduction. * * Simply farms out to the associative or non-associative functions. */ int mca_coll_sm_reduce_intra(void *sbuf, void* rbuf, int count, struct ompi_datatype_t *dtype, struct ompi_op_t *op, int root, struct ompi_communicator_t *comm) { size_t size; /* There are several possibilities: * * 0. If the datatype is larger than a segment, fall back to basic * 1. If the op is user-defined, use the strict order * 2. If the op is intrinsic: * a. If the op is float-associative, use the unordered * b. If the op is not float-asociative: * i. if the data is floating point, use the strict order * ii. if the data is not floating point, use the unordered */ ompi_ddt_type_size(dtype, &size); if ((int)size > mca_coll_sm_component.sm_control_size) { return comm->c_coll_basic_module->coll_reduce(sbuf, rbuf, count, dtype, op, root, comm); } #if WANT_REDUCE_NO_ORDER else if (!ompi_op_is_intrinsic(op) || (ompi_op_is_intrinsic(op) && !ompi_op_is_float_assoc(op) && 0 != (dtype->flags & DT_FLAG_DATA_FLOAT))) { return reduce_inorder(sbuf, rbuf, count, dtype, op, root, comm); } else { return reduce_no_order(sbuf, rbuf, count, dtype, op, root, comm); } #else else { return reduce_inorder(sbuf, rbuf, count, dtype, op, root, comm);
/** * Shared memory reduction. * * Simply farms out to the associative or non-associative functions. */ int mca_coll_sm_reduce_intra(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) { size_t size; mca_coll_sm_module_t *sm_module = (mca_coll_sm_module_t*) module; /* There are several possibilities: * * 0. If the datatype is larger than a segment, fall back to * underlying module * 1. If the op is user-defined, use the strict order * 2. If the op is intrinsic: * a. If the op is float-associative, use the unordered * b. If the op is not float-associative: * i. if the data is floating point, use the strict order * ii. if the data is not floating point, use the unordered */ ompi_ddt_type_size(dtype, &size); if ((int)size > mca_coll_sm_component.sm_control_size) { return sm_module->previous_reduce(sbuf, rbuf, count, dtype, op, root, comm, sm_module->previous_reduce_module); } #if WANT_REDUCE_NO_ORDER else { /* Lazily enable the module the first time we invoke a collective on it */ if (!sm_module->enabled) { if (OMPI_SUCCESS != (ret = ompi_coll_sm_lazy_enable(module, comm))) { return ret; } } if (!ompi_op_is_intrinsic(op) || (ompi_op_is_intrinsic(op) && !ompi_op_is_float_assoc(op) && 0 != (dtype->flags & OMPI_DATATYPE_FLAG_DATA_FLOAT))) { return reduce_inorder(sbuf, rbuf, count, dtype, op, root, comm, module); } else { return reduce_no_order(sbuf, rbuf, count, dtype, op, root, comm, module); } } #else else { /* Lazily enable the module the first time we invoke a collective on it */ if (!sm_module->enabled) {