Операции редукции – передача данных от всех процессов одному процессу

Содержание

Слайд 2

Операции редукции – передача данных от всех процессов одному процессу int

Операции редукции – передача данных от всех процессов одному процессу

int MPI_Reduce(void

*sendbuf, void *recvbuf, int count, MPI_Datatype type, MPI_Op op, int root, MPI_Comm comm)
sendbuf – буфер с отправляемым сообщением,
recvbuf – буфер для результирующего сообщения (только для процесса с рангом root),
count – количество элементов в сообщениях,
type – тип элементов сообщений,
op - операция, которая должна быть выполнена над данными,
root – ранг процесса, на котором должен быть получен результат,
comm - коммуникатор, в рамках которого выполняется операция.

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 3

Базовые типы данных MPI для С MPI_Datatype Тип данных MPI Тип

Базовые типы данных MPI для С

MPI_Datatype
Тип данных MPI Тип C
MPI_BYTE 8

битов для нетипиз.данных
MPI_CHAR signed char
MPI_DOUBLE double
MPI_FLOAT float
MPI_INT int
MPI_LONG long
MPI_LONG_DOUBLE long double
MPI_PACKED упакованные данные
MPI_SHORT short
MPI_UNSIGNED_CHAR unsigned char
MPI_UNSIGNED unsigned int
MPI_UNSIGNED_LONG unsigned long
MPI_UNSIGNED_SHORT unsigned short

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 4

Базовые типы операций редукции MPI_Op Операция Описание MPI_MAX максимальное значение MPI_MIN

Базовые типы операций редукции

MPI_Op
Операция Описание
MPI_MAX максимальное значение
MPI_MIN минимальное значение
MPI_SUM сумма значений
MPI_PROD произведение

значений
MPI_LAND операция "И"
(над значениями сообщений)
MPI_BAND битовая операция "И”
MPI_LOR операция "ИЛИ”
MPI_BOR битовая операция "ИЛИ"
MPI_LXOR операция исключающее "ИЛИ"
MPI_BXOR операция исключающее "ИЛИ"
MPI_MAXLOC макс. значение и соотв. индекс*
MPI_MINLOC миним. значение и соотв. индекс
*Как правило, это ранг процесса, предоставившего max (min)
Перечень базовых операций м.б. дополнен пользовательскими.

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 5

Допустимые типы операндов MPI_Op Операция Допустимые типы операндов MPI_MAX целые, вещественные

Допустимые типы операндов

MPI_Op
Операция Допустимые типы операндов
MPI_MAX целые, вещественные
MPI_MIN
MPI_SUM
MPI_PROD
MPI_MAXLOC
MPI_MINLOC
MPI_LAND целые
MPI_LOR
MPI_LXOR
MPI_BAND целые, MPI_BYTE
MPI_BOR
MPI_BXOR

Лекция 11. И.Г.

Захарова, кафедра ПО
Слайд 6

Выполнение операций редукции Суть редукции - коллективная операция пересылки сообщений от

Выполнение операций редукции

Суть редукции - коллективная операция пересылки сообщений от всех

процессов коммуникатора comm процессу root.
Выполнение редукции:
операция op, выполняется над первыми элементами входного буфера sendbuf,
результат посылается в первый элемент буфера приема recvbuf процесса root,
аналогично для вторых элементов буфера и т.д. до count элементов.

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 7

Схема выполнения редукции Лекция 11. И.Г. Захарова, кафедра ПО

Схема выполнения редукции

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 8

Пример выполнения редукции для «+» Лекция 11. И.Г. Захарова, кафедра ПО

Пример выполнения редукции для «+»

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 9

Синхронизация процессов Одновременное достижение всеми процессами коммуникатора определенной «точки» вычислений обеспечивает

Синхронизация процессов

Одновременное достижение всеми процессами коммуникатора определенной «точки» вычислений обеспечивает функция
int

MPI_Barrier(MPI_Comm comm)
Вызывается всеми процессами.
При вызове блокирует выполнение процесса.
Заблокированные процессы продолжат выполнение только после вызова всеми процессами коммуникатора.

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 10

Передача данных от одного процесса всем процессам int MPI_Bcast(void *buf, int

Передача данных от одного процесса всем процессам

int MPI_Bcast(void *buf, int count,

MPI_Datatype type, int root, MPI_Comm comm)
buf – буфер с отправляемым сообщением (для процесса с рангом root) и буфер для приема результирующего сообщения для всех остальных процессов.
count – количество элементов в сообщении,
type – тип элементов сообщения,
root – ранг процесса, выполняющего рассылку,
comm - коммуникатор, в рамках которого выполняется передача данных.

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 11

Улучшенная программа примера http://lusui.ru/64 int main(int argc, char** argv) { int

Улучшенная программа примера http://lusui.ru/64

int main(int argc, char** argv)
{
int rank=-1, total_proc=-1;


int n;
double pi, mypi, h, sum, x, t1, t2;
double PI25 = 3.1415926535897932384626433832795; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&total_proc);
//While - создание повторяющегося диалога
while (1)
{
if (rank == 0)
{
cout<<“Enter number of intervals(0-exit):";
cin >> n;
//Первая засечка времени на головном процессоре
t1 = MPI_Wtime();
    }        

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 12

MPI_Bcast(&n,1, MPI_INT, 0, MPI_COMM_WORLD); if (n == 0) {break;} else {

       
MPI_Bcast(&n,1, MPI_INT, 0, MPI_COMM_WORLD);
if (n == 0) 
{break;}
else


{
h = 1.0/(double) n;
sum = 0.0;
//Каждый процесс вычисляет свою сумму
for ( i=rank+1; i<=n; i+=total_proc)
{
x = h*((double)i-0.5);
sum+=(4.0/(1.0+x*x));
}
mypi = h*sum;
MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0,
MPI_COMM_WORLD);                      

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 13

if (rank == 0) { //Вторая засечка времени на головном процессоре

           
if (rank == 0)
{
//Вторая засечка времени на головном

процессоре      
t2 = MPI_Wtime();  
cout <<“calc pi is "< cout < cout <<"\n";
cout <<"elapsed time: "< cout <<"\n";
}
} //end of else
} //end of while
cout <<"Finalizing MPI on process "<MPI_Finalize();
return 0;
}

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 14

MPI. Операции передачи сообщений Операции, поддерживаемые MPI функциями: Парные (point-to-point) –

MPI. Операции передачи сообщений

Операции, поддерживаемые MPI функциями:
Парные (point-to-point) – для

взаимодействия между двумя процессами.
Коллективные (collective) – для одновременного взаимодействия нескольких процессов.

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 15

Функция передачи сообщения int MPI_Send(void *buf, int count, MPI_Datatype type, int

Функция передачи сообщения

int MPI_Send(void *buf, int count, MPI_Datatype type, int dest,

int tag, MPI_Comm comm)
buf – буфер с отправляемым сообщением,
count – количество элементов в сообщении,
type – тип элементов сообщения,
dest – ранг процесса, которому отправляется сообщение,
tag – значение (тэг), используемое для идентификации сообщения и фильтрации сообщений при приеме,
comm - коммуникатор, в рамках которого выполняется операция

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 16

Режим отправки – стандартный (standard) Вызов функции обеспечивает режим standard: На

Режим отправки – стандартный (standard)

Вызов функции обеспечивает режим standard:
На время выполнения

функции процесс-отправитель сообщения блокируется.
После завершения выполнения функции буфер может использоваться повторно.
Состояние отправленного сообщения может быть различным – сообщение может:
располагаться на процессе-отправителе,
находиться в состоянии передачи,
храниться на процессе-получателе,
быть принято процессом-получателем при помощи функции MPI_Recv.

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 17

Дополнительные режимы передачи сообщений Синхронный режим (Synchronous)–завершение функции отправки сообщения происходит

Дополнительные режимы передачи сообщений

Синхронный режим (Synchronous)–завершение функции отправки сообщения происходит только

при получении от процесса-получателя подтверждения о начале приема отправленного сообщения.
Функция отправки сообщения в синхронном режиме - MPI_Ssend
Режим передачи по готовности (Ready) –может быть использован только, если операция приема сообщения уже инициирована. Буфер сообщения после завершения функции отправки сообщения может быть повторно использован.
Функция отправки сообщения в режиме по готовности - MPI_Rsend

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 18

Дополнительные режимы передачи сообщений Буферизованный режим (Buffered) – для копирования отправляемых

Дополнительные режимы передачи сообщений

Буферизованный режим (Buffered) – для копирования отправляемых сообщений

используются дополнительные системные буферы. Функция отправки сообщения завершается сразу же после копирования сообщения в буфер.
Функция отправки сообщения в буферизованном режиме - MPI_Bsend

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 19

MPI буфер памяти Для использования буферизованного режима должен быть создан и

MPI буфер памяти

Для использования буферизованного режима должен быть создан и передан

MPI буфер памяти:
int MPI_Buffer_attach(void *buf, int size),
где
buf – буфер памяти для буферизации сообщений,
size – размер буфера.
После завершения работы с буфером он должен быть отключен от MPI при помощи функции:
int MPI_Buffer_detach(void *buf, int *size)
size – возвращаемый размер буфера

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 20

Практическое использование режимов передачи Режим передачи по готовности формально – наиболее

Практическое использование режимов передачи

Режим передачи по готовности формально – наиболее быстрый,

но сложно гарантировать готовность операции приема ? используется редко.
Стандартный и буферизованный режимы - быстрые, но могут приводить к большим расходам памяти ? рекомендуются для передачи коротких сообщений,
Синхронный режим – наиболее медленный, т.к. требует подтверждения приема. Но этот режим наиболее надежен ? рекомендуется для передачи длинных сообщений.

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 21

Функция приема сообщения int MPI_Recv(void *buf, int count, MPI_Datatype type, int

Функция приема сообщения

int MPI_Recv(void *buf, int count, MPI_Datatype type, int source,

int tag, MPI_Comm comm, MPI_Status *status)
buf – буфер для приема сообщения,
count – количество элементов в сообщении,
type – тип элементов сообщения,
source– ранг процесса, от которого д.б. выполнен прием сообщения,
tag– тэг сообщения, которое д.б. принято процессом,
comm - коммуникатор, в рамках которого выполняется операция,
status - указатель на переменную с результатами выполнения операции приема.

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 22

Требования к приему сообщения Буфер памяти должен быть достаточным для приема

Требования к приему сообщения

Буфер памяти должен быть достаточным для приема сообщения.
При

нехватке памяти часть сообщения будет потеряна. В коде завершения функции будет зафиксирована ошибка переполнения.
Типы элементов передаваемого и принимаемого сообщения должны совпадать.
Для приема сообщения
от любого процесса-отправителя параметру source устанавливается значение MPI_ANY_SOURCE,
с любым тэгом параметру tag устанавливается значение MPI_ANY_TAG.

Лекция 11. И.Г. Захарова, кафедра ПО

«джокеры»

Слайд 23

Требования к приему сообщения Параметр status позволяет определить для принятого сообщения:

Требования к приему сообщения

Параметр status позволяет определить для принятого сообщения:
status.MPI_SOURCE –

ранг процесса-отправителя принятого сообщения,
status.MPI_TAG –тэг принятого сообщения.
Функция
MPI_Get_count(MPI_Status*status,
MPI_Datatypetype, int *count)
возвращает в переменной count количество элементов типа type в принятом сообщении.

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 24

Требования к приему сообщения Прием сообщения м.б. инициирован до момента, в

Требования к приему сообщения

Прием сообщения м.б. инициирован
до момента,
в момент,
после момента начала

отправки сообщения.
?Вызов MPI_Recv не обязан согласовываться со временем вызова соответствующей функции MPI_Recv
Функция MPI_Recv – блокирующая для процесса-получателя, его выполнение приостанавливается до завершения работы функции ? если ожидаемое для приема сообщение будет отсутствовать, выполнение параллельной программы будет блокировано.
По завершении MPI_Recv в buf будет размещено принятое сообщение.

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 25

Неблокирующее выполнение передачи данных Блокирующие функции - приостанавливают выполнение процессов (например,

Неблокирующее выполнение передачи данных

Блокирующие функции - приостанавливают выполнение процессов (например, вычислений)

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

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 26

Неблокирующее выполнение передачи данных Неблокирующие функции обмена данными выполняются без блокировки

Неблокирующее выполнение передачи данных

Неблокирующие функции обмена данными выполняются без блокировки процессов

для совмещения процессов передачи сообщений и вычислений.
Минус – более сложны для использования.
Плюс – могут уменьшить потери эффективности параллельных вычислений из-за медленных коммуникационных операций.

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 27

Неблокирующие функции int MPI_Isend(void*buf, int count, MPI_Datatypetype, int dest,int tag, MPI_Commcomm,

Неблокирующие функции

int MPI_Isend(void*buf, int count, MPI_Datatypetype, int dest,int tag, MPI_Commcomm, MPI_Request*request);
int

MPI_Issend(void*buf, int count, MPI_Datatypetype, int dest,int tag, MPI_Commcomm, MPI_Request*request);
int MPI_Ibsend(void*buf, int count, MPI_Datatypetype, int dest,int tag, MPI_Commcomm, MPI_Request*request);
int MPI_Irsend(void*buf, int count, MPI_Datatypetype, int dest, int tag, MPI_Commcomm, MPI_Request*request);
int MPI_Irecv(void*buf, int count, MPI_Datatypetype, int source, int tag, MPI_Commcomm, MPI_Request*request);

Лекция 11. И.Г. Захарова, кафедра ПО

Слайд 28

Параметры функций request - определяется функцией перед завершением выполнения и может

Параметры функций

request - определяется функцией перед завершением выполнения и может

использоваться для проверки в неблокирующей функции
int MPI_Test( MPI_Request*request, int *flag, MPI_status*status),
request-дескриптор операции, определенный при вызове неблокирующей функции,
flag-результат проверки(true, если операция завершена),
status-результат выполнения операции (только для завершенной операции)

Лекция 11. И.Г. Захарова, кафедра ПО