Параллельное программирование (лекции) / lec11
.pptx11
Улучшенная программа примера 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
{
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)
{
//Вторая засечка времени на головном процессоре t2 = MPI_Wtime();
cout <<“calc pi is "<<pi<<", error is: “; cout <<fabs(pi-PI25);
cout <<"\n";
cout <<"elapsed time: "<<fabs(t2-t1); cout <<"\n";
}
}//end of else
}//end of while
cout <<"Finalizing MPI on process "<<rank << "\n"; MPI_Finalize();
return 0;
}
Лекция 11. И.Г. Захарова, кафедра ПО
14
MPI. Операции передачи сообщений
•Операции, поддерживаемые MPI функциями:
▫Парные (point-to-point) – для взаимодействия между двумя процессами.
▫Коллективные (collective) – для одновременного взаимодействия нескольких процессов.
Лекция 11. И.Г. Захарова, кафедра ПО
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. И.Г. Захарова, кафедра ПО
16
Режим отправки – стандартный
(standard)
Вызов функции обеспечивает режим standard:
•На время выполнения функции процесс- отправитель сообщения блокируется.
•После завершения выполнения функции буфер может использоваться повторно.
•Состояние отправленного сообщения может быть различным – сообщение может:
▫располагаться на процессе-отправителе,
▫находиться в состоянии передачи,
▫храниться на процессе-получателе,
▫быть принято процессом-получателем при помощи
функции MPI_Recv.
Лекция 11. И.Г. Захарова, кафедра ПО
17
Дополнительные режимы передачи сообщений
•Синхронный режим (Synchronous)–завершение функции отправки сообщения происходит только при получении от процесса-получателя подтверждения о начале приема отправленного сообщения.
•Функция отправки сообщения в синхронном режиме -
MPI_Ssend
•Режим передачи по готовности (Ready) –может быть использован только, если операция приема сообщения уже инициирована. Буфер сообщения после завершения функции отправки сообщения может быть повторно использован.
•Функция отправки сообщения в режиме по готовности -
MPI_Rsend
Лекция 11. И.Г. Захарова, кафедра ПО
18
Дополнительные режимы передачи сообщений
•Буферизованный режим (Buffered) – для копирования отправляемых сообщений используются дополнительные системные буферы.
Функция отправки сообщения завершается сразу же после копирования сообщения в буфер.
•Функция отправки сообщения в буферизованном режиме - MPI_Bsend
Лекция 11. И.Г. Захарова, кафедра ПО
19
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. И.Г. Захарова, кафедра ПО