Параллельная Обработка Данных, 11 лекция (от 13 ноября)

Материал из eSyr's wiki.

(Различия между версиями)
Перейти к: навигация, поиск

Allena (Обсуждение | вклад)
(Новая: ==Блокирующие операции== MPI_Send MPI_BSend -- использует для передачи сообщений выделенный пользователем нек...)
К следующему изменению →

Версия 18:10, 17 ноября 2007

Блокирующие операции

MPI_Send

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

минус: лишнее копирование

плюс: быстрая разблокировка данных

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

MPI_Rsend - посылка о готовности. Потенциально самый быстрый. Посылка начинается сразу, не проверяется дошел ли принимающий процесс до точки приема. Для того чтобы это было корректным пользователь должен гарантировать, что принмающийй процесс дошел до точки приема. Если это будет не так, то результат будет не предсказуемым.

Функция MPI_Send может быть реализована по разному, может использоват однуиз вышеперечисленных функций в зависимости от ситуации.

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

Неблокирующие операции

Неблокрующая посылка

MPI_Isend(void* buf, int count, MPI_Datatype, int dest, int msgtag, MPI_Comm comm, MPI_Recquest *req ) После вызова MPI_Isend инициализируется пересылка с соотв параметрами, и процесс не дожидается освобождения буфффера буф и идет выполнять программу дальше. По реку различаются разные неблокирующие операции.

MPI_Ibsend

MPI_Issend

MPI_Irsend


Неблокирующий прием

MPI_Irecv

Два отличия - нет аргумента VPI_Status status, вместо него MPI_Request*req. Мы инициализируем прием данных, идем дальше, а пототм можем по идентификатору рек узнаем принято ли уже сообщение ли нет.

Операции проверя.юще завершение неблокир операций

MPI_Wait(MPI_Request *req, MPI_Status *status) - если рек явл идент неблок приема, то дожидаемся приема и заолняем поля статус. Если рек было идент неблок посылки данных - просто дожидаемся неблокирующей посылки(дожидаемся пока сообщ не ушло).

MPI_Waitall --

MPI_Waitany -- завершение одного из реквестов из переданного массива Если к моменты вызова заверщено несколько опер. то из них будет выбрана одна случайным образом и для нее заполнена структура статус.

MPI_Waitsome -- Из набор неблок опер дожидаемся завершения одной. Если завершилось несколько -- то для всех заполнится структура статус.

Если мы не хотим дожидаться, а хотим только проверить

MPI_Test(MPI_Request * req, int * flag, MPI_Status *status) - проверям звершилась ли неблок опер, не дожидаемся ее завершения. Если оер завершилась. то в флаге будет 1. Если не завершилась -- в аргументе флаг будет 0.

MPI_Testall --

MPI_Testany

MPI_Testsome

Использование небло опер может ускорить программу -- процессор будет меньше ждть. Но для того чтобы так делат есть требование к архтектуре машины -- может ли компьютер одновременнно получать сообщения и работать с оперативной памятью. Проигрываем с оперативной память - ее спольщ=зование увеличивается за счет ожидающих процессов. Обычно так и бывает - за произв плятят областями оп. Чтобы мак прокдуктивно исп оперции неблок операций. Важно в программе ставлять неблокирующи прием.

Еще одна разновидность неблокрующх операций MPI_Send_Init -- аргументы такие же как у MPI_ISend . подготавл внутр структуры данных. MPI_Recv_Init -- но пересылка и прием не начинаются. Зачем это нужно? Сгруппировать вместе все нужные передачи. Дальше их можно стартовать функцией MPI_Startall(int count, MPI_Request *reqs) В дальнейшем с этими операциями можно работать так же как и раньше. Смысл в том что мы подготавливаем для нескольких опер внутр структуры пересылк и одной коммандой х стартуем. Это хорошо когда много мелких данных - эконоимим на латентности. Но может оказать плохо - если пересылки большие, то идет большая нагрузка на сеть, она может начать тормозить. Но еще один смысл - мы можем один раз подготовить данные, а потом несколько раз их посылать коммандой MPI_Startall.

Неблок опер помогают избегать тупиков. Еще один способ избегания тупиков -- в мпиае предусмотрена специальная функция, обеспечивающая одновременно блокирующие и посылку и прием сообщения -- MPI_Sendrecv. В ней гарантируется аппаратное разрешение тупиков.

Личные инструменты
Разделы