· инициализация обмена;
· проверка завершения обмена.
Для маркировки этих шагов в неблокирующих операциях используются идентификаторы операций обмена (requests).
Неблокирующую передачу можно выполнять в четырех режимах, аналогичных тем, которые присущи и блокирующим передачам: стандартной, буферизованной, синхронной и по готовности. Передача в каждом режиме начинается независимо от того, был ли зарегистрирован соответствующий прием. Во всех случаях операция начала передачи локальна и завершается сразу же и независимо от состояния других процессов.
Объявление и формальные параметры неблокирующих подпрограмм для каждого из четырех названных режимов отличаются в основном префиксами в имени подпрограммы.
Неблокирующая стандартная передача с выходным параметром 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.
В неблокирующем режиме проверка фактического выполнения передачи или приема осуществляется с помощью вызова подпрограмм ожидания, которые блокируют работу процесса до завершения операции, или путем вызова неблокирующих подпрограмм проверки, которые возвращают логическое значение true, если операция выполнена.
Подпрограмма MPI_Wait блокирует работу процесса до завершения приема или передачи сообщения:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.