logo
Лекции - Чернышева

Функции mpi

прототип функции

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

Функция инициализирует параллельную часть программы. Может быть запущена только один раз. Использование всех параллельных функций возможно только после запуска этой функции MPI_Unit

Пример

Void main (int argc, char**argv){

MPI_Init (& argc, &argv);

}

Сложный вид аргументов функции MPI_Init связан с необходимостью передачи всем процессам аргументов командной строки.

int MPI_Finalize ();

Завершает параллельную часть программы. После неё вызов параллельных функций недопустим. К моменту вызова функции MPI_Finalize на некотором процессе все параллельные функции на этом процессе должны быть завершены.

int MPI_Comm_size (MPI_Comm_comm, int * size)

MPI_Comm_comm – идентификатор коммутатора

int * size - количество процессоров в группе с идентификатором Comm.

Функция определяет число процессоров в группе с коммутатором Comm,

Например: int size

MPI_Comm_size (MPI_COMM_WORLD,& size)

int MPI_Comm_rank (MPI_Comm comm, int*rank);

MPI_Comm comm. – идентификатор коммуникатора

Int * rank – идентификатор процесса, вызывающего функцию. Принимает значения 0,…,size-1

Пример: пусть процессоры отзовутся и назовут себя.

#include <io Stream.h>

#include “mpi.h”

void main (int argc, char**argv) {

MPI_Init (& argc,&argv);

int size

MPI_Comm_Size (MPI_COMM_WORLD,& size)

int rank

MPI_Comm_rank (MPI_COMM_WORLD,& rank);

Cout <<”rank=”<<rank<<

“size=” <<size<<ende;

MPI_Finalize ();

Rank = 0 size = 5

Rank = 1 size = 5

Rank = 2 size = 5

Rank = 3 size = 5

Rank = 4 size = 5

int MPI_Recv (void*buf; int count, MPI_Datatype Datatype; int source; int msgtag; MPI_Comm comm; MPI_Status *Status)

void*buf – адрес переменной куда будет записана полученная информация;

count – количество полученной информации;

MPI_Datatype Datatype – тип получаемой информации в терминологии MPI;

int source – идентификатор процесса отправителя;

int msgtag – идентификаотр сообщения;

MPI_Comm comm – идентификатор коммуникатора группы, которой принадлежат процессы;

MPI_Status *Status - указатель на структуру MPI_Status, куда записываются атрибуты полученного значения.

Функция MPI_Recv принимает сообщение с идентификатором msgtag от процессора с номером source с блокировкой. Количество принимаемой информации не должно превышать count. Если информации будет меньше count, гарантируется, что в buf будут изменены те элементы, которые соответствуют элементам принятого сообщения. Блокировка гарантирует, что после выхода из функции MPI_Recv сообщение будет принято и записано в buf.

Функции MPI_Recv можно указать вместо параметра source предопределенную константу MPI_ANY_SOURCE, т.е. подойдет сообщение от любого процесса. Вместо параметра msgtag – MPI_ANY_TAG, т.е. будет принято сообщение с любым идентификатором.

Реальные значения принятого сообщения доступны через поля структуры: MPI_Status status;

status.count;

status.MPI_SOURCE; //от кого принято сообщение

status.MPI_TAG; //идентификатор сообщения

status.MPI_ERROR;

Функция возвращает MPI_Success в случае удачи, иначе - код ошибки.