100 строки
3.4 KiB
C
100 строки
3.4 KiB
C
/*
|
|
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
|
* University Research and Technology
|
|
* Corporation. All rights reserved.
|
|
* Copyright (c) 2004-2006 The University of Tennessee and The University
|
|
* of Tennessee Research Foundation. All rights
|
|
* reserved.
|
|
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
|
* University of Stuttgart. All rights reserved.
|
|
* Copyright (c) 2004-2005 The Regents of the University of California.
|
|
* All rights reserved.
|
|
* Copyright (c) 2006 Sun Microsystems, Inc. All rights reserved.
|
|
* Copyright (c) 2008-2009 Cisco Systems, Inc. All rights reserved.
|
|
* $COPYRIGHT$
|
|
*
|
|
* Additional copyrights may follow
|
|
*
|
|
* $HEADER$
|
|
*/
|
|
/**
|
|
* @file
|
|
*
|
|
* This framework is for the selection and assignment of "op" modules
|
|
* to intrinsic MPI_Op objects. This framework is not used for
|
|
* user-defined MPI_Op objects.
|
|
*
|
|
* The main idea is to let intrinsic MPI_Ops be able to utilize
|
|
* functions from multiple op modules, based on the (datatype,
|
|
* operation) tuple. Hence, it is possible for specialized hardware
|
|
* to be utilized for datatypes and operations that are supported.
|
|
*/
|
|
|
|
#ifndef MCA_OP_BASE_H
|
|
#define MCA_OP_BASE_H
|
|
|
|
#include "ompi_config.h"
|
|
#include "opal/mca/base/base.h"
|
|
#include "ompi/mca/op/op.h"
|
|
|
|
BEGIN_C_DECLS
|
|
|
|
typedef struct ompi_op_base_selected_module_t {
|
|
opal_list_item_t super;
|
|
ompi_op_base_component_t *op_component;
|
|
ompi_op_base_module_t *op_module;
|
|
} ompi_op_base_selected_module_t;
|
|
|
|
|
|
/**
|
|
* Find all available op components.
|
|
*/
|
|
OMPI_DECLSPEC int ompi_op_base_find_available(bool enable_progress_threads,
|
|
bool enable_mpi_threads);
|
|
|
|
/**
|
|
* Select an available component for a new intrinsice MPI_Op (this
|
|
* function is *not* used for user-defined MPI_Ops!).
|
|
*
|
|
* @param op MPI_Op that the component will be selected for.
|
|
*
|
|
* @return OMPI_SUCCESS Upon success.
|
|
* @return OMPI_ERROR Upon failure.
|
|
*
|
|
* Note that the types of the parameters have "struct" in them (e.g.,
|
|
* ompi_op_t" vs. a plain "ompi_op_t") to avoid an include file loop.
|
|
* All similar types (e.g., "struct ompi_op_t *", "ompi_op_t *", and
|
|
* "MPI_Op") are all typedef'ed to be the same, so the fact that we
|
|
* use struct here in the prototype is ok.
|
|
*
|
|
* This function is invoked when a new MPI_Op is created and
|
|
* op components need to be selected for it.
|
|
*/
|
|
int ompi_op_base_op_select(struct ompi_op_t *op);
|
|
|
|
/**
|
|
* Finalize all op modules on a specific (intrinsic) MPI_Op.
|
|
*
|
|
* @param op The op that is being destroyed.
|
|
*
|
|
* @retval OMPI_SUCCESS Always.
|
|
*
|
|
* Note that the type of the parameter is only a "struct ompi_op_t"
|
|
* (vs. a plain "ompi_op_t") to avoid an include file loop. The types
|
|
* "struct ompi_op_t *", "ompi_op_t *", and "MPI_Op" are all
|
|
* typedef'ed to be the same, so the fact that we use struct here in
|
|
* the prototype is ok.
|
|
*
|
|
* This function is invoked near the beginning of the destruction of
|
|
* an op. It finalizes the op modules associated with the MPI_Op
|
|
* (e.g., allowing the component to clean up and free any resources
|
|
* allocated for that MPI_Op) by calling the destructor on each
|
|
* object.
|
|
*/
|
|
OMPI_DECLSPEC int ompi_op_base_op_unselect(struct ompi_op_t *op);
|
|
|
|
OMPI_DECLSPEC extern mca_base_framework_t ompi_op_base_framework;
|
|
|
|
END_C_DECLS
|
|
#endif /* MCA_OP_BASE_H */
|