Виртуальные топологии
Топология графа
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 вершин. Массив EDGES содержит упорядоченный список номеров процессов-соседей всех вершин. Параметр REORDER при значении .TRUE, означает, что системе разрешено менять порядок нумерации процессов.
Процедура является коллективной, а значит, должна быть вызвана всеми процессами исходного коммуникатора. Если NNODES меньше числа процессов коммуникатора сомм, то некоторым процессам вернется значение MPI_COMM_NULL, а значит, они не будут принимать участия в создаваемой топологии. Если NNODES больше числа процессов коммуникатора сомм, то вызов процедуры является ошибочным.
В следующей табличке приведен пример описания графа через задание всех соседей каждой вершины.
Для описания такого графа нужно заполнить следующие структуры данных:
INDEX=2, 3, 4, 6 EDGES=1, 3, 0, 3, 0, 2
После этого можно создать топологию графа, например, с помощью следующего вызова (вызов будет корректным при выполнении на не менее чем на 4 процессах):
call MPI_GRAPH_CREATE(MPI_COMM_WORLD, 4, INDEX, EDGES, & .TRUE., comm_graph, ierr) MPI_GRAPH_NEIGHBORS_COUNT(COMM, RANK, NNEIGHBORS, IERR) INTEGER COMM, RANK, NNEIGHBORS, IERR
Определение количества NNEIGHBORS непосредственных соседей процесса с рангом RANK в графовой топологии, связанной с коммуникатором сомм.
MPI_GRAPH_NEIGHBORS(COMM, RANK, MAX, NEIGHBORS, IERR) INTEGER COMM, RANK, MAX, NEIGHBORS(*), IERR
Определение рангов непосредственных соседей процесса с рангом RANK В графовой топологии, связанной с коммуникатором сомм. Ранги соседей возвращаются в массиве NEIGHBORS, MAX задает ограничение на количество соседей (может быть получено, например, вызовом процедуры MPI_GRAPH_NEIGHBORS_COUNT ).
MPI_GRAPHDIMS_GET(COMM, NNODES, NEDGES, IERR) INTEGER COMM, NNODES, NEDGES, IERR
Определение числа вершин NNODES И числа ребер NEDGES графовой топологии, связанной с коммуникатором сомм.
MPI_GRAPH_GET(COMM, MAXINDEX, MAXEDGES, INDEX, EDGES, IERR) INTEGER COMM, MAXINDEX, MAXEDGES, INDEX(*), EDGES(*), IERR
Определение информации о топологии графа, связанной с коммуникатором сомм. В массивах INDEX и EDGES возвращается описание графовой топологии в том виде, как она задается при создании топологии с помощью процедуры MPI_GRAPH_CREATE. Параметры MAXINDEX и MAXEDGES задают ограничения на размеры соответствующих массивов (могут быть получены, например, вызовом процедуры MPI_GRAPHDIMS_GET ).
В следующем примере создается графовая топология comm_graph для общения процессов по коммуникационной схеме master-slave. Все процессы в рамках данной топологии могут общаться только с нулевым процессом. После создания топологии с помощью вызова процедуры MPI_GRAPH_CREATE каждый процесс определяет количество своих непосредственных соседей в рамках данной топологии (с помощью вызова процедуры MPI_GRAPH_NEIGHBORS_COUNT ) и ранги процессов-соседей (с помощью вызова процедуры MPI_GRAPH_NEIGHBORS ). После этого каждый процесс может в рамках данной топологии обмениваться данными со своими непосредственными соседями, например, при помощи вызова процедуры MPI_SENDRECV.
program example18 include 'mpif.h' integer ierr, rank, rank1, i, size, MAXPROC, MAXEDGES parameter (MAXPROC = 12 8, MAXEDGES = 512) integer a, b integer status(MPI_STATUS_SIZE) integer comm_graph, index(MAXPROC), edges(MAXEDGES) integer num, neighbors(MAXPROC) call MPI_INIT(ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) do i = 1, size index(i) = size+i-2 end do do i = 1, size-1 edges(i) = i edges(size+i-1) = 0 end do call MPI_GRAPH_CREATE(MPI_COMM_WORLD, size, index, edges, & .TRUE., comm_graph, ierr) call MPI_GRAPH_NEIGHBORS_COUNT(comm_graph, rank, num, & ierr) call MPI_GRAPH_NEIGHBORS(comm_graph, rank, num, neighbors, & ierr) do i = 1, num call MPI_SENDRECV(rank, 1, MPI_INTEGER, neighbors(i), & 1, rank1, 1, MPI_INTEGER, & neighbors(i), 1, comm_graph, & status, ierr) print *, 'procecc ', rank, ' communicate with process', & rankl end do call MPI_FINALIZE(ierr) end
Задания
- Обязана ли виртуальная топология повторять физическую топологию целевого компьютера?
- Любой ли коммуникатор может обладать виртуальной топологией?
- Может ли процесс входить одновременно в декартову топологию и в топологию графа?
- Можно ли вызвать процедуру MPI_CART_CREATE только на половине процессов коммуникатора?
- Необходимо ли использовать процедуру MPI_DIMS_CREATE перед вызовом Процедуры MPI_CART_CREATE?
- Можно ли использовать координаты процесса в декартовой топологии в процедурах обмена данными?
- Какие пересылки данных осуществляются процедурой MPI_CART_SHIFT?
- Как определить, с какими процессами в топологии графа связан данный процесс?
- Как создать топологию графа, в которой каждый процесс связан с каждым?
- Реализовать разбиение процессов на две группы, в одной из которых осуществляется обмен по кольцу при помощи сдвига в одномерной декартовой топологии, а в другой - коммуникации по схеме master-slave, реализованной при помощи топологии графа.
- Использовать двумерную декартову топологию процессов при реализации параллельной программы перемножения матриц.