390 likes | 582 Views
Общий курс Теория и практика параллельных вычислений Лекция 4 Методы разработки параллельных программ при использования интерфейса передачи сообщений MPI. Нижегородский Государственный Университет им. Н.И. Лобачевского. Содержание. Основы подхода История Основы MPI Основные операции
E N D
Общий курсТеория и практика параллельных вычисленийЛекция 4Методы разработки параллельных программ при использования интерфейса передачи сообщений MPI Нижегородский Государственный Университет им. Н.И. Лобачевского
Содержание • Основы подхода • История • Основы MPI • Основные операции • Оценка времени выполнения • Коллективные операции • Режимы передачи сообщений • Проверка завершения операций • Буферизация сообщений • Пример 1 Пример 2 Параллельные вычисления @ Гергель В.П.
Основы подхода… 1. Организация взаимодействия независимо-выполняемых вычислений на процессорах с распределенной памятью Параллельные вычисления @ Гергель В.П.
Основы подхода… 2. Организация параллельных вычислений путем запуска одной и той же программы на нескольких процессоров (модель SPMD – single program multiple data). Различие вычислений обеспечиваются при помощи анализа номера процессора (процесса). Параллельные вычисления @ Гергель В.П.
Основы подхода… 3. Способы организации передачи сообщений • Синхронный (synchronous) – завершение send/receive после окончания передачи (T==11) • Блокирующий (blocking) – send завершается после копирования сообщения в промежуточный буфер, receive ждет окончания приема (T==11) • Неблокирующий (nonblocking) – send /receive только инициируют начало операции передачи (T==1,11,21) 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; Параллельные вычисления @ Гергель В.П.
Основы подхода… 4. Библиотеки программ для организации передачи сообщений • PVM – Parallel Virtual Machine • MPI – Message Passing Interface и др. ! Библиотеки MPI основываются на стандарте MPI, разработанном международным консорциумом MPI Forum Параллельные вычисления @ Гергель В.П.
История 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. Параллельные вычисления @ Гергель В.П.
Основы MPI… В основу MPI положены четыре основные концепции: • Тип операции передачи сообщения • Тип данных, пересылаемых в сообщении • Понятие коммуникатора (группы процессов) • Понятие виртуальной топологии Параллельные вычисления @ Гергель В.П.
Основы MPI… 1. Операции передачи сообщений MPI включает в состав большое количество процедур передачи данных (125). Минимально-необходимый набор – 6 функций. 2. Тип данных В силу возможной неоднородности вычислительной системы при передачи сообщения необходимо указывать тип передаваемых данных. В MPI имеется набор стандартных типов (MPI_INT, MPI_DOUBLE,..), возможным является конструирование новых типов данных. Параллельные вычисления @ Гергель В.П.
Основы MPI… 3.Понятие коммуникатора • На одном компьютере может быть запущено несколько копий (процессов) исходной программы. • Все процессы могут быть распределены на группы (коммуникаторы). • Группа процессов может отличаться контекстом (значениями параметров, выбранной топологией и др.). • В составе коммуникатора процесс идентифицируется уникальным номером (рангом). • Предопределенный коммуникатор, объединяющий все имеющиеся процессы, MPI_COMM_WORLD Параллельные вычисления @ Гергель В.П.
Основные операции… 1. Структура программы (начало/завершение) #include “mpi.h” main(int argc, char *argv[]){ ... MPI_Init(&argc, &argv); /* место, где допустим вызов MPI-функций */ MPI_Finalize(); ... } Параллельные вычисления @ Гергель В.П.
Основные операции… Общее количество процессов 2. Определение количества и ранга процессов int n, rank; MPI_Comm_size(MPI_COMM_WORLD, &n); MPI_Comm_rank(MPI_COMM_WORLD, &rank); Предопределенный коммуникатор, объединяющий все имеющиеся процессы Ранг (номер) процесса Параллельные вычисления @ Гергель В.П.
Основные операции… 3. Передача сообщения (синхронная) MPI_Send(Buf, Count, DataType, Dest,Tag,Comm) • (Buf,Count,Datatype) – пересылаемое сообщение • Buf - адрес буфера памяти с сообщением, • Count - количество элементов данных в сообщении, • Datatype – тип элементов данных • Dest – ранг (номер) процесса-адресата • Tag – номер сообщения • Comm – коммуникатор Параллельные вычисления @ Гергель В.П.
Основные операции… 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) – длина сообщения Параллельные вычисления @ Гергель В.П.
Пример1: Параллельный "Hello, world" int main(int argc, char* argv[]){ return 0; } 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); } } MPI_Init(&argc, &argv); MPI_Finalize(); Параллельные вычисления @ Гергель В.П.
Оценка времени выполнения • Необходимо измерение скорости исполнения параллельной программы • Функция MPI_Wtime() дает время в секундах в виде числа двойной точности • Формат: double MPI_Wtime(); • Разрешение выдаваемых функцией значений не специфицируется • Функция MPI_Wtick() выдает число секунд между двумя ближайшими последовательными “тиками” часов • Формат: double MPI_Wtick(); Параллельные вычисления @ Гергель В.П.
Коллективные операции… • 1. Синхронизация вычислений (согласование времени нахождения исполняемых процессов в необходимых точках параллельного метода решения задачи) • Формат: int MPI_Barrier( MPI_Comm comm ); • ! Вызов MPI_Barrierдолжен осуществляться в каждом процессе Process S: … MPI_Barrier(comm); … Process Q: … MPI_Barrier(comm); … Параллельные вычисления @ Гергель В.П.
Коллективные операции… 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); … Параллельные вычисления @ Гергель В.П.
Коллективные операции… • 3. Прием сообщения от всех процессов с выполнением стандартной операции обработки • int MPI_Reduce(&Sbuf, &Rbuf, Count,DataType, Operation, Root,&Comm); • Sbuf– буфер отправляемого сообщения, • Rbuf– буфер для приема сообщения, • Root – ранг процесса для приема сообщения, • Operation – операция обработки (MPI_SUM,…) • ! Вызов MPI_Reduceдолжен осуществляться в каждом процессе Параллельные вычисления @ Гергель В.П.
Коллективные операции… • Операции функции 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 - поиск индексированного минимума/максимума - здесь не рассматриваются. Параллельные вычисления @ Гергель В.П.
Коллективные операции Иллюстрация операции MPI_Reduce Параллельные вычисления @ Гергель В.П.
Пример 2: Вычисление числа … • Значение числа может быть получено при помощи интеграла • Для численного интегрирования применим метод прямоугольников Параллельные вычисления @ Гергель В.П.
Пример 2: Вычисление числа … • Распределим вычисления между p процессорами • Получаемые на отдельных процессорах частные суммы должны быть просуммированы Параллельные вычисления @ Гергель В.П.
Пример 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); Параллельные вычисления @ Гергель В.П.
Пример 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; Параллельные вычисления @ Гергель В.П.
Пример 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",endwtimestartwtime); } } } MPI_Finalize(); } Параллельные вычисления @ Гергель В.П.
Пример 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 ", numprocs 10if ( myid .eq. 0 ) then write(6,98) 98 format('Enter the number of intervals: ') read(5,99) n 99 format(i10) endif Параллельные вычисления @ Гергель В.П.
Пример 2: Вычисление числа … sizetype = 1 sumtype = 2 callMPI_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 Параллельные вычисления @ Гергель В.П.
Пример 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 Параллельные вычисления @ Гергель В.П.
Режимы передачи сообщений… • Синхронный (synchronous) – send не возвращает управление, пока не начат receive • Буферизуемый (buffered) - send возвращает управление после копирования сообщения в буфер передачи (работа с буфером MPI_Buffer_attatch, MPI_Buffer_detatch) • Стандартный (standard)– режим по умолчанию (синхронный или буферизуемый) • По готовности (Ready) – может применяться для передачи данных при гарантированности, что операция приема уже активна (иначе send выдаст сообщение об ошибке) Параллельные вычисления @ Гергель В.П.
Режимы передачи сообщений… • Для операции передачи возможны 8 различных вариантов • 4 режима передачи • 2 способа блокировки • Для операции приема возможны 2 различных варианта • 1 режим передачи (standard) • 2 способа блокировки Параллельные вычисления @ Гергель В.П.
Режимы передачи сообщений… Система обозначений функций Параллельные вычисления @ Гергель В.П.
Проверка завершения операций… • Блокирующая проверкаint MPI_Wait( MPI_Request *request, MPI_Status *status);при завершении MPI_Wait • для MPI_Isend сообщение переслано или скопировано в буфер, • для MPI_Irecv сообщение скопировано в буфер процесса • request == MPI_REQUST_NULL • status такой же, как и в MPI_Irecv Параллельные вычисления @ Гергель В.П.
Проверка завершения операций • Неблокирующая проверкаint MPI_Test( MPI_Request *request, int *flag, MPI_Status *status); • при завершении MPI_Test для незавершенной операции пересылки flag == 0 Параллельные вычисления @ Гергель В.П.
Буферизация сообщений Параллельные вычисления @ Гергель В.П.
Самостоятельное задание. Скалярное умножение векторов Условия: • Даны: вектор x, вектор y, p процессов • Пусть длина векторов нацело делится на p Схема алгоритма: • Ввод данных осуществляет процесс 0 • Каждый процесс получает оба вектора • Каждый процесс выполняет расчет над своей частью векторов, вычисляемой по рангу • (x, y) = xi yi = xpi ypi • Суммирование промежуточных результатов осуществляет нулевой процесс Параллельные вычисления @ Гергель В.П.
Вопросы для обсуждения • Сложность параллельных программ, разработанных с использованием MPI • Проблема отладки Параллельные вычисления @ Гергель В.П.
Заключение Технология разработки параллельных программ на основе интерфейса передачи данных Стандарт MPI как средство обеспечения мобильности параллельных программ Основные операции передачи сообщений Параллельные вычисления @ Гергель В.П.
Следующая тема • Модели вычислений и методы анализа эффективности - 2 Параллельные вычисления @ Гергель В.П.