/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. * */ #ifndef MPIR_TOPO_H_INCLUDED #define MPIR_TOPO_H_INCLUDED /* * The following struture allows the device detailed control over the * functions that are used to implement the topology routines. If either * the pointer to this structure is null or any individual entry is null, * the default function is used (this follows exactly the same rules as the * collective operations, provided in the MPIR_Collops structure). */ typedef struct MPII_Topo_ops { int (*cartCreate) (const MPIR_Comm *, int, const int[], const int[], int, MPI_Comm *); int (*cartMap) (const MPIR_Comm *, int, const int[], const int[], int *); int (*graphCreate) (const MPIR_Comm *, int, const int[], const int[], int, MPI_Comm *); int (*graphMap) (const MPIR_Comm *, int, const int[], const int[], int *); } MPII_Topo_ops; typedef struct MPII_Graph_topology { int nnodes; int nedges; int *index; int *edges; } MPII_Graph_topology; typedef struct MPII_Cart_topology { int nnodes; /* Product of dims[*], gives the size of the topology */ int ndims; int *dims; int *periodic; int *position; } MPII_Cart_topology; typedef struct MPII_Dist_graph_topology { int indegree; int *in; int *in_weights; int outdegree; int *out; int *out_weights; int is_weighted; } MPII_Dist_graph_topology; struct MPIR_Topology { MPIR_Topo_type kind; union topo { MPII_Graph_topology graph; MPII_Cart_topology cart; MPII_Dist_graph_topology dist_graph; } topo; }; int MPIR_Dims_create(int, int, int *); MPIR_Topology *MPIR_Topology_get(MPIR_Comm *); int MPIR_Topology_put(MPIR_Comm *, MPIR_Topology *); /* Returns the canonicalized count of neighbors for the given topology as though * MPI_Dist_graph_neighbors_count were called with a distributed graph topology, * even if the given topology is actually Cartesian or Graph. Useful for * implementing neighborhood collective operations. */ int MPIR_Topo_canon_nhb_count(MPIR_Comm * comm_ptr, int *indegree, int *outdegree, int *weighted); /* Returns the canonicalized list of neighbors for a given topology, separated * into inbound and outbound edges. Equivalent to MPI_Dist_graph_neighbors but * works for any topology type by canonicalizing according to the rules in * Section 7.6 of the MPI-3.0 standard. */ int MPIR_Topo_canon_nhb(MPIR_Comm * comm_ptr, int indegree, int sources[], int inweights[], int outdegree, int dests[], int outweights[]); #define MAX_CART_DIM 16 /* topology impl functions */ int MPIR_Cart_create(MPIR_Comm *, int, const int[], const int[], int, MPI_Comm *); int MPIR_Cart_map(const MPIR_Comm *, int, const int[], const int[], int *); int MPIR_Cart_shift_impl(MPIR_Comm * comm_ptr, int direction, int displ, int *source, int *dest); void MPIR_Cart_rank_impl(struct MPIR_Topology *cart_ptr, const int *coords, int *rank); int MPIR_Cart_create_impl(MPIR_Comm * comm_ptr, int ndims, const int dims[], const int periods[], int reorder, MPI_Comm * comm_cart); int MPIR_Cart_map_impl(const MPIR_Comm * comm_ptr, int ndims, const int dims[], const int periodic[], int *newrank); int MPIR_Graph_create(MPIR_Comm *, int, const int[], const int[], int, MPI_Comm *); int MPIR_Graph_map(const MPIR_Comm *, int, const int[], const int[], int *); int MPIR_Graph_neighbors_count_impl(MPIR_Comm * comm_ptr, int rank, int *nneighbors); int MPIR_Graph_neighbors_impl(MPIR_Comm * comm_ptr, int rank, int maxneighbors, int *neighbors); int MPIR_Graph_map_impl(const MPIR_Comm * comm_ptr, int nnodes, const int indx[], const int edges[], int *newrank); int MPIR_Dist_graph_neighbors_count_impl(MPIR_Comm * comm_ptr, int *indegree, int *outdegree, int *weighted); int MPIR_Dist_graph_neighbors_impl(MPIR_Comm * comm_ptr, int maxindegree, int sources[], int sourceweights[], int maxoutdegree, int destinations[], int destweights[]); #endif /* MPIR_TOPO_H_INCLUDED */