root/ompi/mca/coll/coll.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
   2 /*
   3  * Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
   4  *                         University Research and Technology
   5  *                         Corporation.  All rights reserved.
   6  * Copyright (c) 2004-2015 The University of Tennessee and The University
   7  *                         of Tennessee Research Foundation.  All rights
   8  *                         reserved.
   9  * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
  10  *                         University of Stuttgart.  All rights reserved.
  11  * Copyright (c) 2004-2005 The Regents of the University of California.
  12  *                         All rights reserved.
  13  * Copyright (c) 2007-2008 Cisco Systems, Inc.  All rights reserved.
  14  * Copyright (c) 2007-2008 UT-Battelle, LLC
  15  * Copyright (c) 2012      Oak Rigde National Laboratory. All rights reserved.
  16  * Copyright (c) 2013-2015 Los Alamos National Security, LLC. All rights
  17  *                         reserved.
  18  * Copyright (c) 2014-2015 Research Organization for Information Science
  19  *                         and Technology (RIST). All rights reserved.
  20  * Copyright (c) 2016-2017 IBM Corporation.  All rights reserved.
  21  * Copyright (c) 2017      FUJITSU LIMITED.  All rights reserved.
  22  * $COPYRIGHT$
  23  *
  24  * Additional copyrights may follow
  25  *
  26  * $HEADER$
  27  */
  28 
  29 /**
  30  * @file
  31  *
  32  * Collective Communication Interface
  33  *
  34  * Interface for implementing the collective communication interface
  35  * of MPI.  The MPI interface provides error checking and error
  36  * handler invocation, but the collective components provide all other
  37  * functionality.
  38  *
  39  * Component selection is done per commuicator, at Communicator
  40  * construction time.  mca_coll_base_comm_select() is used to
  41  * create the list of components available to the compoenent
  42  * collm_comm_query function, instantiating a module for each
  43  * component that i usable, and sets the module collective function pointers.
  44  * mca_coll_base_comm_select() then loops through the list of available
  45  * components (via the instantiated module), and uses the
  46  * module's coll_module_enable() function to enable the modules, and
  47  * if successful, sets the communicator collective functions to the
  48  * those supplied by the given module, keeping track of which module it
  49  * is associated with.
  50  *
  51  * The module destructors are called for each module used by the
  52  * communicator, at communicator desctruction time.
  53  *
  54  * This can result in up to N different components being used for a
  55  * single communicator, one per needed collective function.
  56  *
  57  * The interface is the same for inter- or intra-communicators, and
  58  * components should be able to handle either style of communicator
  59  * during initialization (although handling may include indicating the
  60  * component is not available).
  61  */
  62 
  63 #ifndef OMPI_MCA_COLL_COLL_H
  64 #define OMPI_MCA_COLL_COLL_H
  65 
  66 #include "ompi_config.h"
  67 
  68 #include "mpi.h"
  69 #include "ompi/mca/mca.h"
  70 #include "opal/mca/base/base.h"
  71 
  72 #include "opal/mca/crs/crs.h"
  73 #include "opal/mca/crs/base/base.h"
  74 #include "ompi/request/request.h"
  75 
  76 BEGIN_C_DECLS
  77 
  78 
  79 /* ******************************************************************** */
  80 
  81 
  82 struct ompi_communicator_t;
  83 struct ompi_datatype_t;
  84 struct ompi_op_t;
  85 
  86 
  87 /* ******************************************************************** */
  88 
  89 
  90 /**
  91  * Collective component initialization
  92  *
  93  * Initialize the given collective component.  This function should
  94  * initialize any component-level. data.  It will be called exactly
  95  * once during MPI_INIT.
  96  *
  97  * @note The component framework is not lazily opened, so attempts
  98  * should be made to minimze the amount of memory allocated during
  99  * this function.
 100  *
 101  * @param[in] enable_progress_threads True if the component needs to
 102  *                                support progress threads
 103  * @param[in] enable_mpi_threads  True if the component needs to
 104  *                                support MPI_THREAD_MULTIPLE
 105  *
 106  * @retval OMPI_SUCCESS Component successfully initialized
 107  * @retval OMPI_ERROR   An unspecified error occurred
 108  */
 109 typedef int (*mca_coll_base_component_init_query_fn_t)
 110      (bool enable_progress_threads, bool enable_mpi_threads);
 111 
 112 
 113 
 114 /**
 115  * Query whether a component is available for the given communicator
 116  *
 117  * Query whether the component is available for the given
 118  * communicator.  If the component is available, an object should be
 119  * allocated and returned (with refcount at 1).  The module will not
 120  * be used for collective operations until module_enable() is called
 121  * on the module, but may be destroyed (via OBJ_RELEASE) either before
 122  * or after module_enable() is called.  If the module needs to release
 123  * resources obtained during query(), it should do so in the module
 124  * destructor.
 125  *
 126  * A component may provide NULL to this function to indicate it does
 127  * not wish to run or return an error during module_enable().
 128  *
 129  * @note The communicator is available for point-to-point
 130  * communication, but other functionality is not available during this
 131  * phase of initialization.
 132  *
 133  * @param[in] comm        The communicator being created
 134  * @param[out] priority   Priority setting for component on
 135  *                        this communicator
 136  *
 137  * @returns An initialized module structure if the component can
 138  * provide a module with the requested functionality or NULL if the
 139  * component should not be used on the given communicator.
 140  */
 141 typedef struct mca_coll_base_module_2_3_0_t *
 142   (*mca_coll_base_component_comm_query_2_0_0_fn_t)
 143     (struct ompi_communicator_t *comm, int *priority);
 144 
 145 
 146 /* ******************************************************************** */
 147 
 148 
 149 /**
 150  * Enable module for collective communication
 151  *
 152  * Enable the module for collective communication.  Modules are enabled
 153  * in order from lowest to highest priority.  At each component,
 154  * collective functions with priority higher than the existing
 155  * function are copied into the communicator's function table and the
 156  * module's reference count is incremented.  Replaced functions have
 157  * their module's reference count decremented, so a component will go
 158  * out of scope when it has been examined and is no longer used in any
 159  * collective functions.
 160  *
 161  * Because the function list is built on increasing priority, a
 162  * component that needs functions from a lower priority component
 163  * (say, a multi-cast barrier that might need a point-to-point barrier
 164  * for resource exhaustion issues) can keep the function pointer and
 165  * module pointer and increase the reference count of the module and
 166  * use the module during execution.
 167  *
 168  * When a module is not used for any interface functions and no
 169  * higher-priority module has increased its refcount, it will have
 170  * it's destructor triggered and the module will be destroyed.
 171  *
 172  * @note The collective component should not modify the communicator
 173  * during this operation.  The communicator will be updated with the
 174  * collective algorithm's function pointers and module (and the ref
 175  * count increased on the module) by the base selection functionality.
 176  *
 177  * @param[in/out] module     Module created during comm_query()
 178  * @param[in]     comm       Communicator being created
 179  */
 180 typedef int
 181 (*mca_coll_base_module_enable_1_1_0_fn_t)(struct mca_coll_base_module_2_3_0_t* module,
 182                                           struct ompi_communicator_t *comm);
 183 
 184 
 185 /**
 186  * Disable module for collective communication
 187  *
 188  * Disable the module for collective communication. This callback is
 189  * meant to avoid unused modules referencing unused modules
 190  * (and hence avoid memory leaks).
 191  *
 192  * @param[in/out] module     Module disabled during mca_coll_base_comm_unselect
 193  * @param[in]     comm       Communicator being disabled
 194  */
 195 typedef int
 196 (*mca_coll_base_module_disable_1_2_0_fn_t)(struct mca_coll_base_module_2_3_0_t* module,
 197                                           struct ompi_communicator_t *comm);
 198 
 199 /* blocking collectives */
 200 typedef int (*mca_coll_base_module_allgather_fn_t)
 201   (const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
 202    void *rbuf, int rcount, struct ompi_datatype_t *rdtype,
 203    struct ompi_communicator_t *comm, struct mca_coll_base_module_2_3_0_t *module);
 204 typedef int (*mca_coll_base_module_allgatherv_fn_t)
 205   (const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
 206    void * rbuf, const int *rcounts, const int *disps,  struct ompi_datatype_t *rdtype,
 207    struct ompi_communicator_t *comm, struct mca_coll_base_module_2_3_0_t *module);
 208 typedef int (*mca_coll_base_module_allreduce_fn_t)
 209   (const void *sbuf, void *rbuf, int count, struct ompi_datatype_t *dtype,
 210    struct ompi_op_t *op, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_3_0_t *module);
 211 typedef int (*mca_coll_base_module_alltoall_fn_t)
 212   (const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
 213    void* rbuf, int rcount, struct ompi_datatype_t *rdtype,
 214    struct ompi_communicator_t *comm, struct mca_coll_base_module_2_3_0_t *module);
 215 typedef int (*mca_coll_base_module_alltoallv_fn_t)
 216   (const void *sbuf, const int *scounts, const int *sdisps, struct ompi_datatype_t *sdtype,
 217    void *rbuf, const int *rcounts, const int *rdisps, struct ompi_datatype_t *rdtype,
 218    struct ompi_communicator_t *comm, struct mca_coll_base_module_2_3_0_t *module);
 219 typedef int (*mca_coll_base_module_alltoallw_fn_t)
 220   (const void *sbuf, const int *scounts, const int *sdisps, struct ompi_datatype_t * const *sdtypes,
 221    void *rbuf, const int *rcounts, const int *rdisps, struct ompi_datatype_t * const *rdtypes,
 222    struct ompi_communicator_t *comm, struct mca_coll_base_module_2_3_0_t *module);
 223 typedef int (*mca_coll_base_module_barrier_fn_t)
 224   (struct ompi_communicator_t *comm, struct mca_coll_base_module_2_3_0_t *module);
 225 typedef int (*mca_coll_base_module_bcast_fn_t)
 226   (void *buff, int count, struct ompi_datatype_t *datatype, int root,
 227    struct ompi_communicator_t *comm, struct mca_coll_base_module_2_3_0_t *module);
 228 typedef int (*mca_coll_base_module_exscan_fn_t)
 229   (const void *sbuf, void *rbuf, int count, struct ompi_datatype_t *dtype,
 230    struct ompi_op_t *op, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_3_0_t *module);
 231 typedef int (*mca_coll_base_module_gather_fn_t)
 232   (const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
 233    void *rbuf, int rcount, struct ompi_datatype_t *rdtype,
 234    int root, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_3_0_t *module);
 235 typedef int (*mca_coll_base_module_gatherv_fn_t)
 236   (const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
 237    void *rbuf, const int *rcounts, const int *disps, struct ompi_datatype_t *rdtype,
 238    int root, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_3_0_t *module);
 239 typedef int (*mca_coll_base_module_reduce_fn_t)
 240   (const void *sbuf, void* rbuf, int count, struct ompi_datatype_t *dtype,
 241    struct ompi_op_t *op, int root, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_3_0_t *module);
 242 typedef int (*mca_coll_base_module_reduce_scatter_fn_t)
 243   (const void *sbuf, void *rbuf, const int *rcounts, struct ompi_datatype_t *dtype,
 244    struct ompi_op_t *op, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_3_0_t *module);
 245 typedef int (*mca_coll_base_module_reduce_scatter_block_fn_t)
 246   (const void *sbuf, void *rbuf, int rcount, struct ompi_datatype_t *dtype,
 247    struct ompi_op_t *op, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_3_0_t *module);
 248 typedef int (*mca_coll_base_module_scan_fn_t)
 249   (const void *sbuf, void *rbuf, int count, struct ompi_datatype_t *dtype,
 250    struct ompi_op_t *op, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_3_0_t *module);
 251 typedef int (*mca_coll_base_module_scatter_fn_t)
 252   (const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
 253    void *rbuf, int rcount, struct ompi_datatype_t *rdtype,
 254    int root, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_3_0_t *module);
 255 typedef int (*mca_coll_base_module_scatterv_fn_t)
 256   (const void *sbuf, const int *scounts, const int *disps, struct ompi_datatype_t *sdtype,
 257    void* rbuf, int rcount, struct ompi_datatype_t *rdtype,
 258    int root, struct ompi_communicator_t *comm, struct mca_coll_base_module_2_3_0_t *module);
 259 
 260 /* nonblocking collectives */
 261 typedef int (*mca_coll_base_module_iallgather_fn_t)
 262   (const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
 263    void *rbuf, int rcount, struct ompi_datatype_t *rdtype,
 264    struct ompi_communicator_t *comm, ompi_request_t ** request,
 265    struct mca_coll_base_module_2_3_0_t *module);
 266 typedef int (*mca_coll_base_module_iallgatherv_fn_t)
 267   (const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
 268    void * rbuf, const int *rcounts, const int *disps,  struct ompi_datatype_t *rdtype,
 269    struct ompi_communicator_t *comm, ompi_request_t ** request,
 270    struct mca_coll_base_module_2_3_0_t *module);
 271 typedef int (*mca_coll_base_module_iallreduce_fn_t)
 272   (const void *sbuf, void *rbuf, int count, struct ompi_datatype_t *dtype,
 273    struct ompi_op_t *op, struct ompi_communicator_t *comm,
 274    ompi_request_t ** request, struct mca_coll_base_module_2_3_0_t *module);
 275 typedef int (*mca_coll_base_module_ialltoall_fn_t)
 276   (const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
 277    void* rbuf, int rcount, struct ompi_datatype_t *rdtype,
 278    struct ompi_communicator_t *comm, ompi_request_t ** request,
 279    struct mca_coll_base_module_2_3_0_t *module);
 280 typedef int (*mca_coll_base_module_ialltoallv_fn_t)
 281   (const void *sbuf, const int *scounts, const int *sdisps, struct ompi_datatype_t *sdtype,
 282    void *rbuf, const int *rcounts, const int *rdisps, struct ompi_datatype_t *rdtype,
 283    struct ompi_communicator_t *comm, ompi_request_t ** request,
 284    struct mca_coll_base_module_2_3_0_t *module);
 285 typedef int (*mca_coll_base_module_ialltoallw_fn_t)
 286   (const void *sbuf, const int *scounts, const int *sdisps, struct ompi_datatype_t * const *sdtypes,
 287    void *rbuf, const int *rcounts, const int *rdisps, struct ompi_datatype_t * const *rdtypes,
 288    struct ompi_communicator_t *comm, ompi_request_t ** request,
 289    struct mca_coll_base_module_2_3_0_t *module);
 290 typedef int (*mca_coll_base_module_ibarrier_fn_t)
 291   (struct ompi_communicator_t *comm, ompi_request_t ** request,
 292    struct mca_coll_base_module_2_3_0_t *module);
 293 typedef int (*mca_coll_base_module_ibcast_fn_t)
 294   (void *buff, int count, struct ompi_datatype_t *datatype, int root,
 295    struct ompi_communicator_t *comm, ompi_request_t ** request,
 296    struct mca_coll_base_module_2_3_0_t *module);
 297 typedef int (*mca_coll_base_module_iexscan_fn_t)
 298   (const void *sbuf, void *rbuf, int count, struct ompi_datatype_t *dtype,
 299    struct ompi_op_t *op, struct ompi_communicator_t *comm, ompi_request_t ** request,
 300    struct mca_coll_base_module_2_3_0_t *module);
 301 typedef int (*mca_coll_base_module_igather_fn_t)
 302   (const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
 303    void *rbuf, int rcount, struct ompi_datatype_t *rdtype,
 304    int root, struct ompi_communicator_t *comm, ompi_request_t ** request,
 305    struct mca_coll_base_module_2_3_0_t *module);
 306 typedef int (*mca_coll_base_module_igatherv_fn_t)
 307   (const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
 308    void *rbuf, const int *rcounts, const int *disps, struct ompi_datatype_t *rdtype,
 309    int root, struct ompi_communicator_t *comm, ompi_request_t ** request,
 310    struct mca_coll_base_module_2_3_0_t *module);
 311 typedef int (*mca_coll_base_module_ireduce_fn_t)
 312   (const void *sbuf, void* rbuf, int count, struct ompi_datatype_t *dtype,
 313    struct ompi_op_t *op, int root, struct ompi_communicator_t *comm, ompi_request_t ** request,
 314    struct mca_coll_base_module_2_3_0_t *module);
 315 typedef int (*mca_coll_base_module_ireduce_scatter_fn_t)
 316   (const void *sbuf, void *rbuf, const int *rcounts, struct ompi_datatype_t *dtype,
 317    struct ompi_op_t *op, struct ompi_communicator_t *comm, ompi_request_t ** request,
 318    struct mca_coll_base_module_2_3_0_t *module);
 319 typedef int (*mca_coll_base_module_ireduce_scatter_block_fn_t)
 320   (const void *sbuf, void *rbuf, int rcount, struct ompi_datatype_t *dtype,
 321    struct ompi_op_t *op, struct ompi_communicator_t *comm, ompi_request_t ** request,
 322    struct mca_coll_base_module_2_3_0_t *module);
 323 typedef int (*mca_coll_base_module_iscan_fn_t)
 324   (const void *sbuf, void *rbuf, int count, struct ompi_datatype_t *dtype,
 325    struct ompi_op_t *op, struct ompi_communicator_t *comm, ompi_request_t ** request,
 326    struct mca_coll_base_module_2_3_0_t *module);
 327 typedef int (*mca_coll_base_module_iscatter_fn_t)
 328   (const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
 329    void *rbuf, int rcount, struct ompi_datatype_t *rdtype,
 330    int root, struct ompi_communicator_t *comm, ompi_request_t ** request,
 331    struct mca_coll_base_module_2_3_0_t *module);
 332 typedef int (*mca_coll_base_module_iscatterv_fn_t)
 333   (const void *sbuf, const int *scounts, const int *disps, struct ompi_datatype_t *sdtype,
 334    void* rbuf, int rcount, struct ompi_datatype_t *rdtype,
 335    int root, struct ompi_communicator_t *comm, ompi_request_t ** request,
 336    struct mca_coll_base_module_2_3_0_t *module);
 337 
 338 /* persistent collectives */
 339 typedef int (*mca_coll_base_module_allgather_init_fn_t)
 340   (const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
 341    void *rbuf, int rcount, struct ompi_datatype_t *rdtype,
 342    struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
 343    struct mca_coll_base_module_2_3_0_t *module);
 344 typedef int (*mca_coll_base_module_allgatherv_init_fn_t)
 345   (const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
 346    void * rbuf, const int *rcounts, const int *disps,  struct ompi_datatype_t *rdtype,
 347    struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
 348    struct mca_coll_base_module_2_3_0_t *module);
 349 typedef int (*mca_coll_base_module_allreduce_init_fn_t)
 350   (const void *sbuf, void *rbuf, int count, struct ompi_datatype_t *dtype,
 351    struct ompi_op_t *op, struct ompi_communicator_t *comm, struct ompi_info_t *info,
 352    ompi_request_t ** request, struct mca_coll_base_module_2_3_0_t *module);
 353 typedef int (*mca_coll_base_module_alltoall_init_fn_t)
 354   (const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
 355    void* rbuf, int rcount, struct ompi_datatype_t *rdtype,
 356    struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
 357    struct mca_coll_base_module_2_3_0_t *module);
 358 typedef int (*mca_coll_base_module_alltoallv_init_fn_t)
 359   (const void *sbuf, const int *scounts, const int *sdisps, struct ompi_datatype_t *sdtype,
 360    void *rbuf, const int *rcounts, const int *rdisps, struct ompi_datatype_t *rdtype,
 361    struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
 362    struct mca_coll_base_module_2_3_0_t *module);
 363 typedef int (*mca_coll_base_module_alltoallw_init_fn_t)
 364   (const void *sbuf, const int *scounts, const int *sdisps, struct ompi_datatype_t * const *sdtypes,
 365    void *rbuf, const int *rcounts, const int *rdisps, struct ompi_datatype_t * const *rdtypes,
 366    struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
 367    struct mca_coll_base_module_2_3_0_t *module);
 368 typedef int (*mca_coll_base_module_barrier_init_fn_t)
 369   (struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
 370    struct mca_coll_base_module_2_3_0_t *module);
 371 typedef int (*mca_coll_base_module_bcast_init_fn_t)
 372   (void *buff, int count, struct ompi_datatype_t *datatype, int root,
 373    struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
 374    struct mca_coll_base_module_2_3_0_t *module);
 375 typedef int (*mca_coll_base_module_exscan_init_fn_t)
 376   (const void *sbuf, void *rbuf, int count, struct ompi_datatype_t *dtype,
 377    struct ompi_op_t *op, struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
 378    struct mca_coll_base_module_2_3_0_t *module);
 379 typedef int (*mca_coll_base_module_gather_init_fn_t)
 380   (const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
 381    void *rbuf, int rcount, struct ompi_datatype_t *rdtype,
 382    int root, struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
 383    struct mca_coll_base_module_2_3_0_t *module);
 384 typedef int (*mca_coll_base_module_gatherv_init_fn_t)
 385   (const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
 386    void *rbuf, const int *rcounts, const int *disps, struct ompi_datatype_t *rdtype,
 387    int root, struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
 388    struct mca_coll_base_module_2_3_0_t *module);
 389 typedef int (*mca_coll_base_module_reduce_init_fn_t)
 390   (const void *sbuf, void* rbuf, int count, struct ompi_datatype_t *dtype,
 391    struct ompi_op_t *op, int root, struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
 392    struct mca_coll_base_module_2_3_0_t *module);
 393 typedef int (*mca_coll_base_module_reduce_scatter_init_fn_t)
 394   (const void *sbuf, void *rbuf, const int *rcounts, struct ompi_datatype_t *dtype,
 395    struct ompi_op_t *op, struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
 396    struct mca_coll_base_module_2_3_0_t *module);
 397 typedef int (*mca_coll_base_module_reduce_scatter_block_init_fn_t)
 398   (const void *sbuf, void *rbuf, int rcount, struct ompi_datatype_t *dtype,
 399    struct ompi_op_t *op, struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
 400    struct mca_coll_base_module_2_3_0_t *module);
 401 typedef int (*mca_coll_base_module_scan_init_fn_t)
 402   (const void *sbuf, void *rbuf, int count, struct ompi_datatype_t *dtype,
 403    struct ompi_op_t *op, struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
 404    struct mca_coll_base_module_2_3_0_t *module);
 405 typedef int (*mca_coll_base_module_scatter_init_fn_t)
 406   (const void *sbuf, int scount, struct ompi_datatype_t *sdtype,
 407    void *rbuf, int rcount, struct ompi_datatype_t *rdtype,
 408    int root, struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
 409    struct mca_coll_base_module_2_3_0_t *module);
 410 typedef int (*mca_coll_base_module_scatterv_init_fn_t)
 411   (const void *sbuf, const int *scounts, const int *disps, struct ompi_datatype_t *sdtype,
 412    void* rbuf, int rcount, struct ompi_datatype_t *rdtype,
 413    int root, struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
 414    struct mca_coll_base_module_2_3_0_t *module);
 415 
 416 /*
 417  * The signature of the neighborhood alltoallw differs from alltoallw
 418  */
 419 typedef int (*mca_coll_base_module_neighbor_alltoallw_fn_t)
 420   (const void *sbuf, const int *scounts, const MPI_Aint *sdisps, struct ompi_datatype_t * const *sdtypes,
 421    void *rbuf, const int *rcounts, const MPI_Aint *rdisps, struct ompi_datatype_t * const *rdtypes,
 422    struct ompi_communicator_t *comm, struct mca_coll_base_module_2_3_0_t *module);
 423 typedef int (*mca_coll_base_module_ineighbor_alltoallw_fn_t)
 424   (const void *sbuf, const int *scounts, const MPI_Aint *sdisps, struct ompi_datatype_t * const *sdtypes,
 425    void *rbuf, const int *rcounts, const MPI_Aint *rdisps, struct ompi_datatype_t * const *rdtypes,
 426    struct ompi_communicator_t *comm, ompi_request_t ** request,
 427    struct mca_coll_base_module_2_3_0_t *module);
 428 typedef int (*mca_coll_base_module_neighbor_alltoallw_init_fn_t)
 429   (const void *sbuf, const int *scounts, const MPI_Aint *sdisps, struct ompi_datatype_t * const *sdtypes,
 430    void *rbuf, const int *rcounts, const MPI_Aint *rdisps, struct ompi_datatype_t * const *rdtypes,
 431    struct ompi_communicator_t *comm, struct ompi_info_t *info, ompi_request_t ** request,
 432    struct mca_coll_base_module_2_3_0_t *module);
 433 
 434 /*
 435  * reduce_local
 436  * Even though this is not a collective operation, it is related to the
 437  * collectives. Adding to the framework allows a collective component the
 438  * option of intercepting it, if desired.
 439  */
 440 typedef int (*mca_coll_base_module_reduce_local_fn_t)
 441    (const void *inbuf, void *inoutbuf, int count,
 442     struct ompi_datatype_t * dtype, struct ompi_op_t * op,
 443     struct mca_coll_base_module_2_3_0_t *module);
 444 
 445 
 446 /**
 447  * Fault Tolerance Awareness function.
 448  *
 449  * Fault tolerance function -- called when a process / job state
 450  * change is noticed.
 451  *
 452  * @param[in] state    State change that triggered the function
 453  *
 454  * @retval OMPI_SUCCESS Component successfully selected
 455  * @retval OMPI_ERROR   An unspecified error occurred
 456  */
 457 typedef int (*mca_coll_base_module_ft_event_fn_t) (int state);
 458 
 459 
 460 /* ******************************************************************** */
 461 
 462 
 463 /**
 464  * Collective component interface
 465  *
 466  * Component interface for the collective framework.  A public
 467  * instance of this structure, called
 468  * mca_coll_[component_name]_component, must exist in any collective
 469  * component.
 470  */
 471 struct mca_coll_base_component_2_0_0_t {
 472     /** Base component description */
 473     mca_base_component_t collm_version;
 474     /** Base component data block */
 475     mca_base_component_data_t collm_data;
 476 
 477     /** Component initialization function */
 478     mca_coll_base_component_init_query_fn_t collm_init_query;
 479     /** Query whether component is useable for given communicator */
 480     mca_coll_base_component_comm_query_2_0_0_fn_t collm_comm_query;
 481 };
 482 typedef struct mca_coll_base_component_2_0_0_t mca_coll_base_component_2_0_0_t;
 483 
 484 /** Per guidence in mca.h, use the unversioned struct name if you just
 485     want to always keep up with the most recent version of the
 486     interace. */
 487 typedef struct mca_coll_base_component_2_0_0_t mca_coll_base_component_t;
 488 
 489 
 490 /**
 491  * Collective module interface
 492  *
 493  * Module interface to the Collective framework.  Modules are
 494  * reference counted based on the number of functions from the module
 495  * used on the commuicator.  There is at most one module per component
 496  * on a given communicator, and there can be many component modules on
 497  * a given communicator.
 498  *
 499  * @note The collective framework and the
 500  * communicator functionality only stores a pointer to the module
 501  * function, so the component is free to create a structure that
 502  * inherits from this one for use as the module structure.
 503  */
 504 struct mca_coll_base_module_2_3_0_t {
 505     /** Collective modules all inherit from opal_object */
 506     opal_object_t super;
 507 
 508     /** Enable function called when a collective module is (possibly)
 509         going to be used for the given communicator */
 510     mca_coll_base_module_enable_1_1_0_fn_t coll_module_enable;
 511 
 512     /* Collective function pointers */
 513 
 514     /* blocking functions */
 515     mca_coll_base_module_allgather_fn_t coll_allgather;
 516     mca_coll_base_module_allgatherv_fn_t coll_allgatherv;
 517     mca_coll_base_module_allreduce_fn_t coll_allreduce;
 518     mca_coll_base_module_alltoall_fn_t coll_alltoall;
 519     mca_coll_base_module_alltoallv_fn_t coll_alltoallv;
 520     mca_coll_base_module_alltoallw_fn_t coll_alltoallw;
 521     mca_coll_base_module_barrier_fn_t coll_barrier;
 522     mca_coll_base_module_bcast_fn_t coll_bcast;
 523     mca_coll_base_module_exscan_fn_t coll_exscan;
 524     mca_coll_base_module_gather_fn_t coll_gather;
 525     mca_coll_base_module_gatherv_fn_t coll_gatherv;
 526     mca_coll_base_module_reduce_fn_t coll_reduce;
 527     mca_coll_base_module_reduce_scatter_fn_t coll_reduce_scatter;
 528     mca_coll_base_module_reduce_scatter_block_fn_t coll_reduce_scatter_block;
 529     mca_coll_base_module_scan_fn_t coll_scan;
 530     mca_coll_base_module_scatter_fn_t coll_scatter;
 531     mca_coll_base_module_scatterv_fn_t coll_scatterv;
 532 
 533     /* nonblocking functions */
 534     mca_coll_base_module_iallgather_fn_t coll_iallgather;
 535     mca_coll_base_module_iallgatherv_fn_t coll_iallgatherv;
 536     mca_coll_base_module_iallreduce_fn_t coll_iallreduce;
 537     mca_coll_base_module_ialltoall_fn_t coll_ialltoall;
 538     mca_coll_base_module_ialltoallv_fn_t coll_ialltoallv;
 539     mca_coll_base_module_ialltoallw_fn_t coll_ialltoallw;
 540     mca_coll_base_module_ibarrier_fn_t coll_ibarrier;
 541     mca_coll_base_module_ibcast_fn_t coll_ibcast;
 542     mca_coll_base_module_iexscan_fn_t coll_iexscan;
 543     mca_coll_base_module_igather_fn_t coll_igather;
 544     mca_coll_base_module_igatherv_fn_t coll_igatherv;
 545     mca_coll_base_module_ireduce_fn_t coll_ireduce;
 546     mca_coll_base_module_ireduce_scatter_fn_t coll_ireduce_scatter;
 547     mca_coll_base_module_ireduce_scatter_block_fn_t coll_ireduce_scatter_block;
 548     mca_coll_base_module_iscan_fn_t coll_iscan;
 549     mca_coll_base_module_iscatter_fn_t coll_iscatter;
 550     mca_coll_base_module_iscatterv_fn_t coll_iscatterv;
 551 
 552     /* persistent functions */
 553     mca_coll_base_module_allgather_init_fn_t coll_allgather_init;
 554     mca_coll_base_module_allgatherv_init_fn_t coll_allgatherv_init;
 555     mca_coll_base_module_allreduce_init_fn_t coll_allreduce_init;
 556     mca_coll_base_module_alltoall_init_fn_t coll_alltoall_init;
 557     mca_coll_base_module_alltoallv_init_fn_t coll_alltoallv_init;
 558     mca_coll_base_module_alltoallw_init_fn_t coll_alltoallw_init;
 559     mca_coll_base_module_barrier_init_fn_t coll_barrier_init;
 560     mca_coll_base_module_bcast_init_fn_t coll_bcast_init;
 561     mca_coll_base_module_exscan_init_fn_t coll_exscan_init;
 562     mca_coll_base_module_gather_init_fn_t coll_gather_init;
 563     mca_coll_base_module_gatherv_init_fn_t coll_gatherv_init;
 564     mca_coll_base_module_reduce_init_fn_t coll_reduce_init;
 565     mca_coll_base_module_reduce_scatter_init_fn_t coll_reduce_scatter_init;
 566     mca_coll_base_module_reduce_scatter_block_init_fn_t coll_reduce_scatter_block_init;
 567     mca_coll_base_module_scan_init_fn_t coll_scan_init;
 568     mca_coll_base_module_scatter_init_fn_t coll_scatter_init;
 569     mca_coll_base_module_scatterv_init_fn_t coll_scatterv_init;
 570 
 571     /* neighborhood functions */
 572     mca_coll_base_module_allgather_fn_t coll_neighbor_allgather;
 573     mca_coll_base_module_allgatherv_fn_t coll_neighbor_allgatherv;
 574     mca_coll_base_module_alltoall_fn_t coll_neighbor_alltoall;
 575     mca_coll_base_module_alltoallv_fn_t coll_neighbor_alltoallv;
 576     mca_coll_base_module_neighbor_alltoallw_fn_t coll_neighbor_alltoallw;
 577 
 578     /* nonblocking neighborhood functions */
 579     mca_coll_base_module_iallgather_fn_t coll_ineighbor_allgather;
 580     mca_coll_base_module_iallgatherv_fn_t coll_ineighbor_allgatherv;
 581     mca_coll_base_module_ialltoall_fn_t coll_ineighbor_alltoall;
 582     mca_coll_base_module_ialltoallv_fn_t coll_ineighbor_alltoallv;
 583     mca_coll_base_module_ineighbor_alltoallw_fn_t coll_ineighbor_alltoallw;
 584 
 585     /* persistent neighborhood functions */
 586     mca_coll_base_module_allgather_init_fn_t coll_neighbor_allgather_init;
 587     mca_coll_base_module_allgatherv_init_fn_t coll_neighbor_allgatherv_init;
 588     mca_coll_base_module_alltoall_init_fn_t coll_neighbor_alltoall_init;
 589     mca_coll_base_module_alltoallv_init_fn_t coll_neighbor_alltoallv_init;
 590     mca_coll_base_module_neighbor_alltoallw_init_fn_t coll_neighbor_alltoallw_init;
 591 
 592     /** Fault tolerance event trigger function */
 593     mca_coll_base_module_ft_event_fn_t ft_event;
 594 
 595     /** Disable function called when a collective module will not
 596         be used for the given communicator */
 597     mca_coll_base_module_disable_1_2_0_fn_t coll_module_disable;
 598 
 599     mca_coll_base_module_reduce_local_fn_t coll_reduce_local;
 600 
 601     /** Data storage for all the algorithms defined in the base. Should
 602         not be used by other modules */
 603     struct mca_coll_base_comm_t* base_data;
 604 };
 605 typedef struct mca_coll_base_module_2_3_0_t mca_coll_base_module_2_3_0_t;
 606 
 607 /** Per guidence in mca.h, use the unversioned struct name if you just
 608     want to always keep up with the most recent version of the
 609     interace. */
 610 typedef struct mca_coll_base_module_2_3_0_t mca_coll_base_module_t;
 611 OMPI_DECLSPEC OBJ_CLASS_DECLARATION(mca_coll_base_module_t);
 612 
 613 /**
 614  * Collectives communicator cache structure
 615  *
 616  * Collectives communicator cache structure, used to find functions to
 617  * implement collective algorithms and their associated modules.  This
 618  * function may also be used internally by a module if it needs to
 619  * keep a large number of "backing" functions, such as the demo
 620  * component.
 621  */
 622 struct mca_coll_base_comm_coll_t {
 623 
 624     /* blocking collectives */
 625     mca_coll_base_module_allgather_fn_t coll_allgather;
 626     mca_coll_base_module_2_3_0_t *coll_allgather_module;
 627     mca_coll_base_module_allgatherv_fn_t coll_allgatherv;
 628     mca_coll_base_module_2_3_0_t *coll_allgatherv_module;
 629     mca_coll_base_module_allreduce_fn_t coll_allreduce;
 630     mca_coll_base_module_2_3_0_t *coll_allreduce_module;
 631     mca_coll_base_module_alltoall_fn_t coll_alltoall;
 632     mca_coll_base_module_2_3_0_t *coll_alltoall_module;
 633     mca_coll_base_module_alltoallv_fn_t coll_alltoallv;
 634     mca_coll_base_module_2_3_0_t *coll_alltoallv_module;
 635     mca_coll_base_module_alltoallw_fn_t coll_alltoallw;
 636     mca_coll_base_module_2_3_0_t *coll_alltoallw_module;
 637     mca_coll_base_module_barrier_fn_t coll_barrier;
 638     mca_coll_base_module_2_3_0_t *coll_barrier_module;
 639     mca_coll_base_module_bcast_fn_t coll_bcast;
 640     mca_coll_base_module_2_3_0_t *coll_bcast_module;
 641     mca_coll_base_module_exscan_fn_t coll_exscan;
 642     mca_coll_base_module_2_3_0_t *coll_exscan_module;
 643     mca_coll_base_module_gather_fn_t coll_gather;
 644     mca_coll_base_module_2_3_0_t *coll_gather_module;
 645     mca_coll_base_module_gatherv_fn_t coll_gatherv;
 646     mca_coll_base_module_2_3_0_t *coll_gatherv_module;
 647     mca_coll_base_module_reduce_fn_t coll_reduce;
 648     mca_coll_base_module_2_3_0_t *coll_reduce_module;
 649     mca_coll_base_module_reduce_scatter_fn_t coll_reduce_scatter;
 650     mca_coll_base_module_2_3_0_t *coll_reduce_scatter_module;
 651     mca_coll_base_module_reduce_scatter_block_fn_t coll_reduce_scatter_block;
 652     mca_coll_base_module_2_3_0_t *coll_reduce_scatter_block_module;
 653     mca_coll_base_module_scan_fn_t coll_scan;
 654     mca_coll_base_module_2_3_0_t *coll_scan_module;
 655     mca_coll_base_module_scatter_fn_t coll_scatter;
 656     mca_coll_base_module_2_3_0_t *coll_scatter_module;
 657     mca_coll_base_module_scatterv_fn_t coll_scatterv;
 658     mca_coll_base_module_2_3_0_t *coll_scatterv_module;
 659 
 660     /* nonblocking collectives */
 661     mca_coll_base_module_iallgather_fn_t coll_iallgather;
 662     mca_coll_base_module_2_3_0_t *coll_iallgather_module;
 663     mca_coll_base_module_iallgatherv_fn_t coll_iallgatherv;
 664     mca_coll_base_module_2_3_0_t *coll_iallgatherv_module;
 665     mca_coll_base_module_iallreduce_fn_t coll_iallreduce;
 666     mca_coll_base_module_2_3_0_t *coll_iallreduce_module;
 667     mca_coll_base_module_ialltoall_fn_t coll_ialltoall;
 668     mca_coll_base_module_2_3_0_t *coll_ialltoall_module;
 669     mca_coll_base_module_ialltoallv_fn_t coll_ialltoallv;
 670     mca_coll_base_module_2_3_0_t *coll_ialltoallv_module;
 671     mca_coll_base_module_ialltoallw_fn_t coll_ialltoallw;
 672     mca_coll_base_module_2_3_0_t *coll_ialltoallw_module;
 673     mca_coll_base_module_ibarrier_fn_t coll_ibarrier;
 674     mca_coll_base_module_2_3_0_t *coll_ibarrier_module;
 675     mca_coll_base_module_ibcast_fn_t coll_ibcast;
 676     mca_coll_base_module_2_3_0_t *coll_ibcast_module;
 677     mca_coll_base_module_iexscan_fn_t coll_iexscan;
 678     mca_coll_base_module_2_3_0_t *coll_iexscan_module;
 679     mca_coll_base_module_igather_fn_t coll_igather;
 680     mca_coll_base_module_2_3_0_t *coll_igather_module;
 681     mca_coll_base_module_igatherv_fn_t coll_igatherv;
 682     mca_coll_base_module_2_3_0_t *coll_igatherv_module;
 683     mca_coll_base_module_ireduce_fn_t coll_ireduce;
 684     mca_coll_base_module_2_3_0_t *coll_ireduce_module;
 685     mca_coll_base_module_ireduce_scatter_fn_t coll_ireduce_scatter;
 686     mca_coll_base_module_2_3_0_t *coll_ireduce_scatter_module;
 687     mca_coll_base_module_ireduce_scatter_block_fn_t coll_ireduce_scatter_block;
 688     mca_coll_base_module_2_3_0_t *coll_ireduce_scatter_block_module;
 689     mca_coll_base_module_iscan_fn_t coll_iscan;
 690     mca_coll_base_module_2_3_0_t *coll_iscan_module;
 691     mca_coll_base_module_iscatter_fn_t coll_iscatter;
 692     mca_coll_base_module_2_3_0_t *coll_iscatter_module;
 693     mca_coll_base_module_iscatterv_fn_t coll_iscatterv;
 694     mca_coll_base_module_2_3_0_t *coll_iscatterv_module;
 695 
 696     /* persistent collectives */
 697     mca_coll_base_module_allgather_init_fn_t coll_allgather_init;
 698     mca_coll_base_module_2_3_0_t *coll_allgather_init_module;
 699     mca_coll_base_module_allgatherv_init_fn_t coll_allgatherv_init;
 700     mca_coll_base_module_2_3_0_t *coll_allgatherv_init_module;
 701     mca_coll_base_module_allreduce_init_fn_t coll_allreduce_init;
 702     mca_coll_base_module_2_3_0_t *coll_allreduce_init_module;
 703     mca_coll_base_module_alltoall_init_fn_t coll_alltoall_init;
 704     mca_coll_base_module_2_3_0_t *coll_alltoall_init_module;
 705     mca_coll_base_module_alltoallv_init_fn_t coll_alltoallv_init;
 706     mca_coll_base_module_2_3_0_t *coll_alltoallv_init_module;
 707     mca_coll_base_module_alltoallw_init_fn_t coll_alltoallw_init;
 708     mca_coll_base_module_2_3_0_t *coll_alltoallw_init_module;
 709     mca_coll_base_module_barrier_init_fn_t coll_barrier_init;
 710     mca_coll_base_module_2_3_0_t *coll_barrier_init_module;
 711     mca_coll_base_module_bcast_init_fn_t coll_bcast_init;
 712     mca_coll_base_module_2_3_0_t *coll_bcast_init_module;
 713     mca_coll_base_module_exscan_init_fn_t coll_exscan_init;
 714     mca_coll_base_module_2_3_0_t *coll_exscan_init_module;
 715     mca_coll_base_module_gather_init_fn_t coll_gather_init;
 716     mca_coll_base_module_2_3_0_t *coll_gather_init_module;
 717     mca_coll_base_module_gatherv_init_fn_t coll_gatherv_init;
 718     mca_coll_base_module_2_3_0_t *coll_gatherv_init_module;
 719     mca_coll_base_module_reduce_init_fn_t coll_reduce_init;
 720     mca_coll_base_module_2_3_0_t *coll_reduce_init_module;
 721     mca_coll_base_module_reduce_scatter_init_fn_t coll_reduce_scatter_init;
 722     mca_coll_base_module_2_3_0_t *coll_reduce_scatter_init_module;
 723     mca_coll_base_module_reduce_scatter_block_init_fn_t coll_reduce_scatter_block_init;
 724     mca_coll_base_module_2_3_0_t *coll_reduce_scatter_block_init_module;
 725     mca_coll_base_module_scan_init_fn_t coll_scan_init;
 726     mca_coll_base_module_2_3_0_t *coll_scan_init_module;
 727     mca_coll_base_module_scatter_init_fn_t coll_scatter_init;
 728     mca_coll_base_module_2_3_0_t *coll_scatter_init_module;
 729     mca_coll_base_module_scatterv_init_fn_t coll_scatterv_init;
 730     mca_coll_base_module_2_3_0_t *coll_scatterv_init_module;
 731 
 732     /* blocking neighborhood collectives */
 733     mca_coll_base_module_allgather_fn_t coll_neighbor_allgather;
 734     mca_coll_base_module_2_3_0_t *coll_neighbor_allgather_module;
 735     mca_coll_base_module_allgatherv_fn_t coll_neighbor_allgatherv;
 736     mca_coll_base_module_2_3_0_t *coll_neighbor_allgatherv_module;
 737     mca_coll_base_module_alltoall_fn_t coll_neighbor_alltoall;
 738     mca_coll_base_module_2_3_0_t *coll_neighbor_alltoall_module;
 739     mca_coll_base_module_alltoallv_fn_t coll_neighbor_alltoallv;
 740     mca_coll_base_module_2_3_0_t *coll_neighbor_alltoallv_module;
 741     mca_coll_base_module_neighbor_alltoallw_fn_t coll_neighbor_alltoallw;
 742     mca_coll_base_module_2_3_0_t *coll_neighbor_alltoallw_module;
 743 
 744     /* nonblocking neighborhood collectives */
 745     mca_coll_base_module_iallgather_fn_t coll_ineighbor_allgather;
 746     mca_coll_base_module_2_3_0_t *coll_ineighbor_allgather_module;
 747     mca_coll_base_module_iallgatherv_fn_t coll_ineighbor_allgatherv;
 748     mca_coll_base_module_2_3_0_t *coll_ineighbor_allgatherv_module;
 749     mca_coll_base_module_ialltoall_fn_t coll_ineighbor_alltoall;
 750     mca_coll_base_module_2_3_0_t *coll_ineighbor_alltoall_module;
 751     mca_coll_base_module_ialltoallv_fn_t coll_ineighbor_alltoallv;
 752     mca_coll_base_module_2_3_0_t *coll_ineighbor_alltoallv_module;
 753     mca_coll_base_module_ineighbor_alltoallw_fn_t coll_ineighbor_alltoallw;
 754     mca_coll_base_module_2_3_0_t *coll_ineighbor_alltoallw_module;
 755 
 756     /* persistent neighborhood collectives */
 757     mca_coll_base_module_allgather_init_fn_t coll_neighbor_allgather_init;
 758     mca_coll_base_module_2_3_0_t *coll_neighbor_allgather_init_module;
 759     mca_coll_base_module_allgatherv_init_fn_t coll_neighbor_allgatherv_init;
 760     mca_coll_base_module_2_3_0_t *coll_neighbor_allgatherv_init_module;
 761     mca_coll_base_module_alltoall_init_fn_t coll_neighbor_alltoall_init;
 762     mca_coll_base_module_2_3_0_t *coll_neighbor_alltoall_init_module;
 763     mca_coll_base_module_alltoallv_init_fn_t coll_neighbor_alltoallv_init;
 764     mca_coll_base_module_2_3_0_t *coll_neighbor_alltoallv_init_module;
 765     mca_coll_base_module_neighbor_alltoallw_init_fn_t coll_neighbor_alltoallw_init;
 766     mca_coll_base_module_2_3_0_t *coll_neighbor_alltoallw_init_module;
 767 
 768     mca_coll_base_module_reduce_local_fn_t coll_reduce_local;
 769     mca_coll_base_module_2_3_0_t *coll_reduce_local_module;
 770 };
 771 typedef struct mca_coll_base_comm_coll_t mca_coll_base_comm_coll_t;
 772 
 773 
 774 /* ******************************************************************** */
 775 
 776 
 777 /*
 778  * Macro for use in components that are of type coll
 779  */
 780 #define MCA_COLL_BASE_VERSION_2_0_0 \
 781     OMPI_MCA_BASE_VERSION_2_1_0("coll", 2, 0, 0)
 782 
 783 
 784 /* ******************************************************************** */
 785 
 786 
 787 END_C_DECLS
 788 
 789 #endif /* MCA_COLL_H */

/* [<][>][^][v][top][bottom][index][help] */