Введение в параллельные вычисления. Технология программирования MPI (день шестой) Антонов Александр Сергеевич, к.ф.-м.н., н.с. лаборатории Параллельных информационных технологий НИВЦ МГУ
MPI Группа – упорядоченное множество процессов. Каждому процессу в группе сопоставлено целое число – ранг. MPI_GROUP_EMPTY – пустая группа. MPI_GROUP_NULL – значение, используемое для ошибочной группы. Новую группу можно создать только из уже существующих групп.
MPI Коммуникатор – контекст обмена группы. В операциях обмена используются только коммуникаторы! MPI_COMM_WORLD – коммуникатор для всех процессов приложения. MPI_COMM_NULL – значение, используемое для ошибочного коммуникатора. MPI_COMM_SELF – коммуникатор, включающий только вызвавший процесс.
MPI MPI_COMM_GROUP(COMM, GROUP, IERR) INTEGER COMM, GROUP, IERR Получение группы GROUP, соответствующей коммуникатору COMM.
MPI MPI_GROUP_INCL(GROUP, N, RANKS, NEWGROUP, IERR) INTEGER GROUP, N, RANKS(*), NEWGROUP, IERR Создание группы NEWGROUP из N процессов группы GROUP с рангами RANKS(1),…,RANKS(N), причем рангу RANKS(I) в старой группе соответствует ранг I в новой группе. При N=0 создается пустая группа MPI_GROUP_EMPTY.
MPI MPI_GROUP_EXCL(GROUP, N, RANKS, NEWGROUP, IERR) INTEGER GROUP, N, RANKS(*), NEWGROUP, IERR Создание группы NEWGROUP из процессов группы GROUP, исключая процессы с рангами RANKS(1),…,RANKS(N), причем рангу порядок процессов в новой группе соответствует порядку процессов в старой группе.
MPI MPI_GROUP_INTERSECTION(GROUP1, GROUP2, NEWGROUP, IERR) INTEGER GROUP1, GROUP2, NEWGROUP, IERR Создание группы NEWGROUP из пересечения групп GROUP1 и GROUP2.
MPI MPI_GROUP_UNION(GROUP1, GROUP2, NEWGROUP, IERR) INTEGER GROUP1, GROUP2, NEWGROUP, IERR Создание группы NEWGROUP из объединения групп GROUP1 и GROUP2.
MPI MPI_GROUP_DIFFERENCE(GROUP1, GROUP2, NEWGROUP, IERR) INTEGER GROUP1, GROUP2, NEWGROUP, IERR Создание группы NEWGROUP из разности групп GROUP1 и GROUP2.
MPI MPI_GROUP_FREE(GROUP, IERR) INTEGER GROUP, IERR Уничтожение группы GROUP. Переменная GROUP принимает значение MPI_GROUP_NULL.
MPI MPI_GROUP_SIZE(GROUP, SIZE, IERR) INTEGER GROUP, SIZE, IERR MPI_GROUP_RANK(GROUP, RANK, IERR) INTEGER GROUP, RANK, IERR Определение количества процессов и номера процесса в группе. Если процесс не входит в группу, то возвращается значение MPI_UNDEFINED.
MPI MPI_GROUP_TRANSLATE_RANKS(GROUP1, N, RANKS1, GROUP2, RANKS2, IERR) INTEGER GROUP1, N, RANKS1(*), GROUP2, RANKS2(*), IERR В массиве RANKS2 возвращаются ранги в группе GROUP2 процессов с рангами RANKS1 в группе GROUP1.
MPI MPI_GROUP_COMPARE(GROUP1, GROUP2, RESULT, IERR) INTEGER GROUP1, GROUP2, RESULT, IERR Сравнение групп GROUP1 и GROUP2. Если совпадают, то возвращается значение MPI_IDENT. Если отличаются только рангами процессов, то возвращается значение MPI_SIMILAR. Иначе возвращается значение MPI_UNEQAL.
MPI MPI_COMM_DUP(COMM, NEWCOMM, IERR) INTEGER COMM, NEWCOMM, IERR Создание нового коммуникатора NEWCOMM с той же группой процессов и атрибутами, что и у коммуникатора COMM.
MPI MPI_COMM_CREATE(COMM, GROUP, NEWCOMM, IERR) INTEGER COMM, GROUP, NEWCOMM, IERR Создание нового коммуникатора NEWCOMM из коммуникатора COMM с группой процессов GROUP. Вызов должен стоять во всех процессах коммуникатора COMM. На процессах, не принадлежащих GROUP вернется значение MPI_COMM_NULL.
MPI call MPI_COMM_GROUP(MPI_COMM_WORLD, & group, ierr) do i=1,NPROCS/2 ranks(i)=i-1 enddo if (rank.lt. NPROCS/2) then call MPI_GROUP_INCL(group, NPROCS/2, & ranks, new_group, ierr) else call MPI_GROUP_EXCL(group, NPROCS/2, & ranks, new_group, ierr) endif
MPI call MPI_COMM_CREATE(MPI_COMM_WORLD, & new_group, new_comm, ierr) call MPI_ALLREDUCE(sbuf, rbuf, 1, & MPI_INTEGER, MPI_SUM, new_comm, & ierr) call MPI_GROUP_RANK(new_group, new_rank, & ierr) print *, 'rank= ', rank, ' newrank= ', & new_rank, ' rbuf= ', rbuf
MPI MPI_COMM_SPLIT(COMM, COLOR, KEY, NEWCOMM, IERR) INTEGER COMM, COLOR, KEY, NEWCOMM, IERR Разбиение коммуникатора COMM на несколько по числу значений параметра COLOR. В одну подгруппу попадают процессы с одним значением COLOR. Процессы с бОльшим значением KEY получат больший ранг.
MPI Процессы, которые не должны войти в новые группы, указывают в качестве COLOR константу MPI_UNDEFINED. Им в параметре NEWCOMM вернется значение MPI_COMM_NULL. call MPI_COMM_SPLIT(MPI_COMM_WORLD, & mod(rank, 3), rank, new_comm, & ierr)
MPI MPI_COMM_FREE(COMM, IERR) INTEGER COMM, IERR Удаление коммуникатора COMM. Переменной COMM присваивается значение MPI_COMM_NULL.
MPI Топология – механизм сопоставления процессам альтернативной схемы адресации. В MPI топологии виртуальны, не связаны с физической топологией сети. Два типа топологий: декартова (прямоугольная решетка произвольной размерности) топология графа.
MPI MPI_CART_CREATE(COMM, NDIMS, DIMS, PERIODS, REORDER, COMM_CART, IERR) INTEGER COMM, NDIMS, DIMS(*), COMM_CART, IERR LOGICAL PERIODS(*), REORDER Создание декартовой топологии COMM_CART. NDIMS – размерность декартовой решетки, DIMS – число элементов в каждом измерении.
MPI PERIODS – массив из NDIMS элементов, определяющий, является ли решетка периодической вдоль каждого измерения. REORDER – при значении.TRUE. системе разрешено менять порядок нумерации процессов. Подпрограмма должна быть вызвана всеми процессами коммуникатора. Некоторым процессам может вернуться значение MPI_COMM_NULL.
MPI MPI_DIMS_CREATE(NNODES, NDIMS, DIMS, IERR) INTEGER NNODES, NDIMS, DIMS(*), IERR Определение размеров DIMS для каждой из NDIMS размерностей при создании декартовой топологии для NNODES процессов. DIMS(I) рассчитывается, если перед вызовом функции оно равно 0, иначе оставляется без изменений.
MPI Размеры по разным размерностям устанавливаются так, чтобы быть возможно близкими друг к другу. Перед вызовом функции значение NNODES должно быть кратно произведению ненулевых значений массива DIMS. Выходные значения массива DIMS, переопределенные функцией, будут упорядочены в порядке убывания.
MPI MPI_CART_COORDS(COMM, RANK, MAXDIMS, COORDS, IERR) INTEGER COMM, RANK, MAXDIMS, COORDS(*), IERR Определение декартовых координат процесса по его рангу. Координаты возвращаются в массиве COORDS. Отсчет координат по каждому измерению начинается с 0.
MPI MPI_CART_RANK(COMM, COORDS, RANK, IERR) INTEGER COMM, COORDS(*), RANK, IERR Определение ранга процесса по его декартовым координатам. Для периодических решеток координаты вне допустимых интервалов пересчитываются, для непериодических – ошибочны.
MPI MPI_CART_SUB(COMM, DIMS, NEWCOMM, IERR) INTEGER COMM, NEWCOMM, IERR LOGICAL DIMS(*) Расщепление коммуникатора COMM на подгруппы, соответствующие декартовым подрешеткам меньшей размерности. I –й элемент массива равен.TRUE., если I –е измерение должно остаться в подрешетке.
MPI MPI_CARTDIM_GET(COMM, NDIMS, IERR) INTEGER COMM, NDIMS, IERR Определение размерности декартовой топологии коммуникатора COMM.
MPI MPI_CART_GET(COMM, MAXDIMS, DIMS, PERIODS, COORDS, IERR) INTEGER COMM, MAXDIMS, DIMS(*), COORDS(*), IERR LOGICAL PERIODS(*) Получение информации о декартовой топологии коммуникатора COMM и координатах в ней вызвавшего процесса.
MPI MPI_CART_SHIFT(COMM, DIRECTION, DISP, SOURCE, DEST, IERR) INTEGER COMM, DIRECTION, DISP, SOURCE, DEST, IERR Получение номеров посылающего и принимающего процессов в декартовой топологии коммуникатора COMM для осуществления сдвига вдоль измерения DIRECTION на величину DISP.
MPI Для периодических измерений осуществляется циклический сдвиг, для непериодических – линейный сдвиг. Для n-мерной декартовой решетки значение DIRECTION должно быть в пределах от 0 до n-1. Значения SOURCE и DEST в можно использовать, например, для обмена функцией MPI_SENDRECV.
MPI periods(1)=.TRUE. periods(2)=.TRUE. call MPI_CART_CREATE(MPI_COMM_WORLD, 2, & dims, periods,.TRUE., comm, ierr) call MPI_COMM_RANK(comm, rank, ierr) call MPI_CART_COORDS(comm, rank, & 2, coords, ierr) call MPI_CART_SHIFT(comm, 0, shift, & source, dest, ierr) call MPI_SENDRECV_REPLACE(A, 1, & MPI_REAL, dest, 0, source, 0, & comm, status, ierr)
MPI MPI_GRAPH_CREATE(COMM, NNODES, INDEX, EDGES, REORDER, COMM_GRAPH, IERR) INTEGER COMM, NNODES, INDEX(*), EDGES(*), COMM_GRAPH, IERR LOGICAL REORDER Создание топологии графа COMM_GRAPH. NNODES – число вершин графа, INDEX(I) содержит суммарное количество соседей для первых I вершин.
MPI EDGES содержит упорядоченный список номеров процессов-соседей. REORDER – при значении.TRUE. системе разрешено менять порядок нумерации процессов. Подпрограмма должна быть вызвана всеми процессами коммуникатора. Некоторым процессам может вернуться значение MPI_COMM_NULL.
MPI NNODES=4 INDEX=2, 3, 4, 6 EDGES=1, 3, 0, 3, 0, 2 ПроцессСоседи 01, , 2
MPI MPI_GRAPH_NEIGHBORS_COUNT(COMM, RANK, NNEIGHBORS, IERR) INTEGER COMM, RANK, NNEIGHBORS, IERR Определение количества непосредственных соседей данной вершины графа.
MPI MPI_GRAPH_NEIGHBORS(COMM, RANK, MAX, NEIGHBORS, IERR) INTEGER COMM, RANK, MAX, NEIGHBORS(*), IERR Определение непосредственных соседей данной вершины графа.
MPI MPI_GRAPHDIMS_GET(COMM, NNODES, NEDGES, IERR) INTEGER COMM, NNODES, NEDGES, IERR Определение числа вершин и числа ребер графа.
MPI MPI_GRAPH_GET(COMM, MAXINDEX, MAXEDGES, INDEX, EDGES, IERR) INTEGER COMM, MAXINDEX, MAXEDGES, INDEX(*), EDGES(*), IERR Определение информации о топологии графа.
MPI MPI_TOPO_TEST(COMM, TYPE, IERR) INTEGER COMM, TYPE, IERR Определение типа топологии, связанной с коммуникатором COMM. MPI_GRAPH для графа MPI_CART для декартовой топологии MPI_UNDEFINED – нет связанной топологии.