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

Лекции / Лекция 11

.odt
Скачиваний:
29
Добавлен:
06.07.2016
Размер:
68.73 Кб
Скачать

Технологии и методы программирования. Лекция 11.

Режимы обмена сообщениями.

MPI_Barrier(MPI_Comm comm) определяет синхронизацию. Процесс, достигая этой команды, сообщает об этом и останавливается, ожидая аналогичного сообщения от всех других процессоров.

MPI_Send использует стандартный режим передачи сообщений. После вызова MPI_Send процесс-отправитель приостанавливается. Существует два варианта использования функции: с системным (минимальная приостановка, если только не переполнен/занят) буфером и без него. Эти варианты реализуются функциями MPI_Ssend - режим синхронизации, буфер отстутсвует, надёжен, но медленен - и MPI_Bsend - с буфером, но не системным. Буфер нужно создать, привязать к процесу, использовать, отвязать, а затем освободить. MPI_Buffer_attach(void buf, int size) – привязка буфера, MPI_Buffer_deattach(void *buf, int *size) — отвязка. Рекомендуется длинные сообщения передавать через MPI_Ssend, а малые — через MPI_Bsend. Также существует MPI_Rsend(...) - самый быстрый способ, передача сообщений по готовности. При этом сообщение передаётся тогда и только тогда, когда до начала передачи другой процесс уже вызвал функцию приёма, иначе вызывается ошибка.

Для всех вышеперечисленных функций возможны задержки отправки/получения. Может возникнуть ситуация взаимоблокировки. Её разрешение зависит от реализации MPI. Возможен третий процесс, перехватывающий блокирующие сообщения.

Для обмена без остановок используются асинхронные сообщения. Так работает функция MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request). Для Bsend, Rsend, Ssend также существуют асинхронные аналоги. При этом request — дескриптор, с помощью которого отправитель может получить информацию об обработки его сообщения тогда, когда обработка будет произведена. Проверка осуществляется функцией MPI_Test( MPI_Request *request, int flag, MPI_Status *status), которая присваивает флагу единицу в случае, если сообщение было обработано. Status определяется только в этом случае. При этом функция тестирования неблокирующая. Для приостановки процесса до момента обработки его сообщения принимающим используется MPI_Wait( MPI_Request *request, int flag, MPI_Status *status).

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

Создание и использование коммуникаторов.

Разные коммуникаторы нужны для моделирования разных топологий кластеров. Напомним, что коммуникатор это группа процессов и контекст их выполнения. Всегда присутствуют коммуникаторы MPI_COMM_WORLD и MPI_COMM_SELF. Для создания других используется функция, разделяющая коммуникатор: MPI_Comm_split(MPI_Comm oldcomm, int split, int key, MPI_Comm *yourcomm), где key — ранг процесса в новом коммуникаторе. Эта функция должна вызываться для всех процессов. Если какой-либо процесс не включён в разделение, то split=MPI_Undefined. После окончания использования коммуникатора его ресурсы освобождаются с помощью MPI_Comm_free(MPI_Comm comm).

Соседние файлы в папке Лекции