Разделы презентаций


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

Содержание

Операции редукции – передача данных от всех процессов одному процессуint MPI_Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype type, MPI_Op op, int root, MPI_Comm comm)sendbuf – буфер с отправляемым сообщением,recvbuf – буфер

Слайды и текст этой презентации

Слайд 1Пример
static long num_steps = 100000;    
void main (int argc, char *argv[])   
{   
int i, my_id, numprocs;    
double x, pi, step, sum = 0.0 ;   
step = 1.0/(double) num_steps ;   
MPI_Init(&argc, &argv) ;   
MPI_Comm_Rank(MPI_COMM_WORLD, &my_id) ;   
MPI_Comm_Size(MPI_COMM_WORLD, &numprocs) ;   
   
for (i=my_id+1; i

Примерstatic long num_steps = 100000;    void main (int argc, char *argv[])   {   	int i, my_id, numprocs;    	double x, pi, step, sum = 0.0 ;   	step = 1.0/(double) num_steps ;   	MPI_Init(&argc, &argv) ;   	MPI_Comm_Rank(MPI_COMM_WORLD, &my_id) ;   	MPI_Comm_Size(MPI_COMM_WORLD, &numprocs) ;   	   	for (i=my_id+1; i

Слайд 2Операции редукции – передача данных от всех процессов одному процессу
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. И.Г. Захарова, кафедра ПО

Операции редукции – передача данных от всех процессов одному процессуint MPI_Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype

Слайд 3Базовые типы данных 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. И.Г. Захарова, кафедра ПО

Базовые типы данных MPI для СMPI_DatatypeТип данных MPI			Тип C 	MPI_BYTE 			8 битов для нетипиз.данных MPI_CHAR 				signed char	MPI_DOUBLE

Слайд 4Базовые типы операций редукции
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. И.Г. Захарова, кафедра ПО

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

Слайд 5Допустимые типы операндов
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.

И.Г. Захарова, кафедра ПО

Допустимые типы операндовMPI_OpОперация		Допустимые типы операндов	MPI_MAX		целые, вещественныеMPI_MINMPI_SUMMPI_PROD 			MPI_MAXLOC			MPI_MINLOCMPI_LAND		целые			MPI_LORMPI_LXORMPI_BAND		целые, MPI_BYTE 			MPI_BOR		MPI_BXOR			Лекция 11. И.Г. Захарова, кафедра ПО

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

всех процессов коммуникатора comm процессу root.
Выполнение редукции:
операция op, выполняется

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

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

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

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

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

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

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

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

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

продолжат выполнение только после вызова всеми процессами коммуникатора.

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

Синхронизация процессовОдновременное достижение всеми процессами коммуникатора определенной «точки» вычислений обеспечивает функцияint MPI_Barrier(MPI_Comm comm)Вызывается всеми процессами.При вызове блокирует

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

count, MPI_Datatype type, int root, MPI_Comm comm)
buf – буфер с

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

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

Передача данных от одного процесса всем процессамint MPI_Bcast(void *buf, int count, MPI_Datatype type, int root, MPI_Comm comm)buf

Слайд 11Улучшенная программа примера 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. И.Г. Захарова, кафедра ПО

Улучшенная программа примера http://lusui.ru/64int main(int argc, char** argv) {		int rank=-1, total_proc=-1; 	int n; 	double pi, mypi, h,

Слайд 12       
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. И.Г. Захарова, кафедра ПО

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

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

на головном процессоре      
t2 = MPI_Wtime();            
cout

"< cout < cout <<"\n";                
cout <<"elapsed time: "< cout <<"\n";            
}        
} //end of else
} //end of while
   
cout <<"Finalizing MPI on process "<MPI_Finalize();    
return 0;
}

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

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

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

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

нескольких процессов.

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


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

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

dest, int tag, MPI_Comm comm)
buf – буфер с отправляемым сообщением,
count

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

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

Функция передачи сообщенияint MPI_Send(void *buf, int count, MPI_Datatype type, int dest, int tag, MPI_Comm comm)buf – буфер

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

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

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

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

Режим отправки – стандартный (standard)Вызов функции обеспечивает режим standard:На время выполнения функции процесс-отправитель сообщения блокируется.После завершения выполнения

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

только при получении от процесса-получателя подтверждения о начале приема отправленного

сообщения.
Функция отправки сообщения в синхронном режиме - MPI_Ssend

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

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

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

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

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

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



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

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

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

передан MPI буфер памяти:
int MPI_Buffer_attach(void *buf, int size),
где
buf – буфер

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

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

MPI буфер памятиДля использования буферизованного режима должен быть создан и передан MPI буфер памяти:int MPI_Buffer_attach(void *buf, int

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

быстрый, но сложно гарантировать готовность операции приема ? используется редко.
Стандартный

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

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

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

Слайд 21Функция приема сообщения
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. И.Г. Захарова, кафедра ПО

Функция приема сообщенияint MPI_Recv(void *buf, int count, MPI_Datatype type, int source, int tag, MPI_Comm comm, MPI_Status *status)buf

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

сообщения.
При нехватке памяти часть сообщения будет потеряна. В коде завершения

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

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

«джокеры»

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

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

– ранг процесса-отправителя принятого сообщения,
status.MPI_TAG –тэг принятого сообщения.
Функция
MPI_Get_count(MPI_Status*status,

MPI_Datatypetype, int *count)
возвращает в переменной count количество элементов типа type в принятом сообщении.

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

Требования к приему сообщенияПараметр status позволяет определить для принятого сообщения:status.MPI_SOURCE – ранг процесса-отправителя принятого сообщения,status.MPI_TAG –тэг принятого

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

начала отправки сообщения.
?Вызов MPI_Recv не обязан согласовываться со временем вызова

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

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

Требования к приему сообщенияПрием сообщения м.б. инициировандо момента,в момент,после момента начала отправки сообщения.?Вызов MPI_Recv не обязан согласовываться

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

вычислений) до момента завершения работы вызванных функций.
Все рассмотренные функции для

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

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

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

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

процессов для совмещения процессов передачи сообщений и вычислений.
Минус – более

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

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

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

Слайд 27Неблокирующие функции
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. И.Г. Захарова, кафедра ПО

Неблокирующие функции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

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

может использоваться для проверки в неблокирующей функции
int MPI_Test( MPI_Request*request, int

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

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

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

Слайд 29Пример
Условная схема вычислений и выполнения неблокирующей операции передачи сообщения:
MPI_Isend(buf, count,

type, dest, tag, comm, &request);

do
{

MPI_Test(&request,&flag,&status);
}
while(!flag);

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

кафедра ПО
ПримерУсловная схема вычислений и выполнения неблокирующей операции передачи сообщения:MPI_Isend(buf, count, type, dest, tag, comm, &request);…do {	…	MPI_Test(&request,&flag,&status);} while(!flag);Лекция

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика