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

магПП2013 / lec12ПП

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

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