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

Содержание

Слайд 2

Основные свойства MPI - Message Passing Interface, интерфейс передачи сообщений Стандарт

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

MPI - Message Passing Interface, интерфейс передачи сообщений
Стандарт MPI 4.0
Языки

программирования:
FORTRAN/Matlab
C/C++
Более 120 функций
SPMD-модель параллельного программирования
Слайд 3

Основные свойства Наличие групп процессов (безопасность сообщений), топологий процессов Структурирование передаваемого

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

Наличие групп процессов (безопасность сообщений), топологий процессов
Структурирование передаваемого сообщения, типизация,

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

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

Чего нет в MPI

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

Слайд 5

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

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

MPI-программа – программа запускаемая одновременно на нескольких процессорах
Каждая копия

программы выполняется как отдельный процесс

Рис. 1. Модель архитектуры

Слайд 6

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

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

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

процесс может получить информацию о количестве одновременно запущенных процессов и свой номер.

Рис. 2. Пример области связности

Слайд 7

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

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

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

Слайд 8

Основные понятия Коммуникационные функции MPI предоставляют процессам MPI-программы различные способы взаимодействия:

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

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

групповые.

Рис. 4. Схема коммуникаций в MPI

Слайд 9

Коммуникации точка-точка Блокируемые / неблокируемые Синхронные / асинхронные Буферизованные Пересылка по

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

Блокируемые / неблокируемые
Синхронные / асинхронные
Буферизованные
Пересылка по готовности

Рис. 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-типами и типами языка Cи

Слайд 12

Первая программа #include #include "mpi.h" int main( argc, argv ) int

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

#include
#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

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

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

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

% mpicc -o helloworld helloworld.c
% mpirun -np 4 helloworld
Hello

world from process 0 of 4
Hello world from process 3 of 4
Hello world from process 1 of 4
Hello world from process 2 of 4
Слайд 15

int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int tag,

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)

Функция 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)

Функция 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

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

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

Слайд 19

Последовательный вариант редукции Рис. 6. Схема редукции

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

Рис. 6. Схема редукции

Слайд 20

Вариант редукции: пирамида Рис. 7. Схема редукции

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

Рис. 7. Схема редукции

Слайд 21

Вариант редукции: бабочка Рис. 8. Схема редукции

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

Рис. 8. Схема редукции

Слайд 22

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

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

Слайд 23

Функция MPI_Ssend MPI_Ssend(*buf, count,datatype, dest,tag,comm) MPI_SSEND(buf, count,datatype, dest,tag,comm, ierr) Рис. 9.

Функция MPI_Ssend

MPI_Ssend(*buf,
count,datatype,
dest,tag,comm)
MPI_SSEND(buf,
count,datatype,
dest,tag,comm,
ierr)

Рис. 9. Схема передачи сообщений
“точка-точка” в MPI

Слайд 24

Функция MPI_Bsend MPI_Bsend(*buf, count,datatype, dest,tag,comm) MPI_Buffer_attach (*buffer,size) MPI_Buffer_detach (*buffer,size) Рис. 11.

Функция MPI_Bsend

MPI_Bsend(*buf,
count,datatype, dest,tag,comm)
MPI_Buffer_attach (*buffer,size)
MPI_Buffer_detach (*buffer,size)

Рис. 11. Схема передачи сообщений
“точка-точка” в MPI

Слайд 25

Функция MPI_Rsend MPI_Rsend(*buf,count,datatype, dest,tag,comm) MPI_Probe (source,tag, comm,*status) Рис. 12. Схема передачи

Функция MPI_Rsend

MPI_Rsend(*buf,count,datatype, dest,tag,comm)
MPI_Probe (source,tag,
comm,*status)

Рис. 12. Схема передачи сообщений
“точка-точка” в MPI

Процесс А

Приложение

Data

Системный

буфер

Процессор 1

Data

Процесс Б

Приложение

Data

Системный буфер

Процессор 2

Data

Слайд 26

Функция MPI_Sendrecv MPI_Sendrecv(*sendbuf,sendcount,sendtype, dest,sendtag, *recvbuf,recvcount,recvtype, source,recvtag,comm,*status)

Функция MPI_Sendrecv

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

Слайд 27

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

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

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

comm)
Слайд 28

Широковещательная рассылка данных int MPI_Bcast(void* buffer, int count, MPI_Datatype datatype, int

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

int MPI_Bcast(void* buffer, int count, MPI_Datatype datatype, int

root, MPI_Comm comm)

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

Слайд 29

int MPI_Gather(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount,

int MPI_Gather(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount,

MPI_Datatype recvtype, int root, MPI_Comm comm)

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

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

Слайд 30

int MPI_Allgather(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount,

int MPI_Allgather(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount,

MPI_Datatype recvtype, MPI_Comm comm)

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



Процесс n-1

Процесс 1

Процесс 0



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

Слайд 31

int MPI_Gatherv(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* rbuf, int *recvcounts,

int MPI_Gatherv(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* rbuf, int *recvcounts,

int *displs,
MPI_Datatype recvtype, int root, MPI_Comm comm)

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

Все процессы



Процесс root

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

a0

recvcounts[0]

recvbuffer



displs[p]

Слайд 32

int MPI_Scatter(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount,

int MPI_Scatter(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount,

MPI_Datatype recvtype, int root, MPI_Comm comm)

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

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

Все процессы



Процесс root

Слайд 33

int MPI_Scatterv(void* sendbuf, int *sendcounts, int *displs, MPI_Datatype sendtype, void* recvbuf,

int MPI_Scatterv(void* sendbuf, int *sendcounts, int *displs, MPI_Datatype sendtype, void* recvbuf,

int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)

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

Все процессы



Процесс root

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



displs[p]

Слайд 34

int MPI_Alltoall(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount,

int MPI_Alltoall(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount,

MPI_Datatype recvtype, MPI_Comm comm)

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

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

Слайд 35

int MPI_Reduce(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op,

int MPI_Reduce(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op,

int root, MPI_Comm comm)

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

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

Слайд 36

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

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

Слайд 37

int MPI_Allreduce(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op,

int MPI_Allreduce(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op,

MPI_Comm comm)

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

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


Слайд 38

int MPI_Reduce_scatter(void* sendbuf, void* recvbuf, int *recvcounts, MPI_Datatype datatype, MPI_Op op,

int MPI_Reduce_scatter(void* sendbuf, void* recvbuf, int *recvcounts, MPI_Datatype datatype, MPI_Op op,

MPI_Comm comm)

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

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