Любая прикладная MPI-программа должна начинаться с вызова функции инициализации MPI: функции MPI_Init. В результате выполнения этой функции создается группа процессов, в которую помещаются все процессы приложения, и создается область связи, описываемая предопределенным коммуникатором MPI_COMM_WORLD. Эта область связи объединяет все процессы-приложения. Процессы в группе упорядочены и пронумерованы от 0 до groupsize-1, где groupsize равно числу процессов в группе. Кроме этого, создается предопределенный коммуникатор MPI_COMM_SELF, описывающий свою область связи для каждого отдельного процесса.
Синтаксис функции инициализации MPI_Init:
|
В программах на языке FORTRAN параметр IERROR является выходным и возвращает код ошибки.
Функция завершения MPI программ MPI_Finalize
- MPI_FINALIZE(IERROR)
- INTEGER IERROR
Функция закрывает все MPI-процессы и ликвидирует все области связи.
Функция определения числа процессов в области связи MPI_Comm_size
- MPI_COMM_SIZE(COMM, SIZE, IERROR)
- INTEGER COMM, SIZE, IERROR
Тип | Параметр | Описание |
---|---|---|
IN | comm | коммуникатор |
OUT | size | число процессов в области связи коммуникатора comm |
Функция возвращает количество процессов в области связи коммуникатора comm.
До создания явным образом групп и связанных с ними коммуникаторов единственно возможными значениями параметра COMM являются MPI_COMM_WORLD и MPI_COMM_SELF, которые создаются автоматически при инициализации MPI. Подпрограмма является локальной.
Функция определения номера процесса MPI_Comm_rank
- MPI_COMM_RANK(COMM, RANK, IERROR)
- INTEGER COMM, RANK, IERROR
Тип | Параметр | Описание |
---|---|---|
IN | comm | коммуникатор |
OUT | rank | номер процесса, вызвавщего функцию |
Функция возвращает номер процесса, вызвавшего эту функцию. Номера процессов лежат в диапазоне 0..size-1 (значение size может быть определено с помощью предыдущей функции). Подпрограмма является локальной.
В минимальный набор следует включить также две функции передачи и приема сообщений.
Функция передачи сообщения MPI_Send
- MPI_SEND(BUF, COUNT, DATATYPE, DEST, TAG, COMM, IERROR)
- <type> BUF(*)
- INTEGER COUNT, DATATYPE, DEST, TAG, COMM, IERROR
Тип | Параметр | Описание |
---|---|---|
IN | buf | адрес начала расположения пересылаемых данных |
IN | count | число пересылаемых элементов |
IN | datatype | тип посылаемых элементов |
IN | dest | номер процесса-получателя в группе, связанной с коммуникатором comm |
IN | tag | идентификатор сообщения (аналог типа сообщения функций nread и nwrite PSE nCUBE2) |
IN | comm | коммуникатор области связи |
Функция выполняет посылку count элементов типа datatype сообщения с идентификатором tag процессу dest в области связи коммуникатора comm. Переменная buf - это, как правило, массив или скалярная переменная. В последнем случае значение count = 1.
Функция приема сообщения MPI_Recv
- MPI_RECV(BUF, COUNT, DATATYPE, SOURCE, TAG, COMM,
- STATUS, IERROR)
- <type> BUF(*)
- INTEGER COUNT, DATATYPE, SOURCE, TAG, COMM,
- STATUS(MPI_STATUS_SIZE), IERROR
Тип | Параметр | Описание |
---|---|---|
OUT | buf | адрес начала расположения принимаемого сообщения |
IN | count | максимальное число принимаемых элементов |
IN | datatype | тип элементов принимаемого сообщения |
IN | source | номер процесса-отправителя |
IN | tag | идентификатор сообщения |
IN | comm | коммуникатор области связи |
OUT | status | атрибуты принятого сообщения |
Функция выполняет прием count элементов типа datatype сообщения с идентификатором tag от процесса source в области связи коммуникатора comm.
Более детально об операциях обмена сообщениями мы поговорим в следующем разделе, а в заключение этого раздела рассмотрим функцию, которая не входит в очерченный нами минимум, но которая важна для разработки эффективных программ. Речь идет о функции получения отсчета времени - таймере. С одной стороны, такие функции имеются в составе всех операционных систем, но, с другой стороны, существует полнейший произвол в их реализации. Опыт работы с различными операционными системами показывает, что при переносе приложений с одной платформы на другую первое (а иногда и единственное), что приходится переделывать - это обращения к функциям учета времени. Поэтому разработчики MPI, добиваясь полной независимости приложений от операционной среды, определили и свои функции отсчета времени.
Функция отсчета времени (таймер) MPI_Wtime
- DOUBLE PRECISION MPI_WTIME()
Функция возвращает астрономическое время в секундах, прошедшее с некоторого момента в прошлом (точки отсчета). Гарантируется, что эта точка отсчета не будет изменена в течение жизни процесса. Для хронометража участка программы вызов функции делается в начале и конце участка и определяется разница между показаниями таймера.