Руководство по MPI (547935), страница 2
Текст из файла (страница 2)
Сложный тип аргументов MPI_Init предусмотрен для того, чтобы передавать всем процессам аргументы main:
int main(int argc, char** argv)
{
MPI_Init(&argc, &argv);
...
MPI_Finalize();
}
Процедура MPI_Comm_size
Формат процедуры:
int MPI_Comm_size(MPI_Comm comm, int* size), где
-
comm - идентификатор группы;
-
OUT size - размер группы.
Данная процедура обеспечивает определение общего числа параллельных процессов в группе comm.
Процедура MPI_Comm_rank
Формат процедуры:
int MPI_Comm_rank(MPI_comm comm, int* rank), где
-
comm - идентификатор группы;
-
OUT rank - номер вызывающего процесса в группе comm.
Данная процедура обеспечивает определение номера процесса в группе comm. Значение, возвращаемое по адресу &rank, лежит в диапазоне от 0 до size_of_group-1.
Процедура MPI_Wtime
Формат процедуры:
double MPI_Wtime(void)
Данная процедура возвращает астрономическое время в секундах (вещественное число), прошедшее с некоторого момента в прошлом. Гарантируется, что этот момент не будет изменен за время существования процесса.
-
Процедуры приема / передачи сообщений
Процедуры данной группы составляют основу взаимодействия процессов. Базовым механизмом связи между процессами в MPI является посылка и прием сообщений. Основными функциями, обеспечивающими связь “точка-точка” являются операторы send и receive.
Процедура MPI_Send
Формат процедуры:
int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int msgtag, MPI_Comm comm), где
-
buf - адрес начала буфера посылки сообщения;
-
count - число передаваемых элементов в сообщении;
-
datatype - тип передаваемых элементов;
-
dest - номер процесса-получателя;
-
msgtag - идентификатор сообщения;
-
comm - идентификатор группы.
Данная процедура осуществляет блокирующую посылку сообщения с идентификатором msgtag, состоящего из count элементов типа datatype, процессу с номером dest. Все элементы сообщения расположены подряд в буфере buf. Значение count может быть нулем. Тип передаваемых элементов datatype должен указываться с помощью предопределенных констант типа.
Разрешается передавать сообщение самому себе.
Блокировка гарантирует корректность повторного использования всех параметров после возврата из подпрограммы. Выбор способа осуществления этой гарантии: копирование в промежуточный буфер или непосредственная передача процессу dest, остается за MPI. Следует специально отметить, что возврат из подпрограммы MPI_Send не означает ни того, что сообщение уже передано процессу dest, ни того, что сообщение покинуло процессорный элемент, на котором выполняется процесс, выполнивший MPI_Send.
Процедура MPI_Recv
Формат процедуры:
int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int msgtag, MPI_comm comm, 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, то первым будет принято то сообщение, которое было отправлено раньше.
Процедура MPI_Get_Count
Формат процедуры:
int MPI_Get_Count(MPI_Status *status, MPI_Datatype datatype, int *count), где
-
status - параметры принятого сообщения;
-
datatype - тип элементов принятого сообщения;
-
OUT count - число элементов сообщения.
По значению параметра status данная процедура определяет число уже принятых (после обращения к MPI_Recv) или принимаемых (после обращения к MPI_Probe или MPI_IProbe) элементов сообщения типа datatype.
Процедура MPI_Probe
Формат процедуры:
int MPI_Probe( int source, int msgtag, MPI_Comm comm, MPI_Status *status), где
-
source - номер процесса-отправителя или MPI_ANY_SOURCE;
-
msgtag - идентификатор ожидаемого сообщения или MPI_ANY_TAG;
-
comm - идентификатор группы;
-
OUT status - параметры обнаруженного сообщения.
Данная процедура обеспечивает получение информации о структуре ожидаемого сообщения с блокировкой. Возврата из подпрограммы не произойдет до тех пор, пока сообщение с подходящим идентификатором и номером процесса-отправителя не будет доступно для получения. Атрибуты доступного сообщения можно определить обычным образом с помощью параметра status. Следует обратить внимание, что подпрограмма определяет только факт прихода сообщения, но реально его не принимает.
Процедура MPI_Isend
Формат процедуры:
int MPI_ISend(void *buf, int count, MPI_Datatype datatype, int dest, int msgtag, MPI_Comm comm, 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.
Процедура MPI_Irecv
Формат процедуры:
int MPI_IRecv(void *buf, int count, MPI_Datatype datatype, int source, int msgtag, MPI_comm comm, MPI_Request *request), где
-
OUT buf - адрес начала буфера приема сообщения;
-
count - максимальное число элементов в принимаемом сообщении;
-
datatype - тип элементов принимаемого сообщения;
-
source - номер процесса-отправителя;
-
msgtag - идентификатор принимаемого сообщения;
-
comm - идентификатор группы;
-
OUT request - идентификатор асинхронного приема сообщения.
Данная процедура осуществляет прием сообщения, аналогичный MPI_Recv, однако возврат из процедуры происходит сразу после инициализации процесса приема без ожидания получения сообщения в буфере buf. Окончание процесса приема можно определить с помощью параметра request и процедур MPI_Wait и MPI_Test.
Процедура MPI_Wait
Формат процедуры:
int MPI_Wait(MPI_Request *request, MPI_Status *status), где
-
request - идентификатор асинхронного приема или передачи;
-
OUT status - параметры сообщения.
Процедура осуществляет ожидание завершения асинхронных процедур MPI_ISend или MPI_IRecv, ассоциированных с идентификатором request. В случае приема, атрибуты и длину полученного сообщения можно определить обычным образом с помощью параметра status.
Процедура MPI_WaitAll
Формат процедуры:
int MPI_WaitAll(int count, MPI_Request *requests, MPI_Status *statuses), где
-
count - число идентификаторов;
-
requests - массив идентификаторов асинхронного приема или передачи;
-
OUT statuses - параметры сообщений.
Выполнение процесса блокируется до тех пор, пока все операции обмена, ассоциированные с указанными идентификаторами, не будут завершены. Если во время одной или нескольких операций обмена возникли ошибки, то поле ошибки в элементах массива statuses будет установлено в соответствующее значение.
Процедура MPI_WaitAny
Формат процедуры:
int MPI_WaitAny(int count, MPI_Request *requests, int *index, MPI_Status *status), где
-
count - число идентификаторов;
-
requests - массив идентификаторов асинхронного приема или передачи;
-
OUT index - номер завершенной операции обмена;
-
OUT status - параметры сообщений.
Выполнение процесса блокируется до тех пор, пока какая-либо операция обмена, ассоциированная с указанными идентификаторами, не будет завершена. Если несколько операций могут быть завершены, то случайным образом выбирается одна из них. Параметр index содержит номер элемента в массиве requests, содержащего идентификатор завершенной операции.
Процедура MPI_WaitSome
Формат процедуры:
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 содержат параметры завершенных операций.
Процедура MPI_Test
Формат процедуры:
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.
Процедура MPI_TestAll
Формат процедуры:
int MPI_TestAll( int count, MPI_Request *requests, int *flag, MPI_STatus *statuses), где
-
count - число идентификаторов;
-
requests - массив идентификаторов асинхронного приема или передачи;
-
OUT flag - признак завершенности операций обмена;
-
OUT statuses - параметры сообщений.
В результате выполнения данной процедуры, параметр flag возвращается значение 1, если все операции, ассоциированные с указанными идентификаторами, завершены (с указанием параметров сообщений в массиве statuses). В противном случае возвращается 0, а элементы массива statuses не определены.
Процедура MPI_TestAny
Формат процедуры:
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 - параметры сообщения.