Слайд 2MPI
MPI - Message Passing Interface, интерфейс передачи сообщений.
Стандарт MPI 1.1.
Более 120 функций.
SPMD-модель
![MPI MPI - Message Passing Interface, интерфейс передачи сообщений. Стандарт MPI 1.1.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-1.jpg)
параллельного программирования.
Слайд 3MPI
Префикс MPI_ .
include ‘mpif.h’
(mpi.h для языка Си)
Процессы, посылка сообщений.
Группы процессов, коммуникаторы. MPI_COMM_WORLD
![MPI Префикс MPI_ . include ‘mpif.h’ (mpi.h для языка Си) Процессы, посылка](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-2.jpg)
Слайд 4MPI
Каждый процесс может одновременно входить в разные коммуникаторы.
Два основных атрибута процесса: коммуникатор
![MPI Каждый процесс может одновременно входить в разные коммуникаторы. Два основных атрибута](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-3.jpg)
(группа) и номер процесса в коммуникаторе (группе).
Если группа содержит n процессов, то номер любого процесса в данной группе лежит в пределах от 0 до n – 1.
Слайд 5MPI
Сообщение — набор данных некоторого типа.
Атрибуты сообщения: номер процесса-отправителя, номер процесса-получателя, идентификатор сообщения
![MPI Сообщение — набор данных некоторого типа. Атрибуты сообщения: номер процесса-отправителя, номер](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-4.jpg)
и др.
Идентификатор сообщения - целое неотрицательное число в диапазоне от 0 до 32767.
Для работы с атрибутами сообщений введен массив MPI_STATUS.
Слайд 6MPI
В последнем аргументе (в Си – возвращаемое значение функции) большинство функций MPI
![MPI В последнем аргументе (в Си – возвращаемое значение функции) большинство функций](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-5.jpg)
возвращают информацию об успешности завершения.
В случае успешного выполнения функция вернет значение MPI_SUCCESS, иначе —код ошибки.
Предопределенные значения, соответствующие различным ошибочным ситуациям, определены в файле mpif.h
Слайд 7MPI
MPI_INIT(IERR)
INTEGER IERR
Инициализация параллельной части программы. Все другие функции MPI могут быть вызваны
![MPI MPI_INIT(IERR) INTEGER IERR Инициализация параллельной части программы. Все другие функции MPI](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-6.jpg)
только после вызова MPI_INIT. Инициализация параллельной части для каждого приложения должна выполняться только один раз.
Слайд 8MPI
MPI_FINALIZE(IERR)
INTEGER IERR
Завершение параллельной части приложения. Все последующие обращения к любым MPI-функциям, в
![MPI MPI_FINALIZE(IERR) INTEGER IERR Завершение параллельной части приложения. Все последующие обращения к](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-7.jpg)
том числе к MPI_INIT, запрещены. К моменту вызова MPI_FINALIZE каждым процессом программы все действия, требующие его участия в обмене сообщениями, должны быть завершены.
Слайд 9MPI
Общая схема MPI-программы:
PROGRAM EXAMPLE
INCLUDE ‘mpif.h’
INTEGER IERR
…
CALL MPI_INIT(IERR)
…
CALL MPI_FINALIZE(IERR)
…
END
![MPI Общая схема MPI-программы: PROGRAM EXAMPLE INCLUDE ‘mpif.h’ INTEGER IERR … CALL](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-8.jpg)
Слайд 10MPI
MPI_INITIALIZED(FLAG, IERR)
LOGICAL FLAG
INTEGER IERR
В аргументе FLAG возвращает .TRUE., если вызвана из параллельной
![MPI MPI_INITIALIZED(FLAG, IERR) LOGICAL FLAG INTEGER IERR В аргументе FLAG возвращает .TRUE.,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-9.jpg)
части приложения, и .FALSE. в противном случае. Единственная MPI-функция, которую можно вызвать до вызова MPI_INIT.
Слайд 11MPI
MPI_COMM_SIZE(COMM, SIZE, IERR)
INTEGER COMM, SIZE, IERR
В аргументе SIZE возвращает число параллельных процессов
![MPI MPI_COMM_SIZE(COMM, SIZE, IERR) INTEGER COMM, SIZE, IERR В аргументе SIZE возвращает](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-10.jpg)
в коммуникаторе COMM.
Слайд 12MPI
MPI_COMM_RANK(COMM, RANK, IERR)
INTEGER COMM, RANK, IERR
В аргументе RANK возвращает номер
процесса в
![MPI MPI_COMM_RANK(COMM, RANK, IERR) INTEGER COMM, RANK, IERR В аргументе RANK возвращает](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-11.jpg)
коммуникаторе COMM в диапазоне от 0 до SIZE-1.
Слайд 13MPI
DOUBLE PRECISION MPI_WTIME(IERR)
INTEGER IERR
Функция возвращает для каждого вызвавшего процесса астрономическое время в
![MPI DOUBLE PRECISION MPI_WTIME(IERR) INTEGER IERR Функция возвращает для каждого вызвавшего процесса](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-12.jpg)
секундах (вещественное число), прошедшее с некоторого момента в прошлом. Момент времени, используемый в качестве точки отсчета, не будет изменен за время существования процесса.
Слайд 14MPI
DOUBLE PRECISION MPI_WTICK(IERR)
INTEGER IERR
Функция возвращает разрешение таймера в секундах.
![MPI DOUBLE PRECISION MPI_WTICK(IERR) INTEGER IERR Функция возвращает разрешение таймера в секундах.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-13.jpg)
Слайд 15MPI
PROGRAM EXAMPLE
INCLUDE ‘mpif.h’
INTEGER IERR, SIZE, RANK
CALL MPI_INIT(IERR)
CALL MPI_COMM_SIZE(MPI_COMM_WORLD, SIZE,
& IERR)
CALL
![MPI PROGRAM EXAMPLE INCLUDE ‘mpif.h’ INTEGER IERR, SIZE, RANK CALL MPI_INIT(IERR) CALL](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-14.jpg)
MPI_COMM_RANK(MPI_COMM_WORLD, RANK,
& IERR)
PRINT *, ‘PROCESS ’, RANK,‘ SIZE ’, SIZE
CALL MPI_FINALIZE(IERR)
END
Слайд 16MPI
MPI_SEND(BUF, COUNT, DATATYPE, DEST, MSGTAG, COMM, IERR)
BUF(*)
INTEGER COUNT, DATATYPE, DEST, MSGTAG,
![MPI MPI_SEND(BUF, COUNT, DATATYPE, DEST, MSGTAG, COMM, IERR) BUF(*) INTEGER COUNT, DATATYPE,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-15.jpg)
COMM, IERR
Блокирующая посылка массива BUF с идентификатором MSGTAG, состоящего из COUNT элементов типа DATATYPE, процессу с номером DEST в коммуникаторе COMM.
Слайд 17MPI
Типы данных:
MPI_INTEGER – INTEGER
MPI_REAL – REAL
MPI_DOUBLE_PRECISION – DOUBLE PRECISION
MPI_COMPLES – COMPLEX
MPI_LOGICAL –
![MPI Типы данных: MPI_INTEGER – INTEGER MPI_REAL – REAL MPI_DOUBLE_PRECISION – DOUBLE](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-16.jpg)
LOGICAL
MPI_CHARACTER – CHARACTER(1)
MPI_BYTE – 8 бит
MPI_PACKED – тип для упакованных данных.
Слайд 18MPI
Модификации функции MPI_SEND:
MPI_BSEND — передача сообщения с буферизацией.
MPI_SSEND — передача сообщения с синхронизацией.
MPI_RSEND — передача
![MPI Модификации функции MPI_SEND: MPI_BSEND — передача сообщения с буферизацией. MPI_SSEND —](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-17.jpg)
сообщения по готовности.
Слайд 19MPI
MPI_BUFFER_ATTACH(BUF, SIZE, IERR)
BUF(*)
INTEGER SIZE, IERR
Назначение массива BUF размера SIZE для использования
![MPI MPI_BUFFER_ATTACH(BUF, SIZE, IERR) BUF(*) INTEGER SIZE, IERR Назначение массива BUF размера](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-18.jpg)
при посылке сообщений с буферизацией. В каждом процессе может быть только один такой буфер.
Слайд 20MPI
MPI_BUFFER_DETACH(BUF, SIZE, IERR)
BUF(*)
INTEGER SIZE, IERR
Освобождение массива BUF для других целей. Процесс
![MPI MPI_BUFFER_DETACH(BUF, SIZE, IERR) BUF(*) INTEGER SIZE, IERR Освобождение массива BUF для](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-19.jpg)
блокируется до того момента, когда все сообщения уйдут из данного буфера.
Слайд 21MPI
MPI_RECV(BUF, COUNT, DATATYPE, SOURCE, MSGTAG, COMM, STATUS, IERR)
BUF(*)
INTEGER COUNT, DATATYPE, SOURCE,
![MPI MPI_RECV(BUF, COUNT, DATATYPE, SOURCE, MSGTAG, COMM, STATUS, IERR) BUF(*) INTEGER COUNT,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-20.jpg)
MSGTAG, COMM, IERR, STATUS(MPI_STATUS_SIZE)
Блокирующий прием сообщения длины не более COUNT от процесса с номером SOURCE с заполнением массива STATUS.
Слайд 22MPI
Вместо аргументов SOURCE и MSGTAG можно использовать константы:
MPI_ANY_SOURCE — признак того, что подходит сообщение
![MPI Вместо аргументов SOURCE и MSGTAG можно использовать константы: MPI_ANY_SOURCE — признак](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-21.jpg)
от любого процесса
MPI_ANY_TAG — признак того, что подходит сообщение с любым идентификатором.
Слайд 23MPI
Параметры принятого сообщения всегда можно определить по соответствующим элементам массива STATUS:
STATUS(MPI_SOURCE)— номер процесса-отправителя.
STATUS(MPI_TAG) — идентификатор
![MPI Параметры принятого сообщения всегда можно определить по соответствующим элементам массива STATUS:](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-22.jpg)
сообщения.
STATUS(MPI_ERROR) — код ошибки.
Слайд 24MPI
Если один процесс последовательно посылает два сообщения, соответствующие одному и тому же
![MPI Если один процесс последовательно посылает два сообщения, соответствующие одному и тому](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-23.jpg)
вызову MPI_RECV, другому процессу, то первым будет принято сообщение, которое было отправлено раньше.
Если два сообщения были одновременно отправлены разными процессами, то порядок их получения принимающим процессом заранее не определен.
Слайд 25MPI
MPI_GET_COUNT(STATUS, DATATYPE, COUNT, IERR)
INTEGER COUNT, DATATYPE, IERR, STATUS(MPI_STATUS_SIZE)
По значению параметра STATUS функция
![MPI MPI_GET_COUNT(STATUS, DATATYPE, COUNT, IERR) INTEGER COUNT, DATATYPE, IERR, STATUS(MPI_STATUS_SIZE) По значению](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-24.jpg)
определяет число COUNT уже принятых (после обращения к MPI_RECV) или принимаемых (после обращения к MPI_PROBE или MPI_IPROBE) элементов сообщения типа DATATYPE.
Слайд 26MPI
MPI_PROBE(SOURCE, MSGTAG, COMM, STATUS, IERR)
INTEGER SOURCE, MSGTAG, COMM, IERR, STATUS(MPI_STATUS_SIZE)
Получение в массиве
![MPI MPI_PROBE(SOURCE, MSGTAG, COMM, STATUS, IERR) INTEGER SOURCE, MSGTAG, COMM, IERR, STATUS(MPI_STATUS_SIZE)](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/461300/slide-25.jpg)
STATUS информации о структуре ожидаемого сообщения с блокировкой. Возврата не произойдет, пока сообщение с подходящим идентификатором и номером процесса-отправителя не будет доступно для получения.