File: topo.h

package info (click to toggle)
openmpi 5.0.7-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 202,312 kB
  • sloc: ansic: 612,441; makefile: 42,495; sh: 11,230; javascript: 9,244; f90: 7,052; java: 6,404; perl: 5,154; python: 1,856; lex: 740; fortran: 61; cpp: 20; tcl: 12
file content (352 lines) | stat: -rw-r--r-- 14,039 bytes parent folder | download | duplicates (2)
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 */