Параллельное программирование: Учебное пособие, страница 97

·  инициализация обмена;

·  проверка завершения обмена.

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

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

5.2.8  Инициализация неблокирующего обмена

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

Неблокирующая стандартная передача с выходным параметром request (запрос), являющимся идентификатором операции, объявлена строкой:

int MPI_Isend(void *buf, int count, MPI_Datatype

datatype, int dest, int tag, MPI_Comm comm,

MPI_Request *request)

Инициализация неблокирующей синхронной передачи данных осуществляется подпрограммой MPI_Issend:

int MPI_Issend(void *buf, int count, MPI_Datatype

datatype, int dest, int tag, MPI_Comm comm,

MPI_Request *request)

Неблокирующая буферизованная передача сообщения выполняется подпрограммой MPI_Ibsend:

int MPI_Ibsend(void *buf, int count, MPI_Datatype

datatype, int dest, int tag, MPI_Comm comm,

MPI_Request *request)

Подпрограмма MPI_Irsend выполняет неблокирующую передачу по готовности:

int MPI_Irsend(void *buf, int count, MPI_Datatype

datatype, int dest, int tag, MPI_Comm comm,

MPI_Request *request)

Параметры всех подпрограмм неблокирующей передачи совпадают:

·  buf– идентификатор буфера;

·  count— количество отправляемых данных и объем буфера приема;

·  datatype— тип данных в буфере приема и передачи;

·  dest— ранг адресата;

·  tag— тег передаваемого сообщения;

·  comm— коммуникатор.

Неблокирующий прием начинает подпрограмма  MPI_Irecv:

int MPI_Irecv(void *buf, int count, MPI_Datatype

datatype, int source, int tag, MPI_Comm comm,

MPI_Request *request)

Назначение аргументов здесь такое же, как и в предыдущих подпрограммах, за исключением того, что указывается ранг не адресата, а источника сообщения (source).

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

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

Среди запросов, появляющихся при обменах сообщениями, можно выделить, так называемый, пустой запрос, который инициируется подпрограммой MPI_REQUEST_NULL. Отложенный запрос на выполнение операции обмена называют неактивным, если он не связан ни с каким исходящим сообщением. Пустым называют статус, поле тега которого принимает значение MPI_ANY_TAG, поле источника сообщения — MPI_ANY_SOURCE, а вызовы подпрограмм MPI_Get_count и MPI_Get_elements возвращают нулевое значение аргумента count.

5.2.9  Проверка выполнения обмена

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

Подпрограмма MPI_Wait блокирует работу процесса до завершения приема или передачи сообщения: