Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_MPI_OpenMP.doc
Скачиваний:
11
Добавлен:
16.11.2019
Размер:
1.09 Mб
Скачать

Int mpi_Get_count(mpi_Status *status, mpi_Datatype datatype, int *count)

Семантика парного обмена между процессами

Очередность. Сообщения не обгоняют друг друга: если отправитель последовательно посылает два сообщения в один адрес, то они должны быть приняты в том же порядке. Если получатель выполняет два приема последовательно и оба соответствуют тому же сообщению, то вторая операция не будет принимать это сообщение, если первая операция все еще не выполнена. Это требование облегчает установление соответствия посылки и приема. Если процесс имеет однопоточное исполнение, тогда любые два обмена, выполняемые этим процессом, упорядочены.

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

Однозначность выполнения коммуникаций в MPI должен обеспечить программист. Предположим, что посылка инициирована. Тогда возможно, что процесс-получатель повторно инициирует прием, соответствующий этой посылке, хотя сообщение все еще не принято, поскольку оно всякий раз обгоняется другим сообщением, посланным другим источником. Аналогично предположим, что прием был установлен многопоточным процессом. Тогда возможно, что сообщения, соответствующие этому приему, принимаются повторно, хотя прием все еще не закрыт, поскольку он обгоняется другими приемами, установленными на этом узле. Предупредить зависание в такой ситуации является обязанностью программиста.

Ограничение по ресурсам. Любое выполнение операций обмена предполагает наличие ресурсов, которые могут быть ограниченными.

Может иметь место ошибка, когда недостаток ресурсов ограничивает выполнение вызова.

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

Source = destination допускается: процесс может послать сообщение самому себе. В этом случае вызвать операции необходимо только в следующей последовательности:

MPI_Send(); MPI_Recv(); иначе возникнет ситуация взаимоблокировки.

Описание блокирующих операций и режимы связи

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

  1. Стандартный режим передачи

Функции передачи/приема MPI_Send(….) и MPI_Recv(…..). В этом режиме MPI сам решает надо или не надо буферизировать передачу сообщений. Блокирующая операция с буферизацией, может начинать выполнять следующую посылку при перемещении пересылаемой информации в выделенный буфер, даже если не выставлен соответствующий запрос от принимающего процесса. Блокирующая операция без буферизации, может начинать выполнять следующую посылку, только если будет выставлен соответствующий запрос на прием, и данные поступят в буфер принимающего процесса.