2006 Ответы на экзаменационные вопросы по ПОД (Lilalbrother) (1186034), страница 12
Текст из файла (страница 12)
Разрешаетсяпередавать сообщение самому себе.Блокировка гарантирует корректность повторного использования всех параметровпосле возврата из подпрограммы. Выбор способа осуществления этой гарантии:копирование в промежуточный буфер или непосредственная передача процессу dest,остается за MPI. Следует специально отметить, что возврат из подпрограммы MPI_Sendне означает ни того, что сообщение уже передано процессу dest, ни того, что сообщениепокинуло процессорный элемент, на котором выполняется процесс, выполнившийMPI_Send.int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int msgtag, MPI_Commcomm, MPI_Status *status)OUT buf - адрес начала буфера приема сообщенияcount - максимальное число элементов в принимаемом сообщенииdatatype - тип элементов принимаемого сообщенияsource - номер процесса-отправителяmsgtag - идентификатор принимаемого сообщенияcomm - идентификатор группыOUT status - параметры принятого сообщенияПрием сообщения с идентификатором msgtag от процесса source с блокировкой.Число элементов в принимаемом сообщении не должно превосходить значения count.Если число принятых элементов меньше значения count, то гарантируется, что в буфереbuf изменятся только элементы, соответствующие элементам принятого сообщения.
Еслинужно узнать точное число элементов в сообщении, то можно воспользоватьсяподпрограммой MPI_Probe.Блокировка гарантирует, что после возврата из подпрограммы все элементысообщения приняты и расположены в буфере buf.В качестве номера процесса-отправителя можно указать предопределенную константуMPI_ANY_SOURCE - признак того, что подходит сообщение от любого процесса. Вкачестве идентификатора принимаемого сообщения можно указать константуMPI_ANY_TAG - признак того, что подходит сообщение с любым идентификатором.Если процесс посылает два сообщения другому процессу и оба эти сообщениясоответствуют одному и тому же вызову MPI_Recv, то первым будет принято тосообщение, которое было отправлено раньше.int MPI_Get_count( MPI_Status *status, MPI_Datatype datatype, int *count)status - параметры принятого сообщенияdatatype - тип элементов принятого сообщенияOUT count - число элементов сообщенияПо значению параметра status данная подпрограмма определяет число ужепринятых (после обращения к MPI_Recv) или принимаемых (после обращения кMPI_Probe или MPI_Iprobe) элементов сообщения типа datatype.int MPI_Probe( int source, int msgtag, MPI_Comm comm, MPI_Status *status)source - номер процесса-отправителя или MPI_ANY_SOURCEmsgtag - идентификатор ожидаемого сообщения или MPI_ANY_TAGcomm - идентификатор группыOUT status - параметры обнаруженного сообщенияПолучение информации о структуре ожидаемого сообщения с блокировкой.Возврата из подпрограммы не произойдет до тех пор, пока сообщение с подходящимидентификатором и номером процесса-отправителя не будет доступно для получения.Атрибуты доступного сообщения можно определить обычным образом с помощьюпараметра status.
Следует обратить внимание, что подпрограмма определяет только фактприхода сообщения, но реально его не принимает.Прием/передача сообщений без блокировкиint MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dest, int msgtag, MPI_Commcomm, MPI_Request *request)buf - адрес начала буфера посылки сообщенияcount - число передаваемых элементов в сообщенииdatatype - тип передаваемых элементовdest - номер процесса-получателяmsgtag - идентификатор сообщенияcomm - идентификатор группыOUT request - идентификатор асинхронной передачиПередача сообщения, аналогичная MPI_Send, однако возврат из подпрограммыпроисходит сразу после инициализации процесса передачи без ожидания обработки всегосообщения, находящегося в буфере buf.
Это означает, что нельзя повторно использоватьданный буфер для других целей без получения дополнительной информации озавершении данной посылки. Окончание процесса передачи (т.е. того момента, когдаможно переиспользовать буфер buf без опасения испортить передаваемое сообщение)можно определить с помощью параметра request и процедур MPI_Wait и MPI_Test.Сообщение, отправленное любой из процедур MPI_Send и MPI_Isend, может бытьпринято любой из процедур MPI_Recv и MPI_Irecv.int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source, int msgtag, MPI_Commcomm, MPI_Request *request)OUT buf - адрес начала буфера приема сообщенияcount - максимальное число элементов в принимаемом сообщенииdatatype - тип элементов принимаемого сообщенияsource - номер процесса-отправителяmsgtag - идентификатор принимаемого сообщенияcomm - идентификатор группыOUT request - идентификатор асинхронного приема сообщенияПрием сообщения, аналогичный MPI_Recv, однако возврат из подпрограммыпроисходит сразу после инициализации процесса приема без ожидания получениясообщения в буфере buf.
Окончание процесса приема можно определить с помощьюпараметра request и процедур MPI_Wait и MPI_Test.int MPI_Wait( MPI_Request *request, MPI_Status *status)request - идентификатор асинхронного приема или передачиOUT status - параметры сообщенияОжидание завершения асинхронных процедур MPI_Isend или MPI_Irecv,ассоциированных с идентификатором request. В случае приема, атрибуты и длинуполученного сообщения можно определить обычным образом с помощью параметраstatus.int MPI_Waitall( int count, MPI_Request *requests, MPI_Status *statuses)count - число идентификаторовrequests - массив идентификаторов асинхронного приема или передачиOUT statuses - параметры сообщенийВыполнение процесса блокируется до тех пор, пока все операции обмена,ассоциированные с указанными идентификаторами, не будут завершены.
Если во времяодной или нескольких операций обмена возникли ошибки, то поле ошибки в элементахмассива statuses будет установлено в соответствующее значение.int MPI_Waitany( int count, MPI_Request *requests, int *index, MPI_Status *status)count - число идентификаторовrequests - массив идентификаторов асинхронного приема или передачиOUT index - номер завершенной операции обменаOUT status - параметры сообщенийВыполнение процесса блокируется до тех пор, пока какая-либо операция обмена,ассоциированная с указанными идентификаторами, не будет завершена. Если несколькоопераций могут быть завершены, то случайным образом выбирается одна из них.Параметр index содержит номер элемента в массиве requests, содержащего идентификаторзавершенной операции.int MPI_Waitsome( int incount, MPI_Request *requests, int *outcount, int *indexes, MPI_Status*statuses)incount - число идентификаторовrequests - массив идентификаторов асинхронного приема или передачиOUT outcount - число идентификаторов завершившихся операций обменаOUT indexes - массив номеров завершившихся операции обменаOUT statuses - параметры завершившихся сообщенийВыполнение процесса блокируется до тех пор, пока по крайней мере одна изопераций обмена, ассоциированных с указанными идентификаторами, не будетзавершена.
Параметр outcount содержит число завершенных операций, а первые outcountэлементов массива indexes содержат номера элементов массива requests с ихидентификаторами. Первые outcount элементов массива statuses содержат параметрызавершенных операций.int MPI_Test( MPI_Request *request, int *flag, MPI_Status *status)request - идентификатор асинхронного приема или передачиOUT flag - признак завершенности операции обменаOUT status - параметры сообщенияПроверка завершенности асинхронных процедур MPI_Isend или MPI_Irecv,ассоциированных с идентификатором request. В параметре flag возвращает значение 1,если соответствующая операция завершена, и значение 0 в противном случае. Еслизавершена процедура приема, то атрибуты и длину полученного сообщения можноопределить обычным образом с помощью параметра status.int MPI_Testall( int count, MPI_Request *requests, int *flag, MPI_Status *statuses)count - число идентификаторовrequests - массив идентификаторов асинхронного приема или передачиOUT flag - признак завершенности операций обменаOUT statuses - параметры сообщенийВ параметре flag возвращает значение 1, если все операции, ассоциированные суказанными идентификаторами, завершены (с указанием параметров сообщений вмассиве statuses).
В противном случае возвращается 0, а элементы массива statusesнеопределены.int MPI_Testany(int count, MPI_Request *requests, int *index, int *flag, MPI_Status *status)count - число идентификаторовrequests - массив идентификаторов асинхронного приема или передачиOUT index - номер завершенной операции обменаOUT flag - признак завершенности операции обменаOUT status - параметры сообщенияЕсли к моменту вызова подпрограммы хотя бы одна из операций обменазавершилась, то в параметре flag возвращается значение 1, index содержит номерсоответствующего элемента в массиве requests, а status - параметры сообщения.int MPI_Testsome( int incount, MPI_Request *requests, int *outcount, int *indexes, MPI_Status*statuses)incount - число идентификаторовrequests - массив идентификаторов асинхронного приема или передачиOUT outcount - число идентификаторов завершившихся операций обменаOUT indexes - массив номеров завершившихся операции обменаOUT statuses - параметры завершившихся операцийДанная подпрограмма работает так же, как и MPI_Waitsome, за исключением того,что возврат происходит немедленно.
Если ни одна из указанных операций незавершилась, то значение outcount будет равно нулю.int MPI_Iprobe( int source, int msgtag, MPI_Comm comm, int *flag, MPI_Status *status)source - номер процесса-отправителя или MPI_ANY_SOURCEmsgtag - идентификатор ожидаемого сообщения или MPI_ANY_TAGcomm - идентификатор группыOUT flag - признак завершенности операции обменаOUT status - параметры обнаруженного сообщенияПолучение информации о поступлении и структуре ожидаемого сообщения безблокировки. В параметре flag возвращает значение 1, если сообщение с подходящимиатрибутами уже может быть принято (в этом случае ее действие полностью аналогичноMPI_Probe), и значение 0, если сообщения с указанными атрибутами еще нет.34.
MPI: различные виды операторов Send.int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int msgtag, MPI_Commcomm)buf - адрес начала буфера посылки сообщенияcount - число передаваемых элементов в сообщенииdatatype - тип передаваемых элементовdest - номер процесса-получателяmsgtag - идентификатор сообщенияcomm - идентификатор группыБлокирующая посылка сообщения с идентификатором msgtag, состоящего из countэлементов типа datatype, процессу с номером dest.