Справочник по функциям MPI

Инициализация MPI

int MPI_Init( int* argc, char** argv)

Инициализация параллельной части приложения. Реальная инициализация для каждого приложения выполняется не более одного раза, а если MPI уже был инициализирован, то никакие действия не выполняются и происходит немедленный возврат из подпрограммы. Все остальные MPI-процедуры могут быть вызваны только после вызова MPI_Init.

Возвращает: в случае успешного выполнения - MPI_SUCCESS, иначе - код ошибки. (То же самое возвращают и все остальные функции).

Сложный тип аргументов MPI_Init предусмотрен для того, чтобы передавать всем процессам аргументы main:

Пример вызова:

int main(int argc, char** argv) { … MPI_Init(&argc, &argv); … }

Закрытие MPI

int MPI_Finalize( void )

Завершение параллельной части приложения. Все последующие обращения к любым MPI-процедурам, в том числе к MPI_Init, запрещены. К моменту вызова MPI_Finalize любым процессом все действия по обмену сообщениями должны быть завершены.

Пример вызова:

int main(int argc, char** argv) { … MPI_Finalize(); … }

 

Определение числа процессов

int MPI_Comm_size( MPI_Comm comm, int* size)

Определение общего числа параллельных процессов в группе comm (вместо comm во всех лабораторных работах использовать константу MPI_COMM_WORLD - группа "все процессы", связи в виде полного графа).

· comm - идентификатор группы

· выходной параметр size - размер группы. Здесь возвращается число процессов, которое пользователь задал при запуске программы.

Пример вызова:

… int size; MPI_Comm_size(MPI_COMM_WORLD, &size); …

 

Определение номера процесса

int MPI_Comm_rank( MPI_comm comm, int* rank)

Определение номера процесса в группе comm. Возвращаемое значение (номер процесса, rank) лежит в диапазоне от 0 до size-1.

· comm - идентификатор группы

· выходной параметр rank - номер вызывающего процесса в группе comm

Пример вызова:

… int rank; MPI_Comm_rank(MPI_COMM_WORLD, &rank); …

 

Аварийное завершение программы

int MPI_Abort(MPI_Comm comm, int errorcode )

Аварийное завершение работы всех процессов. Эта функция должна вызываться одновременно всеми процессами приложения.

· errorcode - код ошибки

· comm - идентификатор группы

Пример вызова:

… MPI_Abort(MPI_COMM_WORLD,MPI_ERR_OTHER); …

 

Передача сообщения

int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int msgtag, MPI_Comm comm)

Посылка сообщения с меткой msgtag, состоящего из count элементов типа datatype, процессу с номером dest. Все элементы сообщения расположены подряд в буфере buf. Значение count может быть нулем. Тип передаваемых элементов datatype должен указываться с помощью предопределенных констант типа (для целых - MPI_INT). Разрешается передавать сообщение самому себе. Метка должна быть одной и той же при приеме и передаче сообщения. Дальнейшее выполнение программы задерживается до тех пор, пока передача не завершится.

· buf - адрес начала буфера посылки сообщения

· count - число передаваемых элементов в сообщении

· datatype - тип передаваемых элементов

· dest - номер процесса-получателя

· msgtag - метка сообщения

· comm - идентификатор группы

Пример вызова:

… #define N 10 … int rank,buf[N]; … MPI_Send(buf,N,MPI_INT,1,10,MPI_COMM_WORLD); …

 

 

Прием сообщения

int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int msgtag, MPI_comm comm, MPI_Status *status)

Прием сообщения с меткой msgtag от процесса source с блокировкой. Число элементов в принимаемом сообщении не должно превосходить значения count.

· выходной параметр buf - адрес начала буфера приема сообщения

· count - максимальное число элементов в принимаемом сообщении

· datatype - тип элементов принимаемого сообщения

· source - номер процесса-отправителя

· msgtag - метка принимаемого сообщения

· comm - идентификатор группы

· выходной параметр status - параметры принятого сообщения

Пример вызова: