1
1
openmpi/ompi/mca/coll/inter/coll_inter.c
Jeff Squyres 0af7ac53f2 Fixes trac:1392, #1400
* add "register" function to mca_base_component_t
   * converted coll:basic and paffinity:linux and paffinity:solaris to
     use this function
   * we'll convert the rest over time (I'll file a ticket once all
     this is committed)
 * add 32 bytes of "reserved" space to the end of mca_base_component_t
   and mca_base_component_data_2_0_0_t to make future upgrades
   [slightly] easier
   * new mca_base_component_t size: 196 bytes
   * new mca_base_component_data_2_0_0_t size: 36 bytes
 * MCA base version bumped to v2.0
   * '''We now refuse to load components that are not MCA v2.0.x'''
 * all MCA frameworks versions bumped to v2.0
 * be a little more explicit about version numbers in the MCA base
   * add big comment in mca.h about versioning philosophy

This commit was SVN r19073.

The following Trac tickets were found above:
  Ticket 1392 --> https://svn.open-mpi.org/trac/ompi/ticket/1392
2008-07-28 22:40:57 +00:00

186 строки
5.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-2007 University of Houston. All rights reserved.
* Copyright (c) 2008 Sun Microsystems, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "ompi_config.h"
#include "coll_inter.h"
#include <stdio.h>
#include "mpi.h"
#include "ompi/communicator/communicator.h"
#include "ompi/group/group.h"
#include "ompi/proc/proc.h"
#include "ompi/op/op.h"
#include "ompi/mca/coll/coll.h"
#include "ompi/mca/coll/base/base.h"
#include "ompi/mca/coll/base/coll_tags.h"
#include "ompi/class/ompi_bitmap.h"
#include "ompi/mca/bml/bml.h"
#include "ompi/mca/bml/base/base.h"
#include "ompi/mca/pml/pml.h"
#include "ompi/mca/btl/btl.h"
#if 0
static void mca_coll_inter_dump_struct ( struct mca_coll_base_comm_t *c);
static const mca_coll_base_module_1_0_0_t inter = {
/* Initialization / finalization functions */
mca_coll_inter_module_init,
mca_coll_inter_module_finalize,
/* Collective function pointers */
/* function pointers marked with NULL are not yet implemented
and will use the functions provided in the basic module */
mca_coll_inter_allgather_inter,
mca_coll_inter_allgatherv_inter,
mca_coll_inter_allreduce_inter,
NULL, /* alltoall */
NULL, /* alltoallv */
NULL, /* alltoallw */
NULL, /* barrier */
mca_coll_inter_bcast_inter,
NULL, /* exscan */
mca_coll_inter_gather_inter,
mca_coll_inter_gatherv_inter,
mca_coll_inter_reduce_inter,
NULL, /* reduce_scatter */
NULL, /* scan */
mca_coll_inter_scatter_inter,
mca_coll_inter_scatterv_inter
};
#endif
/*
* Initial query function that is invoked during MPI_INIT, allowing
* this module to indicate what level of thread support it provides.
*/
int mca_coll_inter_init_query(bool allow_inter_user_threads,
bool have_hidden_user_threads)
{
/* Don't ask. All done */
return OMPI_SUCCESS;
}
/*
* Invoked when there's a new communicator that has been created.
* Look at the communicator and decide which set of functions and
* priority we want to return.
*/
mca_coll_base_module_t *
mca_coll_inter_comm_query(struct ompi_communicator_t *comm, int *priority)
{
int size, rsize;
mca_coll_inter_module_t *inter_module;
/* This module only works for inter-communicators */
if (!OMPI_COMM_IS_INTER(comm)) {
return NULL;
}
/* Get the priority level attached to this module. If priority is less
* than or equal to 0, then the module is unavailable. */
*priority = mca_coll_inter_priority_param;
if (0 >= mca_coll_inter_priority_param) {
return NULL;
}
size = ompi_comm_size(comm);
rsize = ompi_comm_remote_size(comm);
if ( size < mca_coll_inter_crossover && rsize < mca_coll_inter_crossover) {
return NULL;
}
inter_module = OBJ_NEW(mca_coll_inter_module_t);
if (NULL == inter_module) {
return NULL;
}
inter_module->super.coll_module_enable = mca_coll_inter_module_enable;
inter_module->super.ft_event = NULL;
inter_module->super.coll_allgather = mca_coll_inter_allgather_inter;
inter_module->super.coll_allgatherv = mca_coll_inter_allgatherv_inter;
inter_module->super.coll_allreduce = mca_coll_inter_allreduce_inter;
inter_module->super.coll_alltoall = NULL;
inter_module->super.coll_alltoallv = NULL;
inter_module->super.coll_alltoallw = NULL;
inter_module->super.coll_barrier = NULL;
inter_module->super.coll_bcast = mca_coll_inter_bcast_inter;
inter_module->super.coll_exscan = NULL;
inter_module->super.coll_gather = mca_coll_inter_gather_inter;
inter_module->super.coll_gatherv = mca_coll_inter_gatherv_inter;
inter_module->super.coll_reduce = mca_coll_inter_reduce_inter;
inter_module->super.coll_reduce_scatter = NULL;
inter_module->super.coll_scan = NULL;
inter_module->super.coll_scatter = mca_coll_inter_scatter_inter;
inter_module->super.coll_scatterv = mca_coll_inter_scatterv_inter;
return &(inter_module->super);
}
/*
* Init module on the communicator
*/
int
mca_coll_inter_module_enable(mca_coll_base_module_t *module,
struct ompi_communicator_t *comm)
{
int size, rank;
mca_coll_inter_module_t *inter_module = (mca_coll_inter_module_t*) module;
rank = ompi_comm_rank(comm);
size = ompi_comm_size(comm);
inter_module->inter_comm = comm;
#if 0
if ( mca_coll_inter_verbose_param ) {
mca_coll_inter_dump_struct (data);
}
#endif
return OMPI_SUCCESS;
}
#if 0
static void mca_coll_inter_dump_struct ( struct mca_coll_base_comm_t *c)
{
int rank;
rank = ompi_comm_rank ( c->inter_comm );
printf("%d: Dump of inter-struct for comm %s cid %u\n",
rank, c->inter_comm->c_name, c->inter_comm->c_contextid);
return;
}
#endif