Основные свойства
Основные свойства
Чего нет в MPI
Основные понятия
Основные понятия
Основные понятия
Основные понятия
Коммуникации точка-точка
Основные соглашения
Соответствие между MPI-типами и типами языка Cи
Первая программа
Основные функции
Компиляция и запуск
Передача «точка-точка»
Функция MPI_Test
Функция MPI_Wait
Редукция с последующей общей рассылкой
Последовательный вариант редукции
Вариант редукции: пирамида
Вариант редукции: бабочка
Виды операций пересылки сообщений «точка-точка»
Функция MPI_Ssend
Функция MPI_Bsend
Функция MPI_Rsend
Функция MPI_Sendrecv
Коллективные операции
Широковещательная рассылка данных
Функции сбора блоков данных от всех процессов группы
Функции сбора блоков данных от всех процессов группы
Функции сбора блоков данных от всех процессов группы
Функции распределения блоков данных по всем процессам группы
Функции распределения блоков данных по всем процессам группы
Совмещенные коллективные операции
Глобальные вычислительные операции над распределенными данными
Глобальные вычислительные операции над распределенными данными
Глобальные вычислительные операции над распределенными данными
Глобальные вычислительные операции над распределенными данными
Глобальные вычислительные операции над распределенными данными
2.78M
Категория: ПрограммированиеПрограммирование

Основные свойства MPI - Message Passing Interface, интерфейс передачи сообщений Стандарт MPI 4.0. Лекция 4

1.

2. Основные свойства

MPI - Message Passing Interface, интерфейс
передачи сообщений
Стандарт MPI 4.0
Языки программирования:
FORTRAN/Matlab
C/C++
Более 120 функций
SPMD-модель параллельного
программирования

3. Основные свойства

Наличие групп процессов (безопасность
сообщений), топологий процессов
Структурирование передаваемого
сообщения, типизация, гетерогенность
Режимы: normal (blocking and nonblocking), synchronous, buffered
Большое разнообразие коллективных
операций

4. Чего нет в MPI

Функции управления процессами
Работа с удаленной памятью
Разделяемая общая память
Потоки

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

MPI-программа – программа запускаемая одновременно
на нескольких процессорах
Каждая копия программы выполняется как отдельный
процесс
Рис. 1. Модель архитектуры

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

Код программы параметризуется номером процесса.
С помощью служебных функций MPI процесс может
получить информацию о количестве одновременно
запущенных процессов и свой номер.
Рис. 2. Пример области связности

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

Рис. 3. Коммуникаторы и группы в MPI

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

Коммуникационные функции MPI предоставляют
процессам MPI-программы различные способы
взаимодействия: индивидуальные, групповые.
Рис. 4. Схема коммуникаций в MPI

9. Коммуникации точка-точка

Блокируемые /
неблокируемые
Синхронные /
асинхронные
Буферизованные
Пересылка по
готовности
Процессор 1
Процессор 2
Процесс А
Процесс Б
Приложение
Приложение
Data
Data
Системный
буфер
Системный
буфер
Data
Data
Рис. 5. Схема передачи сообщений
“точка-точка” в MPI

10. Основные соглашения

Регистр символов существенен в С, и не играет роли в
Фортране.
Все идентификаторы начинаются с префикса MPI_.
Префиксы MPID_, MPIR_ и PMPI_ применяются в
служебных целях.
Имена констант записываются заглавными буквами:
MPI_COMM_WORLD, MPI_FLOAT.
В именах функций только первая за префиксом буква –
заглавная: MPI_Send, MPI_Comm_size.
Определение всех именованных констант, прототипов
функций и определение типов выполняется в языке С
подключением файла mpi.h, а в Фортране – mpif.h.

11. Соответствие между MPI-типами и типами языка Cи

тип MPI
MPI_CHAR
тип языка Си
signed char
MPI_SHORT
signed short int
MPI_INT
signed int
MPI_LONG
signed long int
MPI_UNSIGNED_CHAR
unsigned char
MPI_UNSIGNED_SHORT
unsigned short int
MPI_UNSIGNED
unsigned int
MPI_UNSIGNED_LONG
unsigned long int
MPI_FLOAT
float
MPI_DOUBLE
double
MPI_LONG_DOUBLE
long double
MPI_BYTE, MPI_PACKED

12. Первая программа

#include <stdio.h>
#include "mpi.h"
int main( argc, argv )
int argc; char **argv;
{
int rank, size;
MPI_Init( &argc, &argv );
MPI_Comm_size( MPI_COMM_WORLD, &size );
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
printf( "Hello from process %d of %d\n",
rank, size );
MPI_Finalize();
return 0;
}

13. Основные функции

int MPI_Init(int *argc, char ***argv)
int MPI_Finalize(void)
int MPI_Comm_size(MPI_Comm comm, int *size)
int MPI_Comm_rank(MPI_Comm comm, int *rank)
MPI_Get_processor_name (*name,*resultlength)

14. Компиляция и запуск

% mpicc -o helloworld helloworld.c
% mpirun -np 4 helloworld
Hello
Hello
Hello
Hello
world
world
world
world
from
from
from
from
process
process
process
process
0
3
1
2
of
of
of
of
4
4
4
4

15. Передача «точка-точка»

int MPI_Send(void* buf, int count,
MPI_Datatype datatype,
int dest, int tag,
MPI_Comm comm)
int MPI_Recv(void* buf, int count,
MPI_Datatype datatype,
int source, int tag,
MPI_Comm comm,
MPI_Status *status)
MPI_ANY_SOURCE
MPI_ANY_TAG

16. Функция MPI_Test

MPI_Test(*request,*flag,*status)
MPI_Testany (count,*array_of_requests,
*index,*flag,*status)
MPI_Testall (count,*array_of_requests,
*flag,*array_of_statuses)
MPI_Testsome (incount,*array_of_requests,
*outcount,*array_of_offsets,
*array_of_statuses)

17. Функция MPI_Wait

MPI_Wait (*request,*status)
MPI_Waitany (count,*array_of_requests,*index,
*status)
MPI_Waitall (count,*array_of_requests,
*array_of_statuses)
MPI_Waitsome (incount,*array_of_requests,
*outcount,
*array_of_offsets,
*array_of_statuses)

18. Редукция с последующей общей рассылкой

Варианты:
1
2
3
Количество
процессов = 8

19. Последовательный вариант редукции

0
1
2
3
4
5
Рис. 6. Схема редукции
6
7

20. Вариант редукции: пирамида

0
1
2
3
4
5
Рис. 7. Схема редукции
6
7

21. Вариант редукции: бабочка

0
1
2
3
4
5
Рис. 8. Схема редукции
6
7

22. Виды операций пересылки сообщений «точка-точка»

Blocking
sends
MPI_Send(buffer,count,type,dest,
tag, comm)
Nonblocking
sends
MPI_Isend(buffer,count,type,dest,
Tag,comm,request)
Blocking
receive
MPI_Recv(buffer,count,type,source,
tag,comm,status)
Nonblocking
receive
MPI_Irecv(buffer,count,type,source,
tag,comm,request)

23. Функция MPI_Ssend

MPI_Ssend(*buf,
count,datatype,
dest,tag,comm)
MPI_SSEND(buf,
count,datatype,
dest,tag,comm,
ierr)
Процессор 1
Процессор 2
Процесс А
Процесс Б
Приложение
Приложение
Data
Data
Системный
буфер
Системный
буфер
Data
Data
Рис. 9. Схема передачи сообщений
“точка-точка” в MPI

24. Функция MPI_Bsend

MPI_Bsend(*buf,
count,datatype,
dest,tag,comm)
MPI_Buffer_attach
(*buffer,size)
MPI_Buffer_detach
(*buffer,size)
Процессор 1
Процессор 2
Процесс А
Процесс Б
Приложение
Приложение
Data
Data
Системный
буфер
Системный
буфер
Data
Data
Рис. 11. Схема передачи сообщений
“точка-точка” в MPI

25. Функция MPI_Rsend

MPI_Rsend(*buf,
count,datatype,
dest,tag,comm)
MPI_Probe
(source,tag,
comm,*status)
Процессор 1
Процессор 2
Процесс А
Процесс Б
Приложение
Приложение
Data
Data
Системный
буфер
Системный
буфер
Data
Data
Рис. 12. Схема передачи сообщений
“точка-точка” в MPI

26. Функция MPI_Sendrecv

MPI_Sendrecv(*sendbuf,sendcount,sendtype,
dest,sendtag,
*recvbuf,recvcount,recvtype,
source,recvtag,comm,*status)

27. Коллективные операции

Необходимы для общего взаимодействия
и синхронизации процессов.
Функция общей синхронизации:
int MPI_Barrier(MPI_Comm comm)

28. Широковещательная рассылка данных

int MPI_Bcast(void* buffer, int count, MPI_Datatype
datatype, int root, MPI_Comm comm)
buffer
count
buffer
Все процессы
count
Процесс 0
buffer

count
buffer

Процесс root
Рис. 1. Схема взаимодействия
count
Процесс n-1

29. Функции сбора блоков данных от всех процессов группы

int MPI_Gather(void* sendbuf, int sendcount, MPI_Datatype
sendtype, void* recvbuf, int recvcount, MPI_Datatype
recvtype, int root, MPI_Comm comm)
sendbuffer
Все процессы
sendbuffer
a1
sendcount

recvbuffer
Процесс root
a2
sendcount
recvbuffer
sendbuffer

a3
sendcount
recvbuffer
a1
a2
a3
recvcount
recvcount
recvcount
Рис. 2. Схема взаимодействия

30. Функции сбора блоков данных от всех процессов группы

int MPI_Allgather(void* sendbuf, int sendcount, MPI_Datatype
sendtype, void* recvbuf, int recvcount, MPI_Datatype
recvtype, MPI_Comm comm)
sendbuffer
Процесс 0
a0
sendcount
sendbuffer
Процесс 1

recvbuffer
a0
a1
recvcount
recvcount
recvbuffer
a0
a1
sendcount
recvcount
recvcount
recvbuffer
recvbuffer

recvbuffer
a1
sendbuffer
Процесс n-1
recvbuffer
a0
a1
sendcount
recvcount
recvcount
Рис. 3. Схема взаимодействия
recvcount
recvbuffer

recvbuffer
an-1
an-1
an-1
recvcount
recvbuffer

an-1
recvcount

31. Функции сбора блоков данных от всех процессов группы

int MPI_Gatherv(void* sendbuf, int sendcount, MPI_Datatype
sendtype, void* rbuf, int *recvcounts, int *displs,
MPI_Datatype recvtype, int root, MPI_Comm comm)
sendbuffer
Все процессы
a0
sendcount[0]
sendbuffer

recvbuffer
Процесс root
a0
recvcounts[0]
ap
sendcount[p]
sendbuffer

recvbuffer

ap
an-1
sendcount[n-1]
recvbuffer

recvcounts[p]
displs[p]
Рис. 4. Схема взаимодействия
an-1
recvcounts[n-1]

32. Функции распределения блоков данных по всем процессам группы

int MPI_Scatter(void* sendbuf, int sendcount, MPI_Datatype
sendtype, void* recvbuf, int recvcount, MPI_Datatype
recvtype, int root, MPI_Comm comm)
sendbuffer
Процесс root
sendbuffer
a1
a2
a3
sendcount
sendcount
sendcount
recvbuffer
Все процессы
sendbuffer
a1
recvcount
recvbuffer

a2
recvcount
recvbuffer

a3
recvcount
Рис. 5. Схема взаимодействия

33. Функции распределения блоков данных по всем процессам группы

int MPI_Scatterv(void* sendbuf, int *sendcounts, int *displs,
MPI_Datatype sendtype, void* recvbuf, int recvcount,
MPI_Datatype recvtype, int root, MPI_Comm comm)
sendbuffer
Процесс root
a0
sendbuffer

sendcounts[0]
ap
sendbuffer

an-1
sendcounts[n-1]
sendcounts[p]
displs[p]
recvbuffer
Все процессы
a0
recvcount[0]
recvbuffer

ap
recvcount[p]
recvbuffer

Рис. 6. Схема взаимодействия
an-1
recvcount[n-1]

34. Совмещенные коллективные операции

int MPI_Alltoall(void* sendbuf, int sendcount, MPI_Datatype
sendtype, void* recvbuf, int recvcount, MPI_Datatype
recvtype, MPI_Comm comm)
sendbuffer
Процесс 0
a0
b0
recvbuffer

c0
sendbuffer
Процесс 1
a1
b1
a0

an-1

bn-1

cn-1
recvbuffer

c1
b0

b1

sendbuffer
Процесс n-1
a1
an-1
bn-1
recvbuffer

cn-1
c0
Рис. 7. Схема взаимодействия
c1

35. Глобальные вычислительные операции над распределенными данными

int MPI_Reduce(void* sendbuf, void* recvbuf, int count,
MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm
comm)
sendbuffer
Процесс 0
a0
b0

c0

c1

cn-1
sendbuffer
Процесс 1
a1
b1
recvbuffer
a0+a1+… b0+b1+…

sendbuffer
Процесс n-1
an-1
bn-1
Рис. 8. Схема взаимодействия

c0+c1+…

36. Глобальные вычислительные операции над распределенными данными

Название
Операция
MPI_MAX
Максимум
MPI_MIN
Минимум
MPI_SUM
Сумма
MPI_PROD
Произведение
MPI_LAND
Логическое И
MPI_LOR
Логическое ИЛИ
MPI_LXOR
Логическое исключающее ИЛИ
MPI_BAND
Поразрядное И
MPI_BOR
Поразрядное ИЛИ
MPI_BXOR
Поразрядное исключающее ИЛИ
MPI_MAXLOC
Максимальное значение и его индекс
MPI_MINLOC
Максимальное значение и его индекс

37. Глобальные вычислительные операции над распределенными данными

int MPI_Allreduce(void* sendbuf, void* recvbuf, int count,
MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
recvbuffer
sendbuffer
Процесс 0
a0
b0

c0
sendbuffer
Процесс 1
a1
b1

c0+c1+…

c0+c1+…

c0+c1+…
recvbuffer

c1

a0+a1+… b0+b1+…

sendbuffer
Процесс n-1
a0+a1+… b0+b1+…
an-1
bn-1
recvbuffer

cn-1
a0+a1+… b0+b1+…
Рис. 9. Схема взаимодействия

38. Глобальные вычислительные операции над распределенными данными

int MPI_Reduce_scatter(void* sendbuf, void* recvbuf, int
*recvcounts, MPI_Datatype datatype, MPI_Op op,
MPI_Comm comm)
recvbuffer
sendbuffer
a0
Процесс 0
b0

c0
sendbuffer
a1
Процесс 1
b1
a0+a1+…an-1
recvbuffer

c1

b0+b1+… bn-1

sendbuffer
Процесс n-1
an-1
bn-1
recvbuffer

cn-1
c0+c1+… an-1
Рис. 10. Схема взаимодействия

39. Глобальные вычислительные операции над распределенными данными

int MPI_Scan(void* sendbuf, void* recvbuf, int count,
MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
recvbuffer
sendbuffer
Процесс 0
a0
b0

c0
sendbuffer
Процесс 1
a1
b1
b0

c0
b0+b1

c0+c1

c0+c1+…
recvbuffer

c1

a0+a1

sendbuffer
Процесс n-1
a0
an-1
bn-1
recvbuffer

cn-1
a0+a1+… b0+b1+…
Рис. 11. Схема взаимодействия
English     Русский Правила