Вордовские лекции (1115151), страница 28
Текст из файла (страница 28)
MPI_Recv( floatData, ELEMS( floatData ), MPI_FLOAT,
0, tagFloatData, MPI_COMM_WORLD, &status );
MPI_Get_count( &status, MPI_FLOAT, &count );
}
/* Обе задачи завершают выполнение */
MPI_Finalize();
return 0;
}
Приложение.
Коллективные функции:
Общие функции
int MPI_Init( int* argc, char*** argv)
int MPI_Finalize( void )
int MPI_Comm_size( MPI_Comm comm, int* size)
int MPI_Comm_rank( MPI_comm comm, int* rank)
double MPI_Wtime(void)
int MPI_Barrier( MPI_Comm comm)
9.2.16Прием-передача - базовые
int MPI_{I}Send(void* buf, int count, MPI_Datatype datatype, int dest, int msgtag, MPI_Comm comm{, MPI_Request *request})
buf - адрес начала буфера посылки сообщения
count - число передаваемых элементов в сообщении
datatype - тип передаваемых элементов
dest - номер процесса-получателя
msgtag - идентификатор сообщения
comm - идентификатор группы
int MPI_{I}Recv(void* buf, int count, MPI_Datatype datatype, int source, int msgtag, MPI_comm comm, MPI_Status *status{, MPI_Request *request})
buf - адрес начала буфера приема сообщения
count - максимальное число элементов в принимаемом сообщении
datatype - тип элементов принимаемого сообщения
source - номер процесса-отправителя
msgtag - идентификатор принимаемого сообщения
comm - идентификатор группы
status - параметры принятого сообщения
int MPI_Probe( int source, int msgtag, MPI_Comm comm, MPI_Status *status)
source - номер процесса-отправителя или MPI_ANY_SOURCE
msgtag - идентификатор ожидаемого сообщения или MPI_ANY_TAG
comm - идентификатор группы
status - параметры обнаруженного сообщения
int MPI_Get_Count( MPI_Status *status, MPI_Datatype datatype, int *count)
status - параметры принятого сообщения
datatype - тип элементов принятого сообщения
count - число элементов сообщения
Пример:
MPI_Probe( MPI_ANY_SOURCE, tagMessageInt, MPI_COMM_WORLD, &status );
MPI_Get_count( &status, MPI_INT, &bufElems );
buf = malloc( sizeof(int) * bufElems );
MPI_Recv( buf, bufElems, MPI_INT, ...
Асинхронные прием-передача: действия с квитанциями
int MPI_Wait( MPI_Request *request, MPI_Status *status)
int MPI_WaitAll( int count, MPI_Request *requests, MPI_Status *statuses)
int MPI_WaitAny( int count, MPI_Request *requests, int *index, MPI_Status *status)
int MPI_WaitSome( int incount, MPI_Request *requests, int *outcount, int *indexes, MPI_Status *statuses)
int MPI_Test( MPI_Request *request, int *flag, MPI_Status *status)
int MPI_TestAll( int count, MPI_Request *requests, int *flag, MPI_STatus *statuses)
int MPI_TestAny(int count, MPI_Request *requests, int *index, int *flag, MPI_Status *status)
int MPI_TestSome( int incount, MPI_Request *requests, int *outcount, int *indexes, MPI_Status *statuses)
Объединение запросов
int MPI_Send_Init( void *buf, int count, MPI_Datatype datatype, int dest, int msgtag, MPI_Comm comm, MPI_Request *request)
int MPI_Recv_Init( void *buf, int count, MPI_Datatype datatype, int source, int msgtag, MPI_Comm comm, MPI_Request *request)
MPI_Start_All( int count, MPI_Request *requests)
1 Эти процессы создается во время начальной загрузки системы, механизм которой будет рассмотрен ниже
2 Следует заметить, что в разных версиях UNIX имена сигналов могут различаться.
3 это правило не является обязательным, но для корректной организации двустороннего обмена через один канал требуется дополнительная синхронизация
4 Заметим, что данный аргумент может принимать не только указанные два значения, например, тип сокета SOCK_SEQPACKET обозначает соединение с установлением виртуального канала со всеми вытекающими отсюда свойствами, но при этом сохраняются границы сообщений; однако данный тип сокетов не поддерживается ни в домене AF_UNIX, ни в домене AF_INET, поэтому мы его здесь рассматривать не будем
5 Отметим, что, как уже говорилось, при использовании сокетов с установлением виртуального соединения границы сообщений не сохраняются, поэтому приложение, принимающее сообщения, может принимать данные совсем не теми же порциями, какими они были посланы. Вся работа по интерпретации сообщений возлагается на приложение.