If a topology has been defined with one of the above functions, then the topology information can be looked up using inquiry functions. They all are local calls.

MPI_TOPO_TEST(comm, status) | |

IN comm | communicator (handle) |

OUT status | topology type of communicator comm (state) |

` int MPI_Topo_test(MPI_Comm comm, int *status) `

` MPI_TOPO_TEST(COMM, STATUS, IERROR) INTEGER COMM, STATUS, IERROR `

The output value ` status` is one of the following:

MPI_GRAPH graph topology

MPI_CART Cartesian topology

MPI_UNDEFINED no topology

MPI_GRAPHDIMS_GET(comm, nnodes, nedges) | |

IN comm | communicator for group with graph structure (handle) |

OUT nnodes | number of nodes in graph (integer) (same as number of processes in the group) |

OUT nedges | number of edges in graph (integer) |

` int MPI_Graphdims_get(MPI_Comm comm, int *nnodes, int *nedges) `

` MPI_GRAPHDIMS_GET(COMM, NNODES, NEDGES, IERROR) INTEGER COMM, NNODES, NEDGES, IERROR `

The information provided by MPI_GRAPHDIMS_GET can be used
to dimension the
vectors ` index` and ` edges` correctly for the following call
to MPI_GRAPH_GET.

MPI_GRAPH_GET(comm, maxindex, maxedges, index, edges) | |

IN comm | communicator with graph structure (handle) |

IN maxindex | length of vector index in the calling program (integer) |

IN maxedges | length of vector edges in the calling program (integer) |

OUT index | array of integers containing the graph structure (for details see the definition of MPI_GRAPH_CREATE) |

OUT edges | array of integers containing the graph structure |

` int MPI_Graph_get(MPI_Comm comm, int maxindex, int maxedges, int *index, int *edges) `

` MPI_GRAPH_GET(COMM, MAXINDEX, MAXEDGES, INDEX, EDGES, IERROR) INTEGER COMM, MAXINDEX, MAXEDGES, INDEX(*), EDGES(*), IERROR `

MPI_CARTDIM_GET(comm, ndims) | |

IN comm | communicator with Cartesian structure (handle) |

OUT ndims | number of dimensions of the Cartesian structure (integer) |

` int MPI_Cartdim_get(MPI_Comm comm, int *ndims) `

` MPI_CARTDIM_GET(COMM, NDIMS, IERROR) INTEGER COMM, NDIMS, IERROR `

MPI_CART_GET(comm, maxdims, dims, periods, coords) | |

IN comm | communicator with Cartesian structure (handle) |

IN maxdims | length of vectors dims, periods, and coords in the calling program (integer) |

OUT dims | number of processes for each Cartesian dimension (array of integer) |

OUT periods | periodicity ( true/ false) for each Cartesian dimension (array of logical) |

OUT coords | coordinates of calling process in Cartesian structure (array of integer) |

` int MPI_Cart_get(MPI_Comm comm, int maxdims, int *dims, int *periods, int *coords) `

` MPI_CART_GET(COMM, MAXDIMS, DIMS, PERIODS, COORDS, IERROR) INTEGER COMM, MAXDIMS, DIMS(*), COORDS(*), IERROR LOGICAL PERIODS(*) `

MPI_CART_RANK(comm, coords, rank) | |

IN comm | communicator with Cartesian structure (handle) |

IN coords | integer array (of size ndims) specifying the Cartesian coordinates of a process |

OUT rank | rank of specified process (integer) |

` int MPI_Cart_rank(MPI_Comm comm, int *coords, int *rank) `

` MPI_CART_RANK(COMM, COORDS, RANK, IERROR) INTEGER COMM, COORDS(*), RANK, IERROR `

For dimension ` i` with ` periods(i) = true`, if the coordinate,
` coords(i)`, is out of range, that is, ` coords(i) < 0` or

If comm is associated with a zero-dimensional Cartesian topology, coord is not significant and 0 is returned in rank.

MPI_CART_COORDS(comm, rank, maxdims, coords) | |

IN comm | communicator with Cartesian structure (handle) |

IN rank | rank of a process within group of comm (integer) |

IN maxdims | length of vector coords in the calling program (integer) |

OUT coords | integer array (of size ndims) containing the Cartesian coordinates of specified process (array of integers) |

` int MPI_Cart_coords(MPI_Comm comm, int rank, int maxdims, int *coords) `

` MPI_CART_COORDS(COMM, RANK, MAXDIMS, COORDS, IERROR) INTEGER COMM, RANK, MAXDIMS, COORDS(*), IERROR `

MPI_GRAPH_NEIGHBORS_COUNT(comm, rank, nneighbors) | |

IN comm | communicator with graph topology (handle) |

IN rank | rank of process in group of comm (integer) |

OUT nneighbors | number of neighbors of specified process (integer) |

` int MPI_Graph_neighbors_count(MPI_Comm comm, int rank, int *nneighbors) `

` MPI_GRAPH_NEIGHBORS_COUNT(COMM, RANK, NNEIGHBORS, IERROR) INTEGER COMM, RANK, NNEIGHBORS, IERROR `

MPI_GRAPH_NEIGHBORS(comm, rank, maxneighbors, neighbors) | |

IN comm | communicator with graph topology (handle) |

IN rank | rank of process in group of comm (integer) |

IN maxneighbors | size of array neighbors (integer) |

OUT neighbors | ranks of processes that are neighbors to specified process (array of integer) |

` int MPI_Graph_neighbors(MPI_Comm comm, int rank, int maxneighbors, int *neighbors) `

` MPI_GRAPH_NEIGHBORS(COMM, RANK, MAXNEIGHBORS, NEIGHBORS, IERROR) INTEGER COMM, RANK, MAXNEIGHBORS, NEIGHBORS(*), IERROR `

Suppose that ` comm` is a communicator with a
shuffle-exchange topology. The group has *2 ^{n}* members.
Each process is labeled by

2|c| node | exchange | shuffle | unshuffle | |

neighbors(1) | neighbors(2) | neighbors(3) | ||

0 | (000) | 1 | 0 | 0 |

1 | (001) | 0 | 2 | 4 |

2 | (010) | 3 | 4 | 1 |

3 | (011) | 2 | 6 | 5 |

4 | (100) | 5 | 1 | 2 |

5 | (101) | 4 | 3 | 6 |

6 | (110) | 7 | 5 | 3 |

7 | (111) | 6 | 7 | 7 |

Suppose that the communicator ` comm` has this topology associated with it.
The following code fragment cycles through the three types of neighbors
and performs an appropriate permutation for each.

C assume: each process has stored a real number A. C extract neighborhood information CALL MPI_COMM_RANK(comm, myrank, ierr) CALL MPI_GRAPH_NEIGHBORS(comm, myrank, 3, neighbors, ierr) C perform exchange permutation CALL MPI_SENDRECV_REPLACE(A, 1, MPI_REAL, neighbors(1), 0, + neighbors(1), 0, comm, status, ierr) C perform shuffle permutation CALL MPI_SENDRECV_REPLACE(A, 1, MPI_REAL, neighbors(2), 0, + neighbors(3), 0, comm, status, ierr) C perform unshuffle permutation CALL MPI_SENDRECV_REPLACE(A, 1, MPI_REAL, neighbors(3), 0, + neighbors(2), 0, comm, status, ierr)

Return to MPI-2.1 Standard Index

Return to MPI Forum Home Page

MPI-2.0 of July 1, 2008

HTML Generated on July 6, 2008