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

mpiexechost-machinefile -n 25 -- myprogr

Process rank 0 has coordinates 0 0

Process rank 1 has coordinates 0 1

Process rank 2 has coordinates 0 2

Process rank 3 has coordinates 0 3

Process rank 4 has coordinates 0 4

Process rank 5 has coordinates 1 0

Process rank 6 has coordinates 1 1

Process rank 7 has coordinates 1 2

Process rank 8 has coordinates 1 3

Process rank 9 has coordinates 1 4

Process rank 10 has coordinates 2 0

Process rank 11 has coordinates 2 1

Process rank 12 has coordinates 2 2

Process rank 13 has coordinates 2 3

Process rank 14 has coordinates 2 4

Process rank 15 has coordinates 3 0

Process rank 16 has coordinates 3 1

Process rank 17 has coordinates 3 2

Process rank 18 has coordinates 3 3

Process rank 19 has coordinates 3 4

Process rank 20 has coordinates 4 0

Process rank 21 has coordinates 4 1

Process rank 22 has coordinates 4 2

Process rank 23 has coordinates 4 3

Process rank 24 has coordinates 4 4

Для наглядности порядок строк вывода здесь изменен. Заметим, что в программе создается топология двумерной квадратной решетки 5x5, поэтому количество процессов при запуске должно быть 25.

Подпрограмма MPI_Cart_sub расщепляет коммуникатор comm на подгруппы, соответствующие декартовым подрешеткам меньшей размерности:

int MPI_Cart_sub(MPI_Comm comm, int *remain_dims,

 MPI_Comm *comm_new)

Здесь i-й элемент массива remain_dims определяет, содержится ли i-е измерение в подрешетке (true). Выходным параметром является коммуникатор newcomm, содержащий подрешетку, которой принадлежит данный процесс.

Пример разбиения двумерной решетки на одномерные подрешетки, соответствующие ее рядам, приводится ниже:

int coords[2];

MPI_Comm row_comm;

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

MPI_Cart_sub(grid_comm, coords, &row_comm);

В этом примере вызов подпрограммы MPI_Cart_sub создает несколько новых коммуникаторов. Аргумент coords определяет, принадлежит ли соответствующее измерение новому коммуникатору.

Несмотря на то, что подпрограмма MPI_Cart_sub выполняет функции, аналогичные MPI_Comm_split, т. е. расщепляет коммуникатор на набор новых коммуникаторов, между ними есть существенное различие — подпрограмма MPI_Cart_sub используется только с коммуникатором, наделенным декартовой топологией.

Информацию о декартовой топологии, связанной с коммуникатором comm, можно получить с помощью подпрограммы  MPI_Cart_get:

int MPI_Cart_get(MPI_Comm comm, int maxdims,

int *dims, int *periods, int *coords)

Входной параметр  maxdims  задает длину массивов  dims, periods и  vectors  в вызывающей программе, а выходные параметры:

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

·  periods — массив логических значений, задающих периодичность для каждого измерения (true, если решетка периодическая);

·  coords — целочисленный массив, задающий декартовы координаты вызывающего подпрограмму процесса.

С помощью подпрограммы MPI_Cart_map можно определить ранг процесса (newrank) в декартовой топологии после переупорядочения процессов:

int MPI_Cart_map(MPI_Comm comm_old, int ndims,

     int *dims, int *periods, int *newrank)

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

·  comm — коммуникатор;

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

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

·  periods — логический массив размера ndims, определяющий периодичность решетки вдоль каждого измерения.

Если процесс не принадлежит решетке, подпрограмма возвращает значение MPI_UNDEFINED.

Между процессами, организованными в декартову решетку, могут выполняться обмены особого вида. Это сдвиги, о которых мы уже упоминали. Имеются два типа сдвигов данных по группе из N процессов:

·  циклический сдвигна J позиций вдоль ребра решетки. Данные от процесса Кпересылаются процессу (J+К)modN;

·  линейный сдвигна J позиций вдоль ребра решетки, когда данные в процессе Кпересылаются процессу J+К, если ранг адресата находится в пределах между 0 и N.