Функция создания коммуникатора с декартовой топологией
С:
MPI_Cart_create(MPI_Comm comm_old, int ndims, int *dims,
int *periods, int reorder, MPI_Comm *comm_cart)
IN | comm_old | - | родительский коммуникатор; |
IN | ndims | - | число измерений; |
IN | dims | - | массив размера ndims, в котором задается число процессов вдоль каждого измерения; |
IN | periods | - | логический массив размера ndims для задания граничных условий (true - периодические, false - непериодические); |
IN | reorder | - | логическая переменная, указывает, производить перенумерацию процессов (true) или нет (false); |
OUT | comm_cart | - | новый коммуникатор. |
Функция является коллективной, т.е. должна запускаться на всех процессах, входящих в группу коммуникатора comm_old. При этом, если какие-то процессы не попадают в новую группу, то для них возвращается результат MPI_COMM_NULL. В случае, когда размеры заказываемой сетки больше имеющегося в группе числа процессов, функция завершается аварийно. Значение параметра reorder=false означает, что идентификаторы всех процессов в новой группе будут такими же, как в старой группе. Если reorder=true, то MPI будет пытаться перенумеровать их с целью оптимизации коммуникаций.
Остальные функции, которые будут рассмотрены в этом разделе, имеют вспомогательный или информационный характер.
Функция определения оптимальной конфигурации сетки
С:
MPI_Dims_create(int nnodes, int ndims, int *dims)
IN | nnodes | - | общее число узлов в сетке; |
IN | ndims | - | число измерений; |
INOUT | dims | - | массив целого типа размерности ndims, в который помещается рекомендуемое число процессов вдоль каждого измерения. |
На входе в процедуру в массив dims должны быть занесены целые неотрицательные числа. Если элементу массива dims[i] присвоено положительное число, то для этой размерности вычисление не производится (число процессов вдоль этого направления считается заданным). Вычисляются только те компоненты dims[i], для которых перед обращением к процедуре были присвоены значения 0. Функция стремится создать максимально равномерное распределение процессов вдоль направлений, выстраивая их по убыванию, т.е. для 12-ти процессов она построит трехмерную сетку 4 х 3 х 1. Результат работы этой процедуры может использоваться в качестве входного параметра для процедуры MPI_Cart_create.
Функция опроса числа измерений декартовой топологии MPI_Cartdim_get
С:
MPI_Cartdim_get(MPI_Comm comm, int *ndims)
IN | comm | - | коммуникатор с декартовой топологией; |
OUT | ndim | - | число измерений в декартовой топологии. |
Функция возвращает число измерений в декартовой топологии ndims для коммуникатора comm.
Результат может быть использован в качестве параметра для вызова функции MPI_Cart_get, которая служит для получения более детальной информации.
С:
MPI_Cart_get(MPI_Comm comm, int ndims, int *dims,
int *periods, int *coords)
IN | comm | - | коммуникатор с декартовой топологией; |
IN | ndims | - | число измерений; |
OUT | dims | - | массив размера ndims, в котором возвращается число процессов вдоль каждого измерения; |
OUT | periods | - | логический массив размера ndims, в котором возвращаются наложенные граничные условия; (true - периодические, false - непериодические); |
OUT | coords | - | координаты в декартовой сетке вызывающего процесса. |
Две следующие функции устанавливают соответствие между идентификатором процесса и его координатами в декартовой сетке. Под идентификатором процесса понимается его номер в исходной области связи, из которой была создана декартова топология.
Функция получения идентификатора процесса по его координатам MPI_Cart_rank
С:
MPI_Cart_rank(MPI_Comm comm, int *coords, int *rank)
IN | comm | - | коммуникатор с декартовой топологией; |
IN | coords | - | координаты в декартовой системе; |
OUT | rank | - | идентификатор процесса. |
Для измерений с периодическими граничными условиями будет выполняться приведение к основной области определения 0 <= coords(i) < dims(i).
Функция определения координат процесса по его идентификатору MPI_Cart_coords
С:
MPI_Cart_coords(MPI_Comm comm, int rank, int ndims, int *coords)
IN | comm | - | коммуникатор с декартовой топологией; |
IN | rank | - | идентификатор процесса; |
IN | ndim | - | число измерений; |
OUT | coords | - | координаты процесса в декартовой топологии. |
Во многих численных алгоритмах используется операция сдвига данных вдоль каких-то направлений декартовой решетки. В 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)
IN | comm | - | коммуникатор с декартовой топологией; |
IN | direction | - | номер измерения, вдоль которого выполняется сдвиг; |
IN | disp | - | величина сдвига (может быть как положительной, так и отрицательной); |
OUT | rank_sourceа | - | номер процесса, от которого должны быть получены данные; |
OUT | rank_dest | - | номер процесса, которому должны быть посланы данные. |
Номер измерения и величина сдвига не обязаны быть одинаковыми для всех процессов. В зависимости от граничных условий сдвиг может быть либо циклический, либо с учетом граничных процессов. В последнем случае для граничных процессов возвращается MPI_PROC_NULL либо для переменной rank_source, либо для rank_dest. Это значение также может быть использовано при обращении к функции MPI_sendrecv.
Другая часто используемая операция - выделение в декартовой топологии подпространств меньшей размерности и связывание с ними отдельных коммуникаторов.
Функция выделения подпространства в декартовой топологии MPI_Cart_sub
С:
MPI_Cart_sub(MPI_Comm comm, int *remain_dims,
MPI_Comm *newcomm)
IN | comm | - | коммуникатор с декартовой топологией; |
IN | remain_dims | - | логический массив размера ndims, указывающий, входит ли i-e измерение в новую подрешетку (remain_dims[i] = true); |
OUT | newcomm | - | новый коммуникатор, описывающий подрешетку, содержащую вызывающий процесс. |
Функция является коллективной. Действие функции проиллюстрируем следующим примером. Предположим, что имеется декартова решетка 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)
IN | comm | - коммуникатор; |
OUT | status | - топология коммуникатора. |
Функция MPI_Topo_test возвращает через переменную status топологию коммуникатора comm. Возможные значения:
MPI_GRAPH | - топология графа; |
MPI_CART | - декартова топология; |
MPI_UNDEFINED | - топология не задана. |