1
1
openmpi/ompi/mca/topo/topo.h
David Solt 50aa143ab6 Major structural changes to data types: .super infosubscriber
ompi_communicator_t, ompi_win_t, ompi_file_t all have a super class of type opal_infosubscriber_t instead of a base/super type of opal_object_t (in previous code comm used c_base, but file used super).  It may be a bit bold to say that being a subscriber of MPI_Info is the foundational piece that ties these three things together, but if you object, then I would prefer to turn infosubscriber into a more general name that encompasses other common features rather than create a different super class.  The key here is that we want to be able to pass comm, win and file objects as if they were opal_infosubscriber_t, so that one routine can heandle all 3 types of objects being passed to it.

MPI_INFO_NULL is still an ompi_predefined_info_t type since an MPI_Info is part of ompi but the internal details of the underlying information concept is part of opal.

An ompi_info_t type still exists for exposure to the user, but it is simply a wrapper for the opal object.

Routines such as ompi_info_dup, etc have all been moved to opal_info_dup and related to the opal directory.

Fortran to C translation tables are only used for MPI_Info that is exposed to the application and are therefore part of the ompi_info_t and not the opal_info_t

The data structure changes are primarily in the following files:

    communicator/communicator.h
    ompi/info/info.h
    ompi/win/win.h
    ompi/file/file.h

The following new files were created:

    opal/util/info.h
    opal/util/info.c
    opal/util/info_subscriber.h
    opal/util/info_subscriber.c

This infosubscriber concept is that communicators, files and windows can have subscribers that subscribe to any changes in the info associated with the comm/file/window.  When xxx_set_info is called, the new info is presented to each subscriber who can modify the info in any way they want.  The new value is presented to the next subscriber and so on until all subscribers have had a chance to modify the value.  Therefore, the order of subscribers can make a difference but we hope that there is generally only one subscriber that cares or modifies any given key/value pair.  The final info is then stored and returned by a call to xxx_get_info.

The new model can be seen in the following files:

    ompi/mpi/c/comm_get_info.c
    ompi/mpi/c/comm_set_info.c
    ompi/mpi/c/file_get_info.c
    ompi/mpi/c/file_set_info.c
    ompi/mpi/c/win_get_info.c
    ompi/mpi/c/win_set_info.c

The current subscribers where changed as follows:

    mca/io/ompio/io_ompio_file_open.c
    mca/io/ompio/io_ompio_module.c
    mca/osc/rmda/osc_rdma_component.c (This one actually subscribes to "no_locks")
    mca/osc/sm/osc_sm_component.c (This one actually subscribes to "blocking_fence" and "alloc_shared_contig")

Signed-off-by: Mark Allen <markalle@us.ibm.com>

Conflicts:
	AUTHORS
	ompi/communicator/comm.c
	ompi/debuggers/ompi_mpihandles_dll.c
	ompi/file/file.c
	ompi/file/file.h
	ompi/info/info.c
	ompi/mca/io/ompio/io_ompio.h
	ompi/mca/io/ompio/io_ompio_file_open.c
	ompi/mca/io/ompio/io_ompio_file_set_view.c
	ompi/mca/osc/pt2pt/osc_pt2pt.h
	ompi/mca/sharedfp/addproc/sharedfp_addproc.h
	ompi/mca/sharedfp/addproc/sharedfp_addproc_file_open.c
	ompi/mca/topo/treematch/topo_treematch_dist_graph_create.c
	ompi/mpi/c/lookup_name.c
	ompi/mpi/c/publish_name.c
	ompi/mpi/c/unpublish_name.c
	opal/mca/mpool/base/mpool_base_alloc.c
	opal/util/Makefile.am
2017-05-12 14:41:05 -04:00

354 строки
14 KiB
C

/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2013 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) 2009 Oak Ridge National Labs. All rights reserved.
* Copyright (c) 2012-2013 Inria. All rights reserved.
* Copyright (c) 2014-2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2015 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2016 IBM Corp. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#ifndef MCA_TOPO_H
#define MCA_TOPO_H
#include "ompi_config.h"
#include "ompi/mca/mca.h"
#include "opal/mca/base/base.h"
#include "ompi/communicator/communicator.h"
/* Forward reference to ompi_proc_t */
struct ompi_proc_t;
typedef struct mca_topo_base_module_t mca_topo_base_module_t;
/*
* Initial component query, called during mca_topo_base_open.
*/
typedef int (*mca_topo_base_component_init_query_2_2_0_fn_t)
(bool enable_progress_threads,
bool enable_mpi_threads);
/*
* Communicator query, called during cart and graph communicator
* creation.
*/
typedef struct mca_topo_base_module_t*
(*mca_topo_base_component_comm_query_2_2_0_fn_t)
(const ompi_communicator_t *comm, int *priority, uint32_t type);
/*
* Structure for topo v2.1.0 components.This is chained to MCA v2.0.0
*/
typedef struct mca_topo_base_component_2_2_0_t {
mca_base_component_t topoc_version;
mca_base_component_data_t topoc_data;
mca_topo_base_component_init_query_2_2_0_fn_t topoc_init_query;
mca_topo_base_component_comm_query_2_2_0_fn_t topoc_comm_query;
} mca_topo_base_component_2_2_0_t;
typedef mca_topo_base_component_2_2_0_t mca_topo_base_component_t;
/*
* Struct for holding graph communicator information
*/
typedef struct mca_topo_base_comm_graph_2_2_0_t {
/* Make this structure be an object so that it has a constructor
and destructor. */
opal_object_t super;
int nnodes;
int *index;
int *edges;
} mca_topo_base_comm_graph_2_2_0_t;
typedef mca_topo_base_comm_graph_2_2_0_t mca_topo_base_comm_graph_t;
OMPI_DECLSPEC OBJ_CLASS_DECLARATION(mca_topo_base_comm_graph_2_2_0_t);
/*
* Struct for holding cartesian communicator information
*/
typedef struct mca_topo_base_comm_cart_2_2_0_t {
/* Make this structure be an object so that it has a constructor
and destructor. */
opal_object_t super;
int ndims;
int *dims;
int *periods;
int *coords;
} mca_topo_base_comm_cart_2_2_0_t;
typedef mca_topo_base_comm_cart_2_2_0_t mca_topo_base_comm_cart_t;
OMPI_DECLSPEC OBJ_CLASS_DECLARATION(mca_topo_base_comm_cart_2_2_0_t);
/*
* Struct for holding distributed graph information
*/
typedef struct mca_topo_base_comm_dist_graph_2_2_0_t {
/* Make this structure be an object so that it has a constructor
and destructor. */
opal_object_t super;
int *in;
int *inw;
int *out;
int *outw;
int indegree, outdegree;
bool weighted;
} mca_topo_base_comm_dist_graph_2_2_0_t;
typedef mca_topo_base_comm_dist_graph_2_2_0_t mca_topo_base_comm_dist_graph_t;
OMPI_DECLSPEC OBJ_CLASS_DECLARATION(mca_topo_base_comm_dist_graph_2_2_0_t);
/*
* This union must be declared (can't be anonymous in the struct where
* it is used) because we need to be able to resolve it and find field
* offsets in the ompi/debuggers/ stuff (i.e., so that debuggers can
* parse/understand the individual fields on communicators).
*/
typedef union mca_topo_base_comm_cgd_union_2_2_0_t {
mca_topo_base_comm_graph_2_2_0_t* graph;
mca_topo_base_comm_cart_2_2_0_t* cart;
mca_topo_base_comm_dist_graph_2_2_0_t* dist_graph;
} mca_topo_base_comm_cgd_union_2_2_0_t;
typedef mca_topo_base_comm_cgd_union_2_2_0_t mca_topo_base_comm_cgd_union_t;
/**
* The logic for creating communicators with attached topologies is
* the following. A new placeholder communicator is prepared before
* the *_create function is called, and is initialized with minimal
* information. As an example, this communicator is not safe neither
* for point-to-point nor collective messages, it is provided only
* as a placeholder. However, the original communicator where the
* topology function was called upon is provided as well, in order to have
* a valid medium for messaging. In return from the *_create functions,
* a new group of processes is expected one containing all processes in
* the local_group of the new communicator. Once this information
* returned the new communicator will be fully initialized and activated.
*/
/*
* Module function typedefs
*/
/* Back end for MPI_CART_COORDS */
typedef int (*mca_topo_base_module_cart_coords_fn_t)
(struct ompi_communicator_t *comm,
int rank,
int maxdims,
int *coords);
/* Back end for MPI_CART_CREATE */
typedef int (*mca_topo_base_module_cart_create_fn_t)
(mca_topo_base_module_t *topo_module,
ompi_communicator_t* old_comm,
int ndims,
const int *dims,
const int *periods,
bool reorder,
ompi_communicator_t** comm_topo);
/* Back end for MPI_CART_GET */
typedef int (*mca_topo_base_module_cart_get_fn_t)
(struct ompi_communicator_t *comm,
int maxdims,
int *dims,
int *periods,
int *coords);
/* Back end for MPI_CARTDIM_GET */
typedef int (*mca_topo_base_module_cartdim_get_fn_t)
(struct ompi_communicator_t *comm,
int *ndims);
/* Back end for MPI_CART_MAP */
typedef int (*mca_topo_base_module_cart_map_fn_t)
(struct ompi_communicator_t *comm,
int ndims,
const int *dims,
const int *periods,
int *newrank);
/* Back end for MPI_CART_RANK */
typedef int (*mca_topo_base_module_cart_rank_fn_t)
(struct ompi_communicator_t *comm,
const int *coords,
int *rank);
/* Back end for MPI_CART_SHIFT */
typedef int (*mca_topo_base_module_cart_shift_fn_t)
(struct ompi_communicator_t *comm,
int direction,
int disp,
int *rank_source,
int *rank_dest);
/* Back end for MPI_CART_SUB */
typedef int (*mca_topo_base_module_cart_sub_fn_t)
(struct ompi_communicator_t *comm,
const int *remain_dims,
struct ompi_communicator_t ** new_comm);
/* Back end for MPI_GRAPH_CREATE */
typedef int (*mca_topo_base_module_graph_create_fn_t)
(mca_topo_base_module_t *topo_module,
ompi_communicator_t* old_comm,
int nnodes,
const int *index,
const int *edges,
bool reorder,
ompi_communicator_t** new_comm);
/* Back end for MPI_GRAPH_GET */
typedef int (*mca_topo_base_module_graph_get_fn_t)
(struct ompi_communicator_t *comm,
int maxindex,
int maxedges,
int *index,
int *edges);
/* Back end for MPI_GRAPH_MAP */
typedef int (*mca_topo_base_module_graph_map_fn_t)
(struct ompi_communicator_t *comm,
int nnodes,
const int *index,
const int *edges,
int *newrank);
/* Back end for MPI_GRAPHDIMS_GET */
typedef int (*mca_topo_base_module_graphdims_get_fn_t)
(struct ompi_communicator_t *comm,
int *nnodes,
int *nnedges);
/* Back end for MPI_GRAPH_NEIGHBORS */
typedef int (*mca_topo_base_module_graph_neighbors_fn_t)
(struct ompi_communicator_t *comm,
int rank,
int maxneighbors,
int *neighbors);
/* Back end for MPI_GRAPH_NEIGHBORS_COUNT */
typedef int (*mca_topo_base_module_graph_neighbors_count_fn_t)
(struct ompi_communicator_t *comm,
int rank,
int *nneighbors);
/* Back end for MPI_DIST_GRAPH_CREATE */
typedef int (*mca_topo_base_module_dist_graph_create_fn_t)
(struct mca_topo_base_module_t* module,
struct ompi_communicator_t *old_comm,
int n, const int nodes[],
const int degrees[], const int targets[], const int weights[],
struct opal_info_t *info, int reorder,
struct ompi_communicator_t **new_comm);
/* Back end for MPI_DIST_GRAPH_CREATE_ADJACENT */
typedef int (*mca_topo_base_module_dist_graph_create_adjacent_fn_t)
(struct mca_topo_base_module_t* module,
ompi_communicator_t *comm_old,
int indegree, const int sources[],
const int sourceweights[],
int outdegree,
const int destinations[],
const int destweights[],
struct opal_info_t *info, int reorder,
ompi_communicator_t **comm_dist_graph);
/* Back end for MPI_DIST_GRAPH_NEIGHBORS */
typedef int (*mca_topo_base_module_dist_graph_neighbors_fn_t)
(struct ompi_communicator_t *comm,
int maxindegree,
int sources[], int sourceweights[],
int maxoutdegree, int destinations[],
int destweights[]);
/* Back end for MPI_DIST_GRAPH_NEIGHBORS_COUNT */
typedef int (*mca_topo_base_module_dist_graph_neighbors_count_fn_t)
(struct ompi_communicator_t *comm,
int *inneighbors, int *outneighbors, int *weighted);
/*
* Topo module structure. If a given topo module needs to cache more
* information than what is contained in the mca_topo_base_module_t, it should
* create its own module struct that uses mca_topo_base_module_t as a super.
*
* A module only needs to define two vital functions: the create and the map (or
* equivalent). However, if no specialized functions are provided, they will be
* automatically replaced by their default version. They will return the answers
* based on the base information stored in the associated module extra data.
*/
typedef struct mca_topo_base_cart_module_2_2_0_t {
mca_topo_base_module_cart_coords_fn_t cart_coords;
mca_topo_base_module_cart_create_fn_t cart_create;
mca_topo_base_module_cart_get_fn_t cart_get;
mca_topo_base_module_cartdim_get_fn_t cartdim_get;
mca_topo_base_module_cart_map_fn_t cart_map;
mca_topo_base_module_cart_rank_fn_t cart_rank;
mca_topo_base_module_cart_shift_fn_t cart_shift;
mca_topo_base_module_cart_sub_fn_t cart_sub;
} mca_topo_base_cart_module_2_2_0_t;
typedef struct mca_topo_base_graph_module_2_2_0_t {
mca_topo_base_module_graph_create_fn_t graph_create;
mca_topo_base_module_graph_get_fn_t graph_get;
mca_topo_base_module_graph_map_fn_t graph_map;
mca_topo_base_module_graphdims_get_fn_t graphdims_get;
mca_topo_base_module_graph_neighbors_fn_t graph_neighbors;
mca_topo_base_module_graph_neighbors_count_fn_t graph_neighbors_count;
} mca_topo_base_graph_module_2_2_0_t;
typedef struct mca_topo_base_dist_graph_module_2_2_0_t {
mca_topo_base_module_dist_graph_create_fn_t dist_graph_create;
mca_topo_base_module_dist_graph_create_adjacent_fn_t dist_graph_create_adjacent;
mca_topo_base_module_dist_graph_neighbors_fn_t dist_graph_neighbors;
mca_topo_base_module_dist_graph_neighbors_count_fn_t dist_graph_neighbors_count;
} mca_topo_base_dist_graph_module_2_2_0_t;
struct mca_topo_base_module_t {
/* Make this structure be an object so that it has a constructor
and destructor. */
opal_object_t super;
uint32_t type; /* type of topology */
bool reorder; /* reordering was required */
mca_topo_base_component_t* topo_component; /* Component of this topo module */
/* Cart, graph or dist graph related functions */
union {
mca_topo_base_cart_module_2_2_0_t cart;
mca_topo_base_graph_module_2_2_0_t graph;
mca_topo_base_dist_graph_module_2_2_0_t dist_graph;
} topo;
/* This union caches the parameters passed when the communicator
was created. Look in comm->c_flags to figure out whether this
is a cartesian, graph, or dist graph communicator. */
mca_topo_base_comm_cgd_union_t mtc;
};
OMPI_DECLSPEC OBJ_CLASS_DECLARATION(mca_topo_base_module_t);
/*
* ******************************************************************
* ********** Use in components that are of type topo v2.2.0 ********
* ******************************************************************
*/
#define MCA_TOPO_BASE_VERSION_2_2_0 \
OMPI_MCA_BASE_VERSION_2_1_0("topo", 2, 2, 0)
#endif /* MCA_TOPO_H */