ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ
75
подпрограмма MPI_Cart_rank. С ее помощью можно определить ранг процесса
(rank) по его декартовым координатам в коммуникаторе comm:
int MPI_Cart_rank(MPI_Comm comm, int *coords, int *rank)
MPI_CART_RANK(COMM, COORDS, RANK, IERR)
Входной параметр coords — целочисленный массив размера ndims, задающий
декартовы координаты процесса. Как MPI_Cart_rank, так и MPI_Cart_coords локаль-
ны. Пример создания декартовой топологии приведен в прил. 4.
Подпрограмма MPI_Cart_sub расщепляет коммуникатор comm на подгруппы,
соответствующие декартовым подрешеткам меньшей размерности:
int MPI_Cart_sub(MPI_Comm comm, int *remain_dims, MPI_Comm
*comm_new)
MPI_CART_SUB(COMM, REMAIN_DIMS, COMM_NEW, IERR)
Здесь
i
-й элемент массива remain_dims определяет, содержится ли
i
-е измере-
ние в подрешетке ("истина"). Выходным параметром является коммуникатор
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)
MPI_CART_GET(COMM, MAXDIMS, DIMS, PERIODS, COORDS, IERR)
Входной параметр maxdims задает длину массивов
dims, periods и vectors в
вызывающей программе, а выходные параметры: