1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352
|
/* -*- 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-2017 IBM Corporation. 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/group query, called during cart and graph communicator creation.
*/
typedef struct mca_topo_base_module_t*
(*mca_topo_base_component_query_2_2_0_fn_t)
(const ompi_communicator_t *comm, const ompi_group_t *group, 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_query_2_2_0_fn_t topoc_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.3.0 ********
* ******************************************************************
*/
#define MCA_TOPO_BASE_VERSION_2_2_0 \
OMPI_MCA_BASE_VERSION_2_1_0("topo", 2, 2, 0)
#endif /* MCA_TOPO_H */
|