
- •Федеральное агентство по атомной энергии
- •Национальный исследовательский ядерный университет «мифи»
- •Средства разработки параллельных приложений на общей и распределенной памяти в стандарте интерфейса передачи данных mpi и openmp c реализации курс лекций
- •Void main(int argc, char *argv[] ){
- •Int rank, size;
- •Int mpi_Send(void* buf, int count, mpi_Datatype datatype, int dest, int tag, mpi_Comm comm)
- •Int mpi_Get_count(mpi_Status *status, mpi_Datatype datatype, int *count)
- •Стандартный режим передачи
- •Буферизующий режим передачи
- •1. Барьерная синхронизация - mpi_Barrier (comm)
- •2. Широковещательная передача
- •3. Сбор данных
- •4. Рассылка данных
- •5. Операции редукции (обработки данных)
- •Непрерывный.
- •2. Вектор
- •Int mpi_Type_hvector(int count, int blocklength, int stride, mpi_Datatype oldtype,
- •4. Индексированные данные
- •6. Структурный
- •3. Mpi_Group_translate_ranks (mpi_Group group1, int n, int *ranks1, mpi_Group group2, int *ranks2)
- •4. Mpi_Group _compare(group1, group2, result)
- •6. Mpi_Group _excl(group, n, ranks, newgroup)
- •1. Mpi_Comm_size (comm, size)
- •2. Mpi_Comm_rank(comm, rank)
- •3. Mpi_Comm_compare(comm1, comm2, result)
- •1. Mpi_Comm_dup(comm, newcomm)
- •2. Mpi_Comm_create(comm, group, newcomm)
- •3. Mpi_Comm_split(comm, color, key, newcomm)
- •1. Mpi_Cart_create(mpi_Comm comm_old, int ndims, int *dims, int *periods, int reorder, mpi_Comm *comm_cart)
- •2. Mpi_Dims_create(int nnodes, int ndims, int *dims)
- •1. Mpi_Cartdim_get(mpi_Comm comm, int *ndims)
- •2. Mpi_Cart_get(mpi_Comm comm, int maxdims, int *dims, int *periods, int *coords)
- •3. Int mpi_Cart_rank(mpi_Comm comm, int *coords, int *rank)
- •4. Int mpi_Cart_coords(mpi_Comm comm, int rank, int maxdims, int *coords)
- •5. Координаты декартова сдвига
- •Int mpi_Graph_create(mpi_Comm comm_old, int nnodes, int *index, int *edges, int reorder, mpi_Comm *comm_graph)
- •Int mpi_Topo_test(mpi_Comm comm, int *status)
- •Default(shared | none)
- •Void main()
- •Void main()
- •Int a[10], b[10], c[10]; // целочисленные массивы
- •2. Оператор sections
- •3. Оператор single
- •Void main()
- •10. Функция omp_get_nested
- •Int omp_get_nested(void)
3. Int mpi_Cart_rank(mpi_Comm comm, int *coords, int *rank)
IN comm коммуникатор с декартовой топологией (дескриптор)
IN coords целочисленный массив (размера ndims), описывающий декартовы координаты процесса
OUT rank номер указанного процесса (целое)
MPI_Cart_rank переводит логические координаты процессов в их физические номера (номер процесса в группе), которые используются при выполнении обменов.
Для размерности i с periods(i) = true, если координата cords(i) выходит за границу диапазона – coords(i)<0 или coords(i)≥dims(i), она автоматически сдвигается назад к интервалу 0≤coords(i)<dims(i). Выход координат за пределы диапазона неверен для непериодических размерностей.
4. Int mpi_Cart_coords(mpi_Comm comm, int rank, int maxdims, int *coords)
IN comm коммуникатор с декартовой топологией (дескриптор)
N rank номер процесса внутри группы comm (целое)
IN maxdims длина вектора coord (целое)
OUT coords целочисленный массив (размера ndims), содержащий декартовы координаты указанного процесса (целое)
MPI_Cart_coords используется для перевода номера процесса в группе в логическую координату.
5. Координаты декартова сдвига
Если топология это декартова структура, то MPI_SENDRECV часто используется вдоль какой-нибудь координаты, чтобы произвести сдвиг данных. На вход функции MPI_SENDRECV нужно подавать ранг источника для приёма и ранг приёмника для передачи. Вызов функции MPI_Cart_shift определяет эти аргументы.
MPI_Cart_shift(comm, direction, disp, rank_source, rank_dest)
IN comm - коммуникатор с декартовой структурой
IN direction - координата сдвига (integer)
IN disp - смещение (> 0: сдвиг вперёд, < 0: сдвиг назад) (integer)
OUT rank_source - ранг процесса источника (integer)
OUT rank_source - ранг процесса источника (integer)
direction определяет координату значение которой изменяется сдвигом. Координаты нумеруются от 0 до ndims-1, где ndims количество размерностей. В зависимости от периодичности декартовой группы по выделенной координате MPI_Cart_shift даёт циклический или конечный сдвиг. В случае конечного сдвига, в rank_source или rank_dest может быть возвращено значение MPI_PROC_NULL, которые отмечают, что источник или приёмник при сдвиге выходят за допустимые пределы.
Пример: На основе группы из 8 процессов создали декартову топологию: {2,4}, определим смещение disp =1
Решетка процессов не периодичная, direction=0 задает сдвиг по строкам (вдоль столбцов)
0
1 2 3 0 проц.
получает от проц. -1 и отправляет проц.
4
1 проц. получает от проц. -1 и отправляет проц. 5 4 5 6 7
0 ----- -1 rank_source 4 rank_dest
1 ----- -1 5
2 ----- -1 6
3 ----- -1 7
4 ----- 0 -1
5 ----- 1 -1
6 ----- 2 -1
7 ----- 3 -1
Решетка процессов периодичная, direction=0 задает сдвиг по строкам (вдоль столбцов)
0
1 2 3 0 проц.
получает от проц. 4 и отправляет проц. 4
1 проц.
получает от проц. 5 и отправляет проц. 5
4 5 6 7
0 ----- 4 rank_source 4 rank_dest
1 ----- 5 5
2 ----- 6 6
3 ----- 7 7
4 ----- 0 0
5 ----- 1 1
6 ----- 2 2
7 ----- 3 3
Решетка процессов не периодичная, direction=1 задает сдвиг по столбцам (вдоль строк)
0 1 2 3 0 проц. получает от проц. -1 и отправляет проц. 1
1 проц. получает от проц. 0 и отправляет проц. 2 4 5 6 7
0 ----- -1 rank_source 1 rank_dest
1 ----- 0 2
2 ----- 1 3
3 ----- -1 7
4 ----- 2 -1
5 ----- -1 5
6 ----- 4 6
7 ----- 6 -1
Решетка процессов периодичная, direction=1 задает сдвиг по столбцам (вдоль строк)
0 1 2 3 0 проц. получает от проц. 3 и отправляет проц. 1
1 проц. получает от проц. 0 и отправляет проц. 2 4 5 6 7
0 ----- 3 rank_source 1 rank_dest
1 ----- 0 2
2 ----- 1 3
3 ----- 2 0
4 ----- 7 5
5 ----- 4 6
6 ----- 5 7
7 ----- 6 4
Конструктор универсальной (графовой) топологии