
- •Задание 3.
- •Программирование в MPI
- •1. Операции “точка-точка” (новые сведения)
- •1.3.1. Передача с буферизацией
- •Схема использования памяти при передаче с буферизацией
- •1.3.1.1. Выделение пользовательского буфера
- •Пример простой программы обмена с буферизацией
- •1.3.2. Передача с cинхронизацией
- •Схема использования памяти при передаче с синхронизацией
- •1.3.3. Передача по готовности (редко используется)
- •Схема использования памяти при передаче по готовности
- •Замечания к семантике взаимодействия “точка-точка”
- •Далее – функции обмена без блокировки.
- •Пример параллельной программы вычисления числа π 1
- •PROGRAM Example4_Pi
- •C Результат – Пи – будет получен в процессоре 0 IF (RANK .EQ.

Задание 3.
1.Написать параллельную программу вычисления суммы S элементов матрицы
Sparallel = ∑ A(i,j).
2.Значения матрицы А инициализируются в программе (ввода матрицы
нет).
3.Сравнить значение Sparallel c суммой Sserial последовательной программы.
4.Применить программу к матрице возможно большего размера.
5.Измерить время параллельного и последовательного счета.
6.Определить ускорение параллельной программы на 2, 4, 8, 16 процессорах.
Гонки – минимальное время расчета матрицы максимального размера на 8 процессорах.

Программирование в MPI
1. Операции “точка-точка” (повторение)
1.1 Передача с блокировкой (стандартный режим) MPI_SEND (BUF, COUNT, DATATYPE, DEST, TAG, COMM, IERR)
1.2 Прием с блокировкой MPI_RECV(BUF,COUNT,DATATYPE,SOURCE,TAG,COMM,STATUS,IERR
Блокировка – приостановка выполнения процесса до выполнения некоторого условия
MPI_RECV – возвращает управление, только когда буфер приема получит сообщение.
MPI_SEND – возвращает управление, когда буфер отправки может быть повторно использован, то есть либо:
1)данные сообщения и их оболочка скопированы в системный буфер, либо
2)данные сообщения и их оболочка переданы непосредственно в буфер приема.

1. Операции “точка-точка” (новые сведения)
стандартный |
MPI_SEND, |
буферизованный |
MPI_BSEND, |
синхронный |
MPI_SSEND, |
по готовности |
MPI_RSEND |
1.3 Передача с блокировкой (буферизованный, синхронный, по готовности)
MPI_SEND (BUF,COUNT,DATATYPE,DEST,TAG,COMM,IERR)
MPI_BSEND (BUF,COUNT,DATATYPE,DEST,TAG,COMM,IERR) MPI_SSEND (BUF,COUNT,DATATYPE,DEST,TAG,COMM,IERR) MPI_RSEND (BUF,COUNT,DATATYPE,DEST,TAG,COMM,IERR)

1.3.1. Передача с буферизацией
MPI_BSEND (BUF, COUNT, DATATYPE, DEST, TAG, COMM, IERR) INTEGER COUNT, DATATYPE, DEST, TAG, COMM, IERR
BUF |
- буфер передачи (выделяет пользователь !) |
COUNT |
- состоящий из COUNT элементов (возможно=0) |
DATATYPE |
- типа DATATYPE |
DEST |
- передается процессу с номером DEST в коммуникаторе |
|
COMM |
TAG |
- с тэгом сообщения TAG |
COMM |
- коммуникатор взаимодействующих процессов |
IERR |
- код ошибки |

Схема использования памяти при передаче с буферизацией
Процессор 1 |
Процессор 2 |
(отправитель) |
(получатель) |
MPI_BSEND(BUFS,…) |
MPI_RECV (BUFR, …) |
BUFS : |
BUFR : |
USER : |
|
Блокировка – пока данные сообщения не скопированы в буфер пользователя

1.3.1.1. Выделение пользовательского буфера
MPI_BUFFER_ATTACH |
(BUF,SIZE,IERR) |
|
INTEGER SIZE, IERR |
|
|
BUF |
- массив BUF объявляется буфером для MPI (один на |
|
процесс) |
|
|
SIZE |
- размер буфера в байтах |
|
|
(должен быть не меньше |
|
|
<длина сообщения> + MPI_BSEND_OVERHEAD) |
|
IERR |
- код ошибки |
|
1.3.1.2. Освобождение пользовательского буфера
(блокирует, пока сообщения не уйдут из буфера)
MPI_BUFFER_DETACH (BUF,SIZE,IERR)
BUF |
- адрес освобождаемого буфера |
SIZE |
- возвращается размер освобождаемого в |
байтах |
|
IERR |
- код ошибки |

Пример простой программы обмена с буферизацией
PROGRAM Example3 include 'mpif.h‘ INTEGER BUFSIZE
PARAMETER (BUFSIZE = 4 + MPI_BSEND_OVERHEAD) BYTE USER(BUFSIZE)
INTEGER ERR, RANK, IBUFSIZE, BUFR, STATUS(MPI_STATUS_SIZE)
CСтандартное начало MPI - программы CALL MPI_INIT (ERR)
CALL MPI_COMM_RANK (MPI_COMM_WORLD,RANK,ERR)
CCALL MPI_COMM_SIZE (MPI_COMM_WORLD,SIZE,ERR) IF (RANK .EQ. 0) THEN
CALL MPI_BUFFER_ATTACH (USER, BUFSIZE, ERR)
CALL MPI_BSEND(RANK,1,MPI_INTEGER,1,5, MPI_COMM_WORLD,ERR) CALL MPI_BUFFER_DETACH (USER, IBUFSIZE, ERR)
ENDIF
IF (RANK .EQ. 1) THEN
CALL MPI_RECV (BUFR,1,MPI_INTEGER,0,5,
* |
MPI_COMM_WORLD,STATUS,ERR) |
WRITE (* , *) ' |
Process 1 received ‘, BUFR, ' from process ', |
* |
STATUS(MPI_SOURCE) |
ENDIF |
|
CALL MPI_FINALIZE(ERR)
END

1.3.2. Передача с cинхронизацией
MPI_SSEND (BUF, COUNT, DATATYPE, DEST, TAG, COMM, IERR) INTEGER COUNT, DATATYPE, DEST, TAG, COMM, IERR
BUF |
- буфер передачи |
COUNT |
- состоящий из COUNT элементов (возможно=0) |
DATATYPE |
- типа DATATYPE |
DEST |
- передается процессу с номером DEST в коммуникаторе |
|
COMM |
TAG |
- с тэгом сообщения TAG |
COMM |
- коммуникатор взаимодействующих процессов |
IERR |
- код ошибки |

Схема использования памяти при передаче с синхронизацией
Процессор 1 |
Процессор 2 |
(отправитель) |
(получатель) |
MPI_SSEND(BUFS,…) MPI_RECV (BUFR, …)
BUFS : |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BUFR : |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
SYSTEM : |
Блокировка – пока не начнется выполнение приема в Процессе 2
механизм “рандеву”

1.3.3. Передача по готовности (редко используется)
MPI_RSEND (BUF, COUNT, DATATYPE, DEST, TAG, COMM, IERR) INTEGER COUNT, DATATYPE, DEST, TAG, COMM, IERR
BUF |
- буфер передачи |
COUNT |
- состоящий из COUNT элементов (возможно=0) |
DATATYPE |
- типа DATATYPE |
DEST |
- передается процессу с номером DEST в коммуникаторе |
|
COMM |
TAG |
- с тэгом сообщения TAG |
COMM |
- коммуникатор взаимодействующих процессов |
IERR |
- код ошибки |