next up previous contents
Next: Сдвиг в декартовых координатах Up: Топологические конструкторы Previous: Конструктор универсальной (графовой) топологии   Contents

Топологические функции запроса

Если топология была определена одной из вышеупомянутых функций, то информация об этой топологии может быть получена с помощью функций запроса. Все они являются локальными вызовами.

Синтаксис функции 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) $ \geq $ dims(i), то она автоматически сдвигается назад к интервалу 0 $ \leq $ 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 является коммуникатором с топологией типа ``тасовка''. Пусть группа содержит $2^n$ процессов. Каждый процесс задан двоичным n - разрядным кодом $а_{1}, а_{2}, \dots, а_{n}$ , где $а_{i} \in \{0,1\}$ и имеет трех соседей: exchange $(а_{1}, \dots, а_{n}) \quad _{ = }а_{1}, \dots , а_{n - 1}, {a}_{n} ({a} =
1-а)$; shuffle $(а_{1}, \dots , а_{n}) = а_{2}, \dots , а_{n},
а_{1}$ и unshuffle $(а_{1} , \dots, а_{n}) = а_{n }, а_{1}, \dots, а_{n - 1}$. Таблица связей каждого процесса с соседями представлена ниже для 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)


next up previous contents
Next: Сдвиг в декартовых координатах Up: Топологические конструкторы Previous: Конструктор универсальной (графовой) топологии   Contents
Alex Otwagin 2002-12-10