This page imported from: /afs/bu.edu/cwis/webuser/web/s/c/scv/documentation/tutorials/MPI/alliance/virtual_topology/codes/cart_shift_example.html
MPI_Cart_shift Example
In this example, we demonstrate the usage of
MPI_Cart_shift
. With six (6) active processes, we
proceed to create a 2D cartesian topology for these 6 processes.
This results in a 3×2 cartesian topology representation for the
6 processes. Furthermore, we impose a cyclic boundary condition
down the rows — but not the columns – of this 2D grid.
Given the calling process rank number in the cartesian grid
communicator, upon calling MPI_Cart_shift, the source and destination
ranks of the calling process rank are returned:
- along the rows and a displacement of +1, the source is the
rank above the calling rank and the destination is the rank below it. - along the rows and a displacement of -2, the source is two
ranks above the calling rank and the destination is two ranks below it. - across the columns and a displacement of +1, the source is the
rank to the left of the calling rank and the destination is the rank
to the right. - across the columns and a displacement of -1, the source is the rank
to the right of the calling rank and the destination is the rank
to the left.
|
Output
Note that some returned ranks in the last four columns are negative
because they are out of bound and are assigned the value MPI_UNDEFINED.
The value of MPI_UNDEFINED is implementation dependent. In this case, it
is -1.
|
For your convenience in seeing what MPI_Cart_shift does under the four
different sets of input parameters, shown in Figure a below is the 3×2
cartesian topology grid.
Here, the index pair “i,j” represent row “i” and column “j”. The number
in parentheses represents the rank
number associated with the cartesian coordinates.
-2,0 (2) | -1,1 (3) | ||
-1,0 (4) | -1,1 (5) | ||
0,-1(-1) | 0,0 (0) | 0,1 (1) | 0,2(-1) |
1,-1(-1) | 1,0 (2) | 1,1 (3) | 1,2 (-1) |
2,-1(-1) | 2,0 (4) | 2,1 (5) | 2,2 (-1) |
3,0 (0) | 3,1 (1) | ||
4,0 (2) | 4,1 (3) |