Библиотека MPI: Виртуальные топологии процессов. Лекция 6

Содержание

Слайд 2

Основные понятия Топология – механизм сопоставления процессам коммуникатора альтернативной схемы адресации

Основные понятия

Топология – механизм сопоставления процессам коммуникатора альтернативной схемы адресации
В

MPI топологии – виртуальные
В MPI два типа топологий:
Декартова топология
Топология графа
Слайд 3

Определение типа топологии MPI_Topo_test(MPI_Comm comm, int *status) Возможные значения status: MPI_GRAPH MPI_CART MPI_UNDEFINED

Определение типа топологии

MPI_Topo_test(MPI_Comm comm, int *status)
Возможные значения status:
MPI_GRAPH
MPI_CART
MPI_UNDEFINED

Слайд 4

Создание коммуникатора с декартовой топологией MPI_Cart_create(MPI_Comm comm_old, int ndims, int *dims,

Создание коммуникатора с декартовой топологией
MPI_Cart_create(MPI_Comm comm_old, int ndims, int *dims, int

*periods, int reorder, MPI_Comm *comm_cart)
Если размеры заказываемой сетки больше имеющегося в группе числа процессов, то функция завершается аварийно
Слайд 5

Коммуникатора с декартовой топологией Табл. 1. Преобразование индексов

Коммуникатора с декартовой топологией

Табл. 1. Преобразование индексов

Слайд 6

Определение оптимальной конфигурации сетки MPI_Dims_create(int nnodes, int ndims, int *dims) Вычисляются

Определение оптимальной конфигурации сетки

MPI_Dims_create(int nnodes, int ndims, int *dims)
Вычисляются только те

компоненты для которых dims[i]=0
Создается максимально равномерное распределение процессов вдоль направлений, выстраивая их по убыванию: для 12 –> 4х3х1
Слайд 7

Определение оптимальной конфигурации сетки: пример Табл. 2. Примеры работы функции

Определение оптимальной конфигурации сетки: пример

Табл. 2. Примеры работы функции

Слайд 8

Получение числа измерений и другой информации MPI_Cartdim_get(MPI_Comm comm, int *ndims) MPI_Cart_get(MPI_Comm

Получение числа измерений и другой информации
MPI_Cartdim_get(MPI_Comm comm, int *ndims)
MPI_Cart_get(MPI_Comm comm,

int ndims, int *dims, int *periods, int *coords)
Слайд 9

Получение идентификатора процесса по его координатам MPI_Cart_rank(MPI_Comm comm, int *coords, int

Получение идентификатора процесса по его координатам
MPI_Cart_rank(MPI_Comm comm, int *coords, int *rank)
Для

измерений с периодическими граничными условиями будет выполняться приведение к основной области определения 0 <= coords(i) < dims(i)
Слайд 10

Определение координат процесса по его идентификатору MPI_Cart_coords(MPI_Comm comm, int rank, int ndims, int *coords)

Определение координат процесса по его идентификатору
MPI_Cart_coords(MPI_Comm comm, int rank, int ndims,

int *coords)
Слайд 11

Определение параметров сдвига данных MPI_Cart_shift(MPI_Comm comm, int direction, int disp, int *rank_source, int *rank_dest) MPI_PROC_NULL

Определение параметров сдвига данных

MPI_Cart_shift(MPI_Comm comm, int direction, int disp, int *rank_source,

int *rank_dest)
MPI_PROC_NULL
Слайд 12

Пример: Allreduce (1) Рис. 1. Схемы взаимодействий

Пример: Allreduce

(1)

Рис. 1. Схемы взаимодействий

Слайд 13

int dest[][]={{1,0,3,2,5,4,7,6}, {2,3,0,1,6,7,4,5}, {4,5,6,7,0,1,2,3}}; sum = data; for(int i=0; i MPI_Send(sum,…dest[i][rank],…);

int dest[][]={{1,0,3,2,5,4,7,6},
{2,3,0,1,6,7,4,5},
{4,5,6,7,0,1,2,3}};
sum = data;
for(int i=0; i < 3; i++)

{
MPI_Send(sum,…dest[i][rank],…);
MPI_Recv(r_data,…dest[i][rank],…);
sum += r_data;
}

Пример: Allreduce

Слайд 14

MPI_Comm d_topo; int dims[3] = {2,2,2}; int periods[3] = {1,1,1}; int

MPI_Comm d_topo;
int dims[3] = {2,2,2};
int periods[3] = {1,1,1};
int reorder = 0,

src, dest;
MPI_Cart_create(MPI_COMM_WORLD, 3, dims, periods, reorder, &d_topo);
sum = data;
for(int i=0; i < 3; i++) {
MPI_Cart_shift(d_topo, i, 1, &src, &dest);
MPI_Send(sum,…dest,…);
MPI_Recv(r_data,…src,…);
sum += r_data;
}

Пример: Allreduce

Слайд 15

Выделение подпространства в декартовой топологии MPI_Cart_sub(MPI_Comm comm, int *remain_dims, MPI_Comm *newcomm)

Выделение подпространства в декартовой топологии

MPI_Cart_sub(MPI_Comm comm, int *remain_dims, MPI_Comm *newcomm)
remain_dims[i] =

true
remain_dims[i] = false
Из 2х3х4 remain_dims={true, false, true}
получаем 3 коммуникатора с топологией 2х4
Слайд 16

Создание коммуникатора с топологией графа int MPI_Graph_create( MPI_Comm comm, int nnodes,

Создание коммуникатора с топологией графа

int MPI_Graph_create( MPI_Comm comm, int nnodes, int

*index, int *edges, int reorder, MPI_Comm *comm_graph)
index[nnodes]- суммарное количество соседей для первых i вершин
edges[index[nnodes-1]]- упорядоченный список номеров процессов-соседей всех вершин
Слайд 17

Создание коммуникатора с топологией графа (пример) int index[4] = { 2,

Создание коммуникатора с топологией графа (пример)

int index[4] = { 2, 3,

4, 6 };
int edges[6] = { 1, 3, 0, 3, 0, 2 };
MPI_Graph_create(MPI_COMM_WORLD, 4, index, edges, 1, &comm_graph);

Рис. 2. Граф топологии

Слайд 18

Непосредственные соседи процесса MPI_Graph_neighbors_count( MPI_Comm comm, int rank, int *neighbors_count) MPI_Graph_neighbors(

Непосредственные соседи процесса
MPI_Graph_neighbors_count( MPI_Comm comm, int rank, int *neighbors_count)
MPI_Graph_neighbors( MPI_Comm comm,

int rank, int max, int *neighbors)
Слайд 19

Параметры графа MPI_Graphdims_get(MPI_Comm comm, int *nnodes, int *nedges) MPI_Graph_get(MPI_Comm comm, int

Параметры графа
MPI_Graphdims_get(MPI_Comm comm, int *nnodes, int *nedges)
MPI_Graph_get(MPI_Comm comm, int nnodes, int

nedges, int *index, int * edges)
Слайд 20

Пример создания и использования топологии типа «граф» Рис. 3. Общение процессов по коммуникационной схеме «master-slave»

Пример создания и использования топологии типа «граф»

Рис. 3. Общение процессов по

коммуникационной схеме «master-slave»
Слайд 21

Пример создания и использования топологии типа «граф» program example_graph include 'mpif.h'

Пример создания и использования топологии типа «граф»

program example_graph
include 'mpif.h'
integer ierr, rank,

rank1, i, size, MAXPROC, MAXEDGES
parameter (MAXPROC = 128, 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
Слайд 22

Пример создания и использования топологии типа «граф» size = 5 do

Пример создания и использования топологии типа «граф»

size = 5

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

Рис. 4. Граф топологии

Слайд 23

Пример создания и использования топологии типа «граф» call MPI_GRAPH_CREATE(MPI_COMM_WORLD, size, index,

Пример создания и использования топологии типа «граф»

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', rank1
end do
call MPI_FINALIZE(ierr)
end
Слайд 24

Пример создания и использования топологии типа «граф» call MPI_GRAPH_NEIGHBORS_COUNT(comm_graph, rank, &

Пример создания и использования топологии типа «граф»

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)
end do

Рис. 5. Граф топологии

Слайд 25

Пример создания и использования топологии типа «граф» rank = 0 call

Пример создания и использования топологии типа «граф»

rank = 0

call MPI_SENDRECV(rank, 1,

MPI_INTEGER, 1, 1,
& rank1, 1, MPI_INTEGER, 1, 1, comm_graph, status, ierr)

call MPI_SENDRECV(rank, 1, MPI_INTEGER, 2, 1,
& rank1, 1, MPI_INTEGER, 2, 1, comm_graph, status, ierr)

call MPI_SENDRECV(rank, 1, MPI_INTEGER, 3, 1,
& rank1, 1, MPI_INTEGER, 3, 1, comm_graph, status, ierr)

call MPI_SENDRECV(rank, 1, MPI_INTEGER, 4, 1,
& rank1, 1, MPI_INTEGER, 4, 1, comm_graph, status, ierr)

Слайд 26

Пример создания и использования топологии типа «граф» rank = 1 call

Пример создания и использования топологии типа «граф»

rank = 1

call MPI_SENDRECV(rank, 1,

MPI_INTEGER, 0, 1,
& rank1, 1, MPI_INTEGER, 0, 1, comm_graph, status, ierr)

call MPI_SENDRECV(rank, 1, MPI_INTEGER, 0, 1,
& rank1, 1, MPI_INTEGER, 0, 1, comm_graph, status, ierr)

call MPI_SENDRECV(rank, 1, MPI_INTEGER, 0, 1,
& rank1, 1, MPI_INTEGER, 0, 1, comm_graph, status, ierr)

call MPI_SENDRECV(rank, 1, MPI_INTEGER, 0, 1,
& rank1, 1, MPI_INTEGER, 0, 1, comm_graph, status, ierr)

rank = 2

rank = 3

rank = 4