Если топология была определена одной из вышеупомянутых функций, то информация об этой топологии может быть получена с помощью функций запроса. Все они являются локальными вызовами.
Синтаксис функции MPI_TOPO_TEST представлен ниже.
MPI_TOPO_TEST(comm, status)
IN | comm | коммуникатор (дескриптор) | |
OUT | status | тип топологии коммуникатора comm (альтернатива) |
int MPI_Topo_test(MPI_Comm comm, int *status)
MPI_TOPO_TEST(COMM, STATUS, IERROR)
INTEGER COMM, STATUS, IERROR
int MPI::Comm::Get_topology() const
Функция MPI_TOPO_TEST возвращает тип топологии, переданной коммуникатору. Выходное значение status имеет одно из следующих значений:
MPI_GRAPH | топология графа |
MPI_CART | декартова топология |
MPI_UNDEFINED | топология не определена |
Синтаксис функции MPI_GRAPHDIMS_GET представлен ниже.
MPI_GRAPHDIMS_GET(comm, nnodes, nedges)
IN | comm | коммуникатор группы с графовой топологией (дескриптор) | |
OUT | nnodes | число вершин графа (целое, равно числу процессов в группе) | |
OUT | nedges | число ребер графа (целое) |
int MPI_Graphdims_get(MPI_Comm comm, int *nnodes, int *nedges)
MPI_GRAPHDIMS_GET(COMM, NNODES, NEDGES, IERROR)
INTEGER COMM, NNODES, NEDGES, IERROR
void MPI::Graphcomm::Get_dims(int nnodes[],
int nedges[]) const
Функции MPI_GRAPHDIMS_GET и MPI_GRAPH_GET отыскивают графо-топологическую информацию, которая была связана с коммуникатором с помощью функции MPI_GRAPH_CREATE.
Информация, предоставляемая MPI_GRAPHDIMS_GET, может быть использована для корректного определения размера векторов index и edges для последующего вызова функции MPI_GRAPH_GET.
Синтаксис функции MPI_GRAPH_GET представлен ниже.
MPI_GRAPH_GET(comm, maxindex, maxedges, index, edges)
IN | comm | коммуникатор с графовой топологией (дескриптор) | |
IN | maxindex | длина вектора index (целое) | |
IN | maxedges | длина вектора edges (целое) | |
OUT | index | целочисленный массив, содержащий структуру графа (подробнее в описании функции MPI_GRAPH_CREATE) | |
OUT | edges | целочисленный массив,содержащий структуру графа |
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
void MPI::Graphcomm::Get_topo(int maxindex,
int maxedges, int index[], int edges[]) const
Синтаксис функции MPI_CARTDIM_GET представлен ниже.
MPI_CARTDIM_GET(comm, ndims)
IN | comm | коммуникатор с декартовой топологией (дескриптор) | |
OUT | ndims | число размерностей в декартовой топологии системы (целое) |
int MPI_Cartdim_get(MPI_Comm comm, int *ndims)
MPI_CARTDIM_GET(COMM, NDIMS, IERROR)
INTEGER COMM, NDIMS, IERROR
int MPI::Cartcomm::Get_dim() const
Функции MPI_CARTDIM_GET и MPI_CART_GET возвращают информацию о декартовой топологии, которая была связана с функцией MPI_CART_CREATE.
Синтаксис функции MPI_CART_GET представлен ниже.
MPI_CART_GET(comm, maxdims, dims, periods, coords)
IN | comm | коммуникатор с декартовой топологией (дескриптор) | |
IN | maxdims | длина векторов dims, periods и coords (целое) | |
OUT | dims | число процессов по каждой декартовой размерности (целочисленный
массив) |
|
OUT | periods | периодичность (true / false) для каждой декартовой размерности (массив логических элементов) | |
OUT | coords | координаты вызываемых процессов в декартовой системе координат (целочисленный массив) |
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(*)
void MPI::Cartcomm::Get_topo(int maxdims, int dims[],
bool periods[], int coords[]) const
Синтаксис функции MPI_CART_RANK представлен ниже.
MPI_CART_RANK(comm, coords, rank)
IN | comm | коммуникатор с декартовой топологией (дескриптор) | |
IN | coords | целочисленный массив (размера ndims), описывающий декартовы координаты процесса | |
OUT | rank | номер указанного процесса (целый) |
int MPI_Cart_rank(MPI_Comm comm, int *coords, int *rank)
MPI_CART_RANK(COMM, COORDS, RANK, IERROR)
INTEGER COMM, COORDS(*), RANK, IERROR
int MPI::Cartcomm::Get_cart_rank(const int coords[]) const.
Для группы процессов с декартовой структурой, функция MPI_CART_RANK переводит логические координаты процессов в номера, которые используются в процедурах парного обмена.
Для размерности i с periods(i) = true, если координата cords(i) выходит за границу диапазона, то есть когда coords(i) < 0 или coords(i) dims(i), то она автоматически сдвигается назад к интервалу 0 coords(i) < dims(i). Выход координат за пределы диапазона неверен для непериодических размерностей.
Синтаксис функции MPI_CART_COORDS представлен ниже.
MPI_CART_COORDS(comm, rank, maxdims, coords)
IN | comm | коммуникатор с декартовой топологией (дескриптор) | |
IN | rank | номер процесса внутри группы comm (целое) | |
IN | maxdims | длина вектора coord (целое) | |
OUT | coords | целочисленный массив (размера ndims), содержащий декартовы координаты указанного процесса (целое) |
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
void MPI::Cartcomm_Get_coords(int rank,
int maxdims, int coords[]) const
Функция MPI_CART_COORDS используется для перевода номера в координату.
Синтаксис функции MPI_GRAPH_NEIGHBORS_COUNT представлен ниже.
MPI_GRAPH_NEIGHBORS_COUNT(comm, rank, nneighbors)
IN | comm | коммуникатор с графовой топологией (дескриптор) | |
IN | rank | номер процесса в группе comm (целое) | |
OUT | nneighbors | номера процессов, являющихся соседними указанному процессу (целочисленный массив) |
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
int MPI::Graphcomm::Get_neighbors_count(int rank) const
Функции MPI_GRAPH_NEIGHBORS_COUNT и MPI_GRAPH_NEIGHBORS предоставляют похожую информацию для графической топологии.
Синтаксис функции MPI_GRAPH_NEIGHBORS представлен ниже.
MPI_GRAPH_NEIGHBORS(comm, rank, maxneighbors, neighbors)
IN | comm | коммуникатор с графовой топологией (дескриптор) | |
IN | rank | номер процесса в группе comm (целое) | |
IN | maxneighbors | размер массива neighbors (целое) | |
OUT | neighbors | номера процессов, соседних данному (целочисленный массив) |
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
void MPI::Graphcomm::Get_neighbors(int rank,
int maxneighbors, int neighbors[]) const
Пример 6.3 Предположим, что comm является коммуникатором с топологией типа ``тасовка''. Пусть группа содержит процессов. Каждый процесс задан двоичным n - разрядным кодом , где и имеет трех соседей: exchange ; shuffle и unshuffle . Таблица связей каждого процесса с соседями представлена ниже для n=3.
node | exchange
neighbors(1) |
shuffle
neighbors(2) |
unshuffle
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 |
Предположим, что коммуникатор comm имеет эту топологию. Представленный ниже фрагмент программы в цикле обходит трех соседей и делает соответствующую перестановку для каждого соседа.
C пусть каждый процесс хранит действительное число А
C получение информации о соседях
CALL MPI_COMM_RANK(comm, myrank, ierr)
CALL MPI_GRAPH_NEIGHBORS(comm, myrank, 3, neighbors, ierr)
C выполнение перестановки для exchange
CALL MPI_SENDRECV_REPLACE(A, 1, MPI_REAL, neighbors(1), 0,
+ neighbors(1), 0, comm, status, ierr)
C выполнение перестановки для shuffle
CALL MPI_SENDRECV_REPLACE(A, 1, MPI_REAL, neighbors(2), 0,
+ neighbors(3), 0, comm, status, ierr)
C выполнение перестановки для unshuffle
CALL MPI_SENDRECV_REPLACE(A, 1, MPI_REAL, neighbors(3), 0,
+ neighbors(2), 0, comm, status, ierr)