Лаборатория Параллельных информационных технологий НИВЦ МГУ
Опубликован: 22.04.2008 | Доступ: свободный | Студентов: 1176 / 413 | Оценка: 4.30 / 4.19 | Длительность: 08:05:00
Специальности: Программист
Лекция 6:

Виртуальные топологии

< Лекция 5 || Лекция 6: 12 || Лекция 7 >

Топология графа

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 больше числа процессов коммуникатора сомм, то вызов процедуры является ошибочным.

В следующей табличке приведен пример описания графа через задание всех соседей каждой вершины.

Процесс Соседи
0 1
1 3, 0
2 3
3 0, 2

Для описания такого графа нужно заполнить следующие структуры данных:

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, реализованной при помощи топологии графа.
  • Использовать двумерную декартову топологию процессов при реализации параллельной программы перемножения матриц.
< Лекция 5 || Лекция 6: 12 || Лекция 7 >