Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции - Чернышева.doc
Скачиваний:
8
Добавлен:
13.11.2019
Размер:
1.03 Mб
Скачать

Константы, типы данных, структуры mpi

  1. Тип данных mpi_Datatype

Тип С++

Тип Datatype

char

MPI_CHAR

unsigned char

MPI_INSIGNED_CHAR

int

MPI_INT

unsigned int

MPI_UNSIGNED

float

MPI_FLOAT

double

MPI_DOUBLE

long double

MPI_LONG_DOUBLE

Аналогично для всех остальных типов данных

  1. Предопределённые константы

  • MPI_SUCCESS – код удачного завершения функции;

  • MPI_ANY_SOURCE – идентификатор любого процесса отправителя;

  • MPI_ANY_TAG – идентификатор любого сообщения;

  • MPI_Comm – системный тип

typedef int MPI_Comm

  • MPI_COMM_WORLD – идентификатор всеобъемлющего коммуникатора принадлежащего всеобъемлющей группе.

  1. Сообщения

Процессы взаимодействуют друг с другом с помощью передачи сообщений. Сообщение - набор данных некоторого типа. Сообщение имеет атрибуты. Одним из важных является идентификатор сообщений или TAG. Атрибуты сообщения записываются в поля структуры:

MPI_status

typedef struct {

int count; //количество передаваемой информации

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

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

int MPI_ERROR;

} MPI_Status

  1. Функции mpi

  • MPI_Init();

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

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

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

Пример

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

MPI_Init (& argc, &argv);

}

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

  • MPI_Finalize ();

int MPI_Finalize ();

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

  • MPI_Comm_size ()

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)

  • MPI_Comm_rank();

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

  • Функция передачи и приёма данных с блокировкой

    • Функция приёма данных MPI_Recv ();

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 в случае удачи, иначе - код ошибки.