Декартова топология
Обобщением линейной и матричной топологий на произвольное число измерений является декартова топология. Для создания коммуникатора с декартовой топологией используется функция MPI_Cart_create. С помощью этой функции можно создавать топологии с произвольным числом измерений, причем по каждому измерению в отдельности можно накладывать периодические граничные условия. Таким образом, для одномерной топологии мы можем получить или линейную структуру, или кольцо - в зависимости от того, какие граничные условия будут наложены. Для двумерной топологии, соответственно, либо прямоугольник, либо цилиндр, либо тор. Заметим, что не требуется специальной поддержки гиперкубовой структуры, поскольку она представляет собой n-мерный тор с двумя процессами вдоль каждого координатного направления. Функция создания коммуникатора с декартовой топологией. С: MPI_Cart_create(MPI_Comm comm_old, int ndims, int *dims, int *periods, int reorder, MPI_Comm *comm_cart) FORTRAN: MPI_CART_CREATE(COMM_OLD, NDIMS, DIMS, PERIODS, REORDER, COMM_CART, IERROR) INTEGER COMM_OLD, NDIMS, DIMS(*), COMM_CART, IERROR LOGICAL PERIODS(*), REORDER
Функция является коллективной, т.е. должна запускаться на всех процессах, входящих в группу коммуникатора comm_old. При этом, если какие-то процессы не попадают в новую группу, то для них возвращается результат MPI_COMM_NULL. В случае, когда размеры заказываемой сетки больше имеющегося в группе числа процессов, функция завершается аварийно. Значение параметра reorder=false означает, что идентификаторы всех процессов в новой группе будут такими же, как в старой группе. Если reorder=true, то MPI будет пытаться перенумеровать их с целью оптимизации коммуникаций. Остальные функции, которые будут рассмотрены в этом разделе, имеют вспомогательный или информационный характер. Функция определения оптимальной конфигурации сетки. С: MPI_Dims_create(int nnodes, int ndims, int *dims) FORTRAN: MPI_DIMS_CREATE(NNODES, NDIMS, DIMS, IERROR) INTEGER NNODES, NDIMS, DIMS(*), IERROR
На входе в процедуру в массив dims должны быть занесены целые неотрицательные числа. Если элементу массива dims[i] присвоено положительное число, то для этой размерности вычисление не производится (число процессов вдоль этого направления считается заданным). Вычисляются только те компоненты dims[i], для которых перед обращением к процедуре были присвоены значения 0. Функция стремится создать максимально равномерное распределение процессов вдоль направлений, выстраивая их по убыванию, т.е. для 12 процессов она построит трехмерную сетку 4 х 3 х 1. Результат работы этой процедуры может использоваться в качестве входного параметра для процедуры MPI_Cart_create. Функция опроса числа измерений декартовой топологии MPI_Cartdim_get. С: MPI_Cartdim_get(MPI_Comm comm, int *ndims) FORTRAN: MPI_CARTDIM_GET(COMM, NDIMS, IERROR) INTEGER COMM, NDIMS, IERROR
Функция возвращает число измерений в декартовой топологии ndims для коммуникатора comm. Результат может быть использован в качестве параметра для вызова функции MPI_Cart_get, которая служит для получения более детальной информации. С: MPI_Cart_get(MPI_Comm comm, int ndims, int *dims, int *periods, int *coords) FORTRAN: MPI_CART_GET(COMM, NDIMS, DIMS, PERIODS, COORDS, IERROR) INTEGER COMM, NDIMS, DIMS(*), COORDS(*), IERROR LOGICAL PERIODS(*)
Две следующие функции устанавливают соответствие между идентификатором процесса и его координатами в декартовой сетке. Под идентификатором процесса понимается его номер в исходной области связи, из которой была создана декартова топология. Функция получения идентификатора процесса по его координатам MPI_Cart_rank. С: MPI_Cart_rank(MPI_Comm comm, int *coords, int *rank) FORTRAN: MPI_CART_RANK(COMM, COORDS, RANK, IERROR) INTEGER COMM, COORDS(*), RANK, IERROR
Для измерений с периодическими граничными условиями будет выполняться приведение к основной области определения 0 <= coords(i) < dims(i). Функция определения координат процесса по его идентификатору MPI_Cart_coords. С: MPI_Cart_coords(MPI_Comm comm, int rank, int ndims, int *coords) FORTRAN: MPI_CART_COORDS(COMM, RANK, NDIMS, COORDS, IERROR) INTEGER COMM, RANK, NDIMS, COORDS(*), IERROR
Во многих численных алгоритмах используется операция сдвига данных вдоль каких-то направлений декартовой решетки. В MPI существует специальная функция MPI_Cart_shift, реализующая эту операцию. Точнее говоря, сдвиг данных осуществляется с помощью функции MPI_Sendrecv, а функция MPI_Cart_shift вычисляет для каждого процесса параметры для функции MPI_Sendrecv (source и dest). Функция сдвига данных MPI_Cart_shift. С: MPI_Cart_shift(MPI_Comm comm, int direction, int disp, int *rank_source, int *rank_dest) FORTRAN: MPI_CART_SHIFT(COMM, DIRECTION, DISP, RANK_SOURCE, RANK_DEST, IERROR) INTEGER COMM, DIRECTION, DISP, RANK_SOURCE, RANK_DEST, IERROR
Номер измерения и величина сдвига не обязаны быть одинаковыми для всех процессов. В зависимости от граничных условий сдвиг может быть либо циклический, либо с учетом граничных процессов. В последнем случае для граничных процессов возвращается MPI_PROC_NULL либо для переменной rank_source, либо для rank_dest. Это значение также может быть использовано при обращении к функции MPI_sendrecv. Другая, часто используемая операция - выделение в декартовой топологии подпространств меньшей размерности и связывание с ними отдельных коммуникаторов. Функция выделения подпространства в декартовой топологии MPI_Cart_sub. С: MPI_Cart_sub(MPI_Comm comm, int *remain_dims, MPI_Comm *newcomm) FORTRAN: MPI_CART_SUB(COMM, REMAIN_DIMS, NEWCOMM, IERROR) INTEGER COMM, NEWCOMM, IERROR LOGICAL REMAIN_DIMS(*)
Функция является коллективной. Действие функции проиллюстрируем следующим примером. Предположим, что имеется декартова решетка 2 х 3 х 4, тогда обращение к функции MPI_Cart_sub с массивом remain_dims (true, false, true) создаст три коммуникатора с топологией 2 х 4. Каждый из коммуникаторов будет описывать область связи, состоящую из 1/3 процессов, входивших в исходную область связи. Кроме рассмотренных функций, в MPI входит набор из 6 функций для работы с коммуникаторами с топологией графов, которые в данном методическом пособии мы рассматривать не будем. Для определения топологии коммуникатора служит функция MPI_Topo_test. С: MPI_Topo_test(MPI_Comm comm, int *status) FORTRAN: MPI_TOPO_TEST(COMM, STATUS, IERROR) INTEGER COMM, STATUS, IERROR
Функция MPI_Topo_test возвращает через переменную status топологию коммуникатора comm. Возможные значения:
8.1. Вычисление числа Данный пример хорошо иллюстрирует общность подходов к разработке параллельных программ с использованием различных сред параллельного программирования. Во многих случаях имена одних функций просто меняются на имена других идентичных им функций. В частности, если сопоставить параллельную версию программы вычисления числа с использованием средств PSE и предлагаемую ниже программу, то мы увидим практически один и тот же набор средств, отличающихся только своей реализацией. Однако, при разработке сложных программ среда параллельного программирования MPI предоставляет более удобные средства для разработки параллельных приложений, поскольку содержит в себе высокоэффективные реализации достаточно сложных алгоритмов обмена данными. Как и в примере с использованием среды параллельного программирования PSE, жирным шрифтом будем выделять изменения в программе по сравнению с однопроцессорной версией. program calc_pi с инициализация MPI и определение процессорной конфигурации call MPI_INIT(ierr) с информацию с клавиатуры считывает 0-й процессор if (myid.eq. 0) then с рассылка числа точек разбиения всем процессорам
|