Similar presentations:
Основные свойства 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. Коммуникаторы и группы в MPI8. Основные понятия
Коммуникационные функции 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и
тип MPIMPI_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. Последовательный вариант редукции
01
2
3
4
5
Рис. 6. Схема редукции
6
7
20. Вариант редукции: пирамида
01
2
3
4
5
Рис. 7. Схема редукции
6
7
21. Вариант редукции: бабочка
01
2
3
4
5
Рис. 8. Схема редукции
6
7
22. Виды операций пересылки сообщений «точка-точка»
Blockingsends
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_Datatypedatatype, 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_Datatypesendtype, 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_Datatypesendtype, 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_Datatypesendtype, 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_Datatypesendtype, 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_Datatypesendtype, 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. Схема взаимодействия