int MPI_Sendrecv (void* sendbuffer, int sendcount, MPI_Datatype senddatatype, int dest, int sendtag, void* recvbuffer, int recvcount, MPI_Datatype recvdatatype, int src, int recvtag MPI_Comm comm, MPI_Status* status), где
• sendbuffer – адрес массива передаваемых данных;
• sendcount – количество элементов в массиве;
• senddatatype – тип передаваемых элементов;
• dest – ранг адресата;
• sendtag – тег передаваемого сообщения;
• recvbuffer – адрес буфера для приема;
• recvcount – количество элементов в буфере приема;
• recvdatatype – тип элементов в буфере приема;
• src – ранг источника;
• recvtag – тег принимаемого сообщения;
• comm – коммуникатор;
• status – структура с дополнительной информацией.
Функция копирует данные из массива sendbuffer процесса с рангом
src в буфер recvbuffer процесса с рангом dest.
Другая полезная функция:
int MPI_Sendrecv_replace (void* buffer, int count, MPI_Datatype datatype, int dest, int sendtag, int src, int recvtag MPI_Comm comm, MPI_Status* status). Использует только один буфер, также передавая данные с процесса
src на процесс dest.
2.5 Коллективные взаимодействия процессов В операциях коллективного взаимодействия процессов участвуют
все процессы коммуникатора. Соответствующая процедура должна быть
вызвана каждым процессом, быть может, со своим набором параметров.
Возврат из процедуры коллективного взаимодействия может произойти в
тот момент, когда участие процесса в данной операции уже закончено.
Как и для блокирующих процедур, возврат означает то, что разрешен
свободный доступ к буферу приема или посылки. Асинхронных
коллективных операций в MPI нет [5].
В
коллективных
операциях
можно
использовать
те
же
коммуникаторы, что и были использованы для операций типа точка-точка.
MPI гарантирует, что сообщения, вызванные коллективными операциями,
никак не повлияют на выполнение других операций и не пересекутся с
21
сообщениями,
появившимися
в
результате
индивидуального
взаимодействия процессов.
Нельзя рассчитывать на синхронизацию процессов с помощью
коллективных операций. Если какой-то процесс уже завершил свое
участие в коллективной операции, то это не означает ни того, что данная
операция завершена другими процессами коммуникатора, ни того, что она
ими начата.
В коллективных операциях не используются идентификаторы
сообщений.