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

Содержание

Слайд 2

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

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

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

нехватке памяти часть сообщения будет потеряна. В коде завершения функции будет зафиксирована ошибка переполнения.
Типы элементов передаваемого и принимаемого сообщения должны совпадать.
Для приема сообщения
от любого процесса-отправителя параметру source устанавливается значение MPI_ANY_SOURCE,
с любым тэгом параметру tag устанавливается значение MPI_ANY_TAG.

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

«джокеры»

Слайд 3

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

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

Параметр 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,

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

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 - определяется функцией перед завершением выполнения и может

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

request - определяется функцией перед завершением выполнения и может

использоваться для проверки в неблокирующей функции
int MPI_Test( MPI_Request*request, int *flag, MPI_status*status),
request-дескриптор операции, определенный при вызове неблокирующей функции,
flag-результат проверки(true, если операция завершена),
status-результат выполнения операции (только для завершенной операции)

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

Слайд 9

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

Пример

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

dest, tag, comm, &request);

do
{

MPI_Test(&request,&flag,&status);
}
while(!flag);

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

Слайд 10

Управление группами процессов и коммуникаторами На основе групп создаются коммуникаторы В

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

На основе групп создаются коммуникаторы
В группе может

быть
Один или несколько процессов
Все процессы
Один и тот же процесс может принадлежать нескольким группам
Коммуникатор – объект, объединяющий
Группу процессов
Контекст – параметры, использующиеся при передаче данных

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

Слайд 11

Выполнение операций передачи данных Парные операции – только для процессов из

Выполнение операций передачи данных

Парные операции – только для процессов из одного

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

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

Слайд 12

Управление группами Группа создается только из уже существующих групп. Исходной м.б.

Управление группами

Группа создается только из уже существующих групп.
Исходной м.б. группа, связанная

с коммуникатором по умолчанию – MPI_COMM_WORLD.
Для каждого процесса определен коммуникатор MPI_COMM_SELF, включающий этот процесс.
Можно использовать пустую группу MPI_GROUP_EMPTY

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

Слайд 13

Получение группы, связанной с существующим коммуникатором: int MPI_Comm_group(MPI_Comm comm, MPI_Group *group)

Получение группы, связанной с существующим коммуникатором:

int MPI_Comm_group(MPI_Comm comm, MPI_Group *group)
comm –

коммуникатор,
group – группа, связанная с коммуникатором.

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

Слайд 14

Создание новой группы на основе существующей (1) int MPI_Group_incl(MPI_Group oldgroup,int n,int

Создание новой группы на основе существующей (1)

int MPI_Group_incl(MPI_Group oldgroup,int n,int *ranks,MPI_Group

*newgroup)
oldgroup – существующая группа,
newgroup – созданная группа,
n – количество элементов в массиве ranks ,
ranks – массив, хранящий ранги процессов, вошедших в новую группу.

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

Слайд 15

Создание новой группы на основе существующей (2) int MPI_Group_excl(MPI_Group oldgroup,int n,int

Создание новой группы на основе существующей (2)

int MPI_Group_excl(MPI_Group oldgroup,int n,int *ranks,MPI_Group

*newgroup)
oldgroup – существующая группа,
newgroup – созданная группа,
n – количество элементов в массиве ranks ,
ranks – массив, хранящий ранги процессов, которые будут исключены из новой группы.

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

Слайд 16

Пример: создание двух непересекающихся групп … size1=size/2; for(i=1; i { ranks[i]=i-1;

Пример: создание двух непересекающихся групп


size1=size/2;
for(i=1; i<=size1; i++)
{
ranks[i]=i-1;
}
MPI_Group_incl(group, size1, ranks, group1);
MPI_Group_excl(group,

size1, ranks, group2);

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

Слайд 17

Операции над группами На основе существующих групп group1 и group2 может

Операции над группами

На основе существующих групп group1 и group2 может быть

создана новая группа newgroup
Объединение:
int MPI_Group_union(MPI_Group group1, MPI_Group group2,MPI_Group *newgroup);
Пересечение:
int MPI_Group_intersection( MPI_Group group1, MPI_Group group2, MPI_Group *newgroup);
Разность:
int MPI_Group_difference( MPI_Group group1, MPI_Group group2, MPI_Group *newgroup);

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

Слайд 18

Пример В группу gr1 входят процессы 0, 1, 2, 4, 5

Пример

В группу gr1 входят процессы 0, 1, 2, 4, 5
В группу

gr2 - процессы 0, 2, 3
Нумерация задана в группе, соответствующей MPI_COMM_WORLD
После вызовов
MPI_Group_intersection(gr1, gr2, *newgr1);
MPI_Group_union(gr1, gr2, *newgr2);
MPI_Group_difference(gr1, gr2, *newgr3);
В группе newgr1 процессы 0, 2
В группе newgr2 процессы 0, 1, 2, 4, 5, 3
В группе newgr3 процессы 1, 4, 5
Порядок нумерации процессов в новых группах соответствует порядку их перечисления

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

Слайд 19

Получение информации о группе Количество процессов в группе: int MPI_Group_size(MPI_Group group,

Получение информации о группе

Количество процессов в группе:
int MPI_Group_size(MPI_Group group, int *size)
group

– группа,
size– количество процессов.
Ранг текущего процесса в группе:
int MPI_Group_rank(MPI_Group group, int *rank)
group – группа,
rank– ранг процесса в группе.

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

Слайд 20

Удаление группы После завершения использования группы ее надо удалить с помощью

Удаление группы

После завершения использования группы ее надо удалить с помощью функции:
int

MPI_Group_free(MPI_Group group)
group – группа.
Удаление группы не затрагивает коммуникаторы, в которых она используется.

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

Слайд 21

Операции над коммуникаторами Создание нового коммуникатора путем дублирования имеющегося: int MPI_Comm_dup(MPI_Comm

Операции над коммуникаторами

Создание нового коммуникатора
путем дублирования имеющегося:
int MPI_Comm_dup(MPI_Comm oldcom, MPI_Comm *newcom);
из

подмножества процессов (группы) имеющегося:
int MPI_Comm_create(MPI_Comm oldcom, MPI_Group group, MPI_Comm *newcom);
Операция создания коммуникаторов является коллективной ? должна выполняться всеми процессами исходного коммуникатора

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

Слайд 22

Операции над коммуникаторами Одновременное создание нескольких новых коммуникаторов: int MPI_Comm_split(MPI_Comm oldcom,

Операции над коммуникаторами

Одновременное создание нескольких новых коммуникаторов:
int MPI_Comm_split(MPI_Comm oldcom, int split,

int key, MPI_Comm *newcom);
split– в один коммуникатор попадают процессы с одним значением этого параметра,
key– процессы с бОльшим значением параметра получат бОльший ранг в группе (при равных значениях порядок выбирает система)
Удаление коммуникатора:
int MPI_Comm_free(MPI_Comm *com);

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

Слайд 23

Операция – коллективная ? Вызов функции MPI_Comm_split должен быть выполнен в

Операция – коллективная ?
Вызов функции MPI_Comm_split должен быть выполнен в каждом

процессе коммуникатора oldcom.
Процессы разделяются на непересекающиеся группы с одинаковыми значениями параметра split.
На основе сформированных групп создается набор коммуникаторов.
Порядок нумерации процессов соответствует порядку значений параметра key (процесс с бОльшим значением параметра key будет иметь бОльший ранг).

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

Слайд 24

Пример MPI_Comm comm; int rank, row; MPI_Comm_rank(MPI_COMM_WORLD, &rank); row = rank

Пример

MPI_Comm comm;
int rank, row;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
row = rank / q;
MPI_Comm_split(MPI_COMM_WORLD, row, rank,

&comm);
При q=3, общем числе процессов = 9 получим:
Процессы с рангами (0, 1, 2) – первый коммуникатор.
Процессы с рангами (3, 4, 5) – второй коммуникатор.
И т.д.

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

Слайд 25

Виртуальные топологии Под топологией вычислительной системы понимают структуру узлов сети и

Виртуальные топологии

Под топологией вычислительной системы понимают структуру узлов сети и линий

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

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

Слайд 26

Парные операции передачи данных могут быть выполнены между любыми процессами коммуникатора.

Парные операции передачи данных могут быть выполнены между любыми процессами коммуникатора.

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

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

Слайд 27

Пример - топология некоторого графа Функция для создания коммуникатора с топологией

Пример - топология некоторого графа

Функция для создания коммуникатора с топологией типа

граф:
int MPI_Graph_create(MPI_Comm oldcomm, int nnodes, int *index, int *edges, int reorder, MPI_Comm* graphcomm)
oldcomm-исходныйкоммуникатор,
nnodes-количество вершин графа,
index-количество исходящих дуг для каждой вершины,
edges-последовательный список дуг графа,
reorder-параметр допустимости изменения нумерации процессов,
graphcomm–создаваемый коммуникатор с топологией типа граф.
Операция создания топологии является коллективной и должна выполняться всеми процессами исходного коммуникатора

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

Слайд 28

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

Пример

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