Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Processes - Metodicka (edited) with MPI - last....doc
Скачиваний:
59
Добавлен:
22.12.2018
Размер:
1.59 Mб
Скачать

Работа с квитанциями.

Библиотека MPI предоставляет целое семейство функций, с помощью которых процесс, инициировавший одну или несколько асинхронных операций приема/передачи сообщений, может узнать о статусе их выполнения. Самыми простыми из этих функций являются MPI_Wait() и MPI_Test():

#include <mpi.h>

int MPI_Wait(MPI_Request *request, MPI_Status *status);

int MPI_Test(MPI_Request *request, int *flag, MPI_Status *status);

Функция MPI_Wait() вернет управление лишь тогда, когда операция приема/передачи сообщения, соответствующая квитанции, переданной в параметре request, будет завершена (для операции отсылки, инициированной функцией MPI_Ibsend() это означает, что данные были скопированы в специально отведенный буфер). При этом для операции приема сообщения в структуре, на которую указывает параметр status, возвращается информация о полученном сообщении, аналогично тому, как это делается в MPI_Recv(). После возврата из функции MPI_Wait() для операции отсылки сообщения процесс может повторно использовать буфер, содержавший тело отосланного сообщения, а для операции приема сообщения гарантируется, что после возврата из MPI_Wait() в буфере для приема находится тело принятого сообщения.

Для того, чтобы узнать, завершена ли та или иная операция приема/передачи сообщения, но избежать блокирования в том случае, если операция еще не завершилась, служит функция MPI_Test(). В параметре flag ей передается адрес целочисленной переменной, в которой будет возвращено ненулевое значение, если операция завершилась, и нулевое в противном случае. В случае, если квитанция соответствовала операции приема сообщения, и данная операция завершилась, MPI_Test() заполняет структуру, на которую указывает параметр status, информацией о принятом сообщении.

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

#include <mpi.h>

int MPI_Waitany(int count, MPI_Request *array_of_requests, int *index, MPI_Status *status);

int MPI_Testany(int count, MPI_Request *array_of_requests, int *index, int *flag, MPI_Status *status);

int MPI_Waitsome(int count, MPI_Request *array_of_requests, int *outcount, int *array_of_indices, MPI_Status *array_of_statuses);

int MPI_Testsome(int count, MPI_Request *array_of_requests, int *outcount, int *array_of_indices, MPI_Status *array_of_statuses);

int MPI_Waitall(int count, MPI_Request *array_of_requests, MPI_Status *array_of_statuses);

int MPI_Testall(int count, MPI_Request *array_of_requests, int *flag, MPI_Status *array_of_statuses);

Все эти функции получают массив квитанций в параметре array_of_requests и его длину в параметре count. Функция MPI_Waitany() блокируется до тех пор, пока не завершится хотя бы одна из операций, описываемых переданными квитанциями. Она возвращает в параметре index индекс квитанции для завершившейся операции в массиве array_of_requests и, в случае, если завершилась операция приема сообщения, заполняет структуру, на которую указывает параметр status, информацией о полученном сообщении. MPI_Testany() не блокируется, а возвращает в переменной, на которую указывает параметр flag, ненулевое значение, если одна из операций завершилась. В этом случае она возвращает в параметрах index и status то же самое, что и MPI_Waitany().

Отметим, что если несколько операций из интересующего множества завершаются одновременно, то и MPI_Waitany(), и MPI_Testany() возвращают индекс и статус лишь одной из них, выбранной случайным образом. Более эффективным вариантом в таком случае является использование соответственно MPI_Waitsome() и MPI_Testsome(): их поведение аналогично MPI_Waitany() и MPI_Testany() за тем исключением, что в случае, если одновременно завершается несколько операций, они возвращают статус для всех завершившихся операций. При этом в параметре outcount возвращается количество завершившихся операций, в параметре array_of_indices – индексы квитанций завершившихся операций в исходном массиве квитанций, а массив array_of_statuses содержит структуры типа MPI_Status, описывающие принятые сообщения (значения в массиве array_of_statuses имеют смысл только для операций приема сообщения). Отметим, что у функции MPI_Testany() нет параметра flag – вместо этого, она возвращает 0 в параметре outcount, если ни одна из операций не завершилась.

Функция MPI_Waitall() блокируется до тех пор, пока не завершатся все операции, квитанции для которых были ей переданы, и заполняет информацию о принятых сообщениях для операций приема сообщения в элементах массива array_of_statuses (при этом i-й элемент массива array_of_statuses соответствует операции, квитанция для которой была передана в i-м элементе массива array_of_requests). Функция MPI_Testall() возвращает ненулевое значение в переменной, адрес которой указан в параметре flag, если завершились все операции квитанции для которых были ей переданы, и нулевое значение в противном случае. При этом, если все операции завершились, она заполняет элементы массива array_of_statuses аналогично тому, как это делает MPI_Waitall().

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]