Параллельное программирование: Учебное пособие, страница 118

·  размерность решетки (значение 2, например, соответствует плоской, двумерной решетке);

·  размер решетки вдоль каждого измерения (размеры {10, 5}, например, соответствуют прямоугольной плоской решетке, протяженность которой вдоль оси х составляет 10 узлов-процессов, а вдоль оси у —5 узлов);

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

MPI дает возможность системе оптимизировать отображение виртуальной топологии процессов на физическую с помощью изменения порядка нумерации процессов в группе.

6.4.1  Декартовы топологии

Подпрограмма MPI_Cart_create создает новый коммуникатор comm_cart, наделяя декартовой топологией исходный коммуникатор comm_old:

int MPI_Cart_create(MPI_Comm comm_old, int ndims, int *dims, int *periods, int reorder, MPI_Comm *comm_cart)

Входные параметры:

·  comm_old — исходный коммуникатор;

·  ndims — размерность декартовой решетки;

·  dims — целочисленный массив, состоящий из ndims элементов, задающий количество процессов в каждом измерении;

·  periods — логический массив из ndims элементов, который определяет, является ли решетка периодической (значение "истина") вдоль каждого измерения;

·  reorder — при значении этого параметра "истина" системе разрешено менять порядок нумерации процессов.

Информация о структуре декартовой топологии содержится в параметрах ndims, dims  и  periods. MPI_Cart_create является коллективной операцией (эту подпрограмму должны вызывать все процессы из коммуникатора, наделяемого декартовой топологией).

После создания виртуальной топологии можно использовать соответствующую схему адресации процессов, но для этого требуется пересчет ранга процесса в его декартовы координаты и наоборот. Определить декартовы координаты процесса по его рангу в группе можно с помощью подпрограммы  MPI_Cart_coords:

int MPI_Cart_coords(MPI_Comm comm, int rank,

int maxdims, int *coords)

Входные параметры:

·  comm — коммуникатор, наделенный декартовой топологией;

·  rank — ранг процесса в comm;

·  maxdims — длина вектора coords в вызывающей программе.

Выходным параметром этой подпрограммы является одномерный целочисленный массив coords (его размер равен ndims), содержащий декартовы координаты процесса.

Обратным действием по отношению к MPI_Cart_coords обладает подпрограмма MPI_Cart_rank. С ее помощью можно определить ранг процесса (rank) по его декартовым координатам в коммуникаторе comm:

int MPI_Cart_rank(MPI_Comm comm,

int *coords, int *rank)

Входной параметр coords — целочисленный массив размера ndims, задающий декартовы координаты процесса. Как MPI_Cart_rank, так и MPI_Cart_coords  локальны.

Текст 6.3. Создание декартовой топологии

#include "mpi.h"

#include <stdio.h>

int main(int argc, char *argv[])

{

MPI_Comm grid_comm;

int dims[2];

int periodic[2];

int reorder =1, q = 5, ndims = 2, maxdims = 2;

int coordinates[2];

int my_grid_rank;

int coords[2];

MPI_Comm row_comm;

dims[0] = dims[l] = q;

periodic[0] = periodic[1] = 1;

coords[0] = 0; coords[1] = 1;

MPI_Init(&argc, &argv);

MPI_Cart_create(MPI_COMM_WORLD, ndims, dims, periodic, reorder, &grid_comm);

MPI_Comm_rank(grid_comm, &my_grid_rank);

MPI_Cart_coords(grid_comm, my_grid_rank, maxdims, coordinates);

printf("Process rank %i has coordinates %i %i\n", my_grid_rank, coordinates [0], coordinates[1]);

MPI_Finalize();

return 0;

}

В этой программе коммуникатор grid_comm наделяется топологией двумерной решетки с периодическими граничными условиями, причем системе разрешено изменить порядок нумерации процессов. С учетом последнего, каждый процесс из коммуникатора grid_comm может определить свой ранг с помощью подпрограммы MPI_Comm_rank. Декартовы координаты определяются при вызове подпрограммы MPI_Cart_coords. В программе создается топология двумерной квадратной решетки 5x5, поэтому количество процессов при запуске должно быть 25. Результат выполнения этой программы выглядит так: