Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

магПП2013 / lec12ПП

.pptx
Скачиваний:
23
Добавлен:
19.04.2015
Размер:
313 Кб
Скачать
☆

1

Функция приема сообщения

int MPI_Recv(void *buf, int count, MPI_Datatype type, int source, int tag, MPI_Comm comm, MPI_Status *status)

buf – буфер для приема сообщения,

count – количество элементов в сообщении, type – тип элементов сообщения,

source– ранг процесса, от которого д.б. выполнен прием сообщения,

tag– тэг сообщения, которое д.б. принято процессом, comm - коммуникатор, в рамках которого выполняется

операция,

status - указатель на переменную с результатами выполнения операции приема.

Лекция 12. И.Г. Захарова, кафедра ПО

2

Требования к приему сообщения

•Буфер памяти должен быть достаточным для приема сообщения.

•При нехватке памяти часть сообщения будет потеряна. В коде завершения функции будет зафиксирована ошибка переполнения.

•Типы элементов передаваемого и принимаемого сообщения должны совпадать.

•Для приема сообщения

▫от любого процесса-отправителя параметру source устанавливается значение MPI_ANY_SOURCE,

▫с любым тэгом параметру tag устанавливается

значение MPI_ANY_TAG.

«джокеры»

Лекция 12. И.Г. Захарова, кафедра ПО

3

Требования к приему сообщения

•Параметр status позволяет определить для принятого сообщения:

▫ status.MPI_SOURCE – ранг процесса-отправителя принятого сообщения,

▫status.MPI_TAG –тэг принятого сообщения.

•Функция

MPI_Get_count(MPI_Status*status,

MPI_Datatypetype, int *count)

возвращает в переменной count количество элементов типа type в принятом сообщении.

Лекция 12. И.Г. Захарова, кафедра ПО

4

Требования к приему сообщения

•Прием сообщения м.б. инициирован

▫до момента,

▫в момент,

▫после момента начала отправки сообщения.

Вызов MPI_Recv не обязан согласовываться

со временем вызова соответствующей функции

MPI_Recv

•Функция MPI_Recv – блокирующая для процесса-

получателя, его выполнение приостанавливается до завершения работы функции если ожидаемое для

приема сообщение будет отсутствовать, выполнение

параллельной программы будет блокировано.

•По завершении MPI_Recv в buf будет размещено

принятое сообщение.

Лекция 12. И.Г. Захарова, кафедра ПО

5

Неблокирующее выполнение передачи данных

•Блокирующие функции - приостанавливают выполнение процессов (например, вычислений) до момента завершения работы вызванных функций.

•Все рассмотренные функции для парных

операций передачи и приема являются

блокирующими.

•Если вычисления (др. операции) не зависят от передаваемых данных, то блокировка не нужна.

Лекция 12. И.Г. Захарова, кафедра ПО

6

Неблокирующее выполнение передачи данных

•Неблокирующие функции обмена данными выполняются без блокировки процессов для совмещения процессов передачи сообщений и вычислений.

•Минус – более сложны для использования.

•Плюс – могут уменьшить потери эффективности параллельных вычислений из-за медленных коммуникационных операций.

Лекция 12. И.Г. Захарова, кафедра ПО

7

Неблокирующие функции

int MPI_Isend(void*buf, int count, MPI_Datatypetype, int dest,int tag, MPI_Commcomm, MPI_Request*request);

int MPI_Issend(void*buf, int count, MPI_Datatypetype, int dest,int tag, MPI_Commcomm, MPI_Request*request);

int MPI_Ibsend(void*buf, int count, MPI_Datatypetype, int dest,int tag, MPI_Commcomm, MPI_Request*request);

int MPI_Irsend(void*buf, int count, MPI_Datatypetype, int dest, int tag, MPI_Commcomm, MPI_Request*request);

int MPI_Irecv(void*buf, int count, MPI_Datatypetype, int source, int tag, MPI_Commcomm, MPI_Request*request);

Лекция 12. И.Г. Захарова, кафедра ПО

8

Параметры функций

request - определяется функцией перед

завершением выполнения и может использоваться для проверки в неблокирующей

функции

int MPI_Test( MPI_Request*request, int *flag, MPI_status*status),

request-дескриптор операции, определенный при вызове неблокирующей функции,

flag-результат проверки(true, если операция завершена),

status-результат выполнения операции (только для завершенной операции)

Лекция 12. И.Г. Захарова, кафедра ПО

9

Пример

Условная схема вычислений и выполнения неблокирующей операции передачи сообщения:

MPI_Isend(buf, count, type, dest, tag, comm, &request);

…

do

{

…

MPI_Test(&request,&flag,&status);

}

while(!flag);

Лекция 12. И.Г. Захарова, кафедра ПО

10

Управление группами процессов и коммуникаторами

•На основе групп создаются

коммуникаторы

•В группе может быть

▫Один или несколько процессов

▫Все процессы

•Один и тот же процесс может принадлежать

нескольким группам

•Коммуникатор – объект, объединяющий

▫Группу процессов

▫Контекст – параметры, использующиеся при передаче данных

Лекция 12. И.Г. Захарова, кафедра ПО

Соседние файлы в папке магПП2013