39
Гергель В.П. Общий курс Теория и практика параллельных вычислений Лекция 4 Методы разработки параллельных программ при использования интерфейса передачи сообщений MPI Нижегородский Государственный Университет им. Н.И. Нижегородский Государственный Университет им. Н.И. Лобачевского Лобачевского

Нижегородский Государственный Университет им. Н.И. Лобачевского

  • Upload
    selina

  • View
    60

  • Download
    0

Embed Size (px)

DESCRIPTION

Общий курс Теория и практика параллельных вычислений Лекция 4 Методы разработки параллельных программ при использования интерфейса передачи сообщений MPI. Нижегородский Государственный Университет им. Н.И. Лобачевского. Содержание. Основы подхода История Основы MPI Основные операции - PowerPoint PPT Presentation

Citation preview

Page 1: Нижегородский Государственный Университет им. Н.И. Лобачевского

Гергель В.П.

Общий курсТеория и практика параллельных

вычисленийЛекция 4

Методы разработки параллельных программ при использования интерфейса

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

Нижегородский Государственный Университет им. Н.И. ЛобачевскогоНижегородский Государственный Университет им. Н.И. Лобачевского

Page 2: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.2ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Содержание• Основы подхода• История• Основы MPI• Основные операции• Оценка времени выполнения• Коллективные операции• Режимы передачи сообщений• Проверка завершения операций• Буферизация сообщений• Пример 1 Пример 2

Page 3: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.3ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Основы подхода…

1. Организация взаимодействия независимо-выполняемых вычислений на процессорах с распределенной памятью

Линии передачи данных

Оперативная

память

Процессор

Кэш

Процессор

Кэш

Оперативная

память

Page 4: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.4ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Основы подхода…

2. Организация параллельных вычислений путем запуска одной и той же программы на нескольких процессоров (модель SPMD – single program multiple data). Различие вычислений обеспечиваются при помощи анализа номера процессора (процесса).

Page 5: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.5ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Основы подхода…

3. Способы организации передачи сообщений

Process S: P = 10;s1: send P to R;s2: P = 20;

Process R: Q = 0;r1: receive Q from S;r2: T = Q + 1;

• Синхронный (synchronous) – завершение send/receive после окончания передачи (T==11)

• Блокирующий (blocking) – send завершается после копирования сообщения в промежуточный буфер, receive ждет окончания приема (T==11)

• Неблокирующий (nonblocking) – send /receive только инициируют начало операции передачи (T==1,11,21)

Page 6: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.6ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Основы подхода…

4. Библиотеки программ для организации передачи сообщений

• PVM – Parallel Virtual Machine• MPI – Message Passing Interface и др. ! Библиотеки MPI основываются на стандарте

MPI, разработанном международным консорциумом MPI Forum

Page 7: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.7ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

История

1992 г. Начало работ над стандартом библиотеки передачи сообщений (Oak Ridge National Laboratory, Rice University).

Ноябрь 1992 г. Объявление рабочего варианта стандарта MPI1.

Ноябрь 1993 г. Обсуждение стандарта на конференции Supercomputing'93.

5 мая 1994 г. Окончательный вариант стандарта MPI 1.0.

12 Июня 1995 г. Новая версия стандарта - MPI 1.1. 18 Июля 1997 г. Опубликован стандарт MPI-2:

Extensions to the Message-Passing Interface.

Page 8: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.8ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Основы MPI…

В основу MPI положены четыре основные концепции:

• Тип операции передачи сообщения• Тип данных, пересылаемых в сообщении• Понятие коммуникатора (группы процессов)• Понятие виртуальной топологии

Page 9: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.9ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Основы MPI…

1. Операции передачи сообщений MPI включает в состав большое количество процедур

передачи данных (125). Минимально-необходимый набор – 6 функций.

2. Тип данных В силу возможной неоднородности вычислительной

системы при передачи сообщения необходимо указывать тип передаваемых данных. В MPI имеется набор стандартных типов (MPI_INT, MPI_DOUBLE,..), возможным является конструирование новых типов данных.

Page 10: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.10ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Основы MPI…

3. Понятие коммуникатора• На одном компьютере может быть запущено несколько

копий (процессов) исходной программы. • Все процессы могут быть распределены на группы

(коммуникаторы). • Группа процессов может отличаться контекстом

(значениями параметров, выбранной топологией и др.).• В составе коммуникатора процесс идентифицируется

уникальным номером (рангом). • Предопределенный коммуникатор, объединяющий все

имеющиеся процессы, MPI_COMM_WORLD

Page 11: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.11ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Основные операции…

1. Структура программы (начало/завершение)

#include “mpi.h”main(int argc, char *argv[]){... MPI_Init(&argc, &argv); /* место, где допустим вызов MPI-функций */

MPI_Finalize();...}

Page 12: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.12ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Основные операции…

2. Определение количества и ранга процессов

int n, rank; MPI_Comm_size(MPI_COMM_WORLD, &n); MPI_Comm_rank(MPI_COMM_WORLD, &rank);

Предопределенный коммуникатор, объединяющий все имеющиеся процессы

Общее количество процессов

Ранг (номер) процесса

Page 13: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.13ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Основные операции…

3. Передача сообщения (синхронная)

MPI_Send(Buf, Count, DataType, Dest, Tag, Comm)

•(Buf,Count,Datatype) – пересылаемое сообщение–Buf - адрес буфера памяти с сообщением,–Count - количество элементов данных в сообщении,–Datatype – тип элементов данных

• Dest – ранг (номер) процесса-адресата• Tag – номер сообщения• Comm – коммуникатор

Page 14: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.14ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Основные операции…

4. Прием сообщения (синхронный) MPI_Recv(Buf, Count, DataType, Source, Tag, Comm, Status)

•Source – номер процесса-отправителя

– MPI_ANY_SOURCE – любой источник

•Tag – номер принимаемого сообщения

– MPI_ANY_TAG – любое сообщение

•Status – результат операции (MPI_Status Status;)

– Status.MPI_Source – номер источника

– Status.MPI_Tag – номер принятого сообщения

– MPI_Get_count(&status, DataType, &count) – длина сообщения

Page 15: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.15ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Пример1: Параллельный "Hello, world"int main(int argc, char* argv[]){

return 0;}

MPI_Init(&argc, &argv);

MPI_Finalize();

int rank, n, i, message;

MPI_Comm_size(MPI_COMM_WORLD, &n); MPI_Comm_rank(MPI_COMM_WORLD, &rank); if (rank == 0){ /* Process 0 will output data */

} else MPI_Send(&rank, 1, MPI_INT, 0, 111, MPI_COMM_WORLD);

MPI_Status status;

printf ("\n Hello from process %3d", rank); for (i=1; i<n; i++){ MPI_Recv(&message, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); printf("\n Hello from process %3d", message); } }

Page 16: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.16ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Оценка времени выполнения• Необходимо измерение скорости исполнения

параллельной программы• Функция MPI_Wtime() дает время в секундах в виде

числа двойной точности– Формат: double MPI_Wtime();

• Разрешение выдаваемых функцией значений не специфицируется

• Функция MPI_Wtick() выдает число секунд между двумя ближайшими последовательными “тиками” часов

– Формат: double MPI_Wtick();

Page 17: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.17ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Коллективные операции…1. Синхронизация вычислений (согласование времени

нахождения исполняемых процессов в необходимых точках параллельного метода решения задачи)

• Формат: int MPI_Barrier( MPI_Comm comm );

! Вызов MPI_Barrier должен осуществляться в каждом процессе

Process S: … MPI_Barrier(comm); …

Process Q: … MPI_Barrier(comm); …

Page 18: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.18ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Коллективные операции…2. Рассылка сообщений всем процессам

int MPI_Bcast(&Buf, Count, Type, Root, &Comm);

Root – ранг процесса, источника рассылки

! Вызов MPI_Bcast должен осуществляться в каждом процессе

Process S: … MPI_Bcast(&n,1,MPI_INT,0, &Comm); …Process Q: … MPI_Bcast(&n,1,MPI_INT,0, &Comm); …

Page 19: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.19ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

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

3. Прием сообщения от всех процессов с выполнением стандартной операции обработки

int MPI_Reduce(&Sbuf, &Rbuf, Count, DataType, Operation, Root, &Comm);

- Sbuf – буфер отправляемого сообщения,

- Rbuf – буфер для приема сообщения,

- Root – ранг процесса для приема сообщения,

- Operation – операция обработки (MPI_SUM,…)

! Вызов MPI_Reduce должен осуществляться в каждом процессе

Page 20: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.20ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

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

Операции функции MPI_Reduce

• MPI_MAX и MPI_MIN ищут поэлементные максимум и минимум;

• MPI_SUM вычисляет сумму векторов; • MPI_PROD вычисляет поэлементное произведение векторов; • MPI_LAND, MPI_BAND, MPI_LOR, MPI_BOR, MPI_LXOR,

MPI_BXOR - логические и двоичные операции И, ИЛИ, исключающее ИЛИ;

• MPI_MAXLOC, MPI_MINLOC - поиск индексированного минимума/максимума - здесь не рассматриваются.

Page 21: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.21ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

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

Иллюстрация операции MPI_Reduce

Page 22: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.22ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Пример 2: Вычисление числа …

• Значение числа может быть получено при помощи интеграла

• Для численного интегрирования применим метод прямоугольников

Page 23: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.23ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Пример 2: Вычисление числа …

• Распределим вычисления между p процессорами• Получаемые на отдельных процессорах частные суммы

должны быть просуммированы

Page 24: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.24ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Пример 2: Вычисление числа …

#include "mpi.h" #include <math.h> double f(double a) { return (4.0 / (1.0 + a*a)); } int main(int argc, char *argv) {int done = 0, n, myid, numprocs, i, rc; double PI25DT = 3.141592653589793238462643; double mypi, pi, h, sum, x, a; double startwtime, endwtime; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid);

Page 25: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.25ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Пример 2: Вычисление числа …

n = 0; while (!done) { if (myid == 0) { printf("Enter the number of intervals: "); scanf("%d",&n); startwtime = MPI_Wtime(); } MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); if (n == 0) done = 1; else { h = 1.0 / (double) n; sum = 0.0;

Page 26: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.26ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Пример 2: Вычисление числа …

for (i = myid + 1; i <= n; i += numprocs) { x = h * ((double)i 0.5); sum += f(x); } mypi = h * sum; MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0, MPI_COMM_WORLD); if (myid == 0) { printf("pi is approximately %.16f, Error is %.16f\n",pi, fabs(pi PI25DT)); endwtime = MPI_Wtime(); printf("wall clock time = %f\n", endwtime startwtime); } } } MPI_Finalize(); }

Page 27: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.27ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Пример 2: Вычисление числа …

program main include 'mpif.h' double precision PI25DT parameter (PI25DT = 3.141592653589793238462643d0) double precision mypi, pi, h, sum, x, f, a integer n, myid, numprocs, i, rc c function to integrate f(a) = 4.d0 / (1.d0 + a*a) call MPI_INIT( ierr ) call MPI_COMM_RANK( MPI_COMM_WORLD,myid,ierr ) call MPI_COMM_SIZE( MPI_COMM_WORLD,numprocs,ierr) print *, "Process ", myid, " of ", numprocs10 if ( myid .eq. 0 ) then write(6,98) 98 format('Enter the number of intervals: ') read(5,99) n 99 format(i10) endif

Page 28: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.28ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Пример 2: Вычисление числа …

sizetype = 1 sumtype = 2 call MPI_BCAST(n,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr) c check for quit signal if ( n .le. 0 ) goto 30 c calculate the interval size h = 1.0d0/n sum = 0.0d0 do 20 i = myid+1, n, numprocs x = h * (dble(i) 0.5d0) sum = sum + f(x) 20 continue mypi = h * sum

Page 29: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.29ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Пример 2: Вычисление числа …

c collect all the partial sums call MPI_REDUCE(mypi,pi,1,MPI_DOUBLE_PRECISION, $ MPI_SUM,0,MPI_COMM_WORLD,ierr) c node 0 prints the answer if (myid .eq. 0) then write(6, 97) pi, abs(pi PI25DT) 97 format(' pi is approximately: ', F18.16, $ ' Error is: ', F18.16) endif goto 10 30 call MPI_FINALIZE(rc) stop end

Page 30: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.30ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Режимы передачи сообщений…

• Синхронный (synchronous) – send не возвращает управление, пока не начат receive

• Буферизуемый (buffered) - send возвращает управление после копирования сообщения в буфер передачи (работа с буфером MPI_Buffer_attatch,

MPI_Buffer_detatch)• Стандартный (standard) – режим по умолчанию

(синхронный или буферизуемый)• По готовности (Ready) – может применяться для

передачи данных при гарантированности, что операция приема уже активна (иначе send выдаст сообщение об ошибке)

Page 31: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.31ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Режимы передачи сообщений…

• Для операции передачи возможны 8 различных вариантов

• 4 режима передачи• 2 способа блокировки

• Для операции приема возможны 2 различных варианта• 1 режим передачи (standard)• 2 способа блокировки

Page 32: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.32ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Режимы передачи сообщений…

Система обозначений функций

Режим передачи Блокирующий Не блокирующий

Standard MPI_Send MPI_Isend Synchronous MPI_Ssend MPI_Issend Buffered MPI_Bsend MPI_Ibsend Ready MPI_Rsend MPI_Irsend Режим приема Блокирующий Не блокирующий

Standard MPI_Recv MPI_Irecv

Page 33: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.33ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Проверка завершения операций…

• Блокирующая проверкаint MPI_Wait( MPI_Request *request, MPI_Status *status);при завершении MPI_Wait

- для MPI_Isend сообщение переслано или скопировано в буфер,

- для MPI_Irecv сообщение скопировано в буфер процесса

- request == MPI_REQUST_NULL- status такой же, как и в MPI_Irecv

Page 34: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.34ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Проверка завершения операций

• Неблокирующая проверкаint MPI_Test( MPI_Request *request, int *flag, MPI_Status *status);

при завершении MPI_Test для незавершенной операции пересылки flag == 0

Page 35: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.35ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Буферизация сообщений

Page 36: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.36ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Самостоятельное задание. Скалярное умножение векторов

Условия:• Даны: вектор x, вектор y, p процессов• Пусть длина векторов нацело делится на p

Схема алгоритма:• Ввод данных осуществляет процесс 0• Каждый процесс получает оба вектора• Каждый процесс выполняет расчет над своей

частью векторов, вычисляемой по рангу• (x, y) = xi yi = xpi ypi • Суммирование промежуточных результатов

осуществляет нулевой процесс

Page 37: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.37ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Вопросы для обсуждения

• Сложность параллельных программ, разработанных с использованием MPI

• Проблема отладки

Page 38: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.38ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Заключение

• Технология разработки параллельных программ на основе интерфейса передачи данных

• Стандарт MPI как средство обеспечения мобильности параллельных программ

• Основные операции передачи сообщений

Page 39: Нижегородский Государственный Университет им. Н.И. Лобачевского

4.39ННГУ, Н.Новгород, 2001

Параллельные вычисления @ Гергель В.П.

Следующая тема

• Модели вычислений и методы анализа эффективности - 2