mpiexec –host-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.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.