26
• senddatatype – тип передаваемых данных;
• recbuf – буфер для приема данных;
• reccount – размер буфера recbuf;
• recdatatype – тип данных для приемки;
• root – ранг процесса, на котором собираются данные;
• comm – коммуникатор.
Посредством
MPI_Gather каждый процесс в коммуникаторе
передает данные из буфера sendbuf на процесс с рангом root. Этот
"ведущий" процесс осуществляет склейку поступающих данных в буфере
recbuf. Склейка данных осуществляется линейно, положение пришедшего
фрагмента данных
определяется рангом процесса, его приславшего. В
целом процедура
MPI_Gather обратна по своему действию процедуре
MPI_Scatter.
Следует
заметить, что при использовании
MPI_Gather сборка
осуществляется только на одном процессе. Во
всех остальных процессах
заполнение буфера recbuf не определено. Для некоторых задач
необходимо, чтобы данные, рассчитанные на каждом из
процессов, были
собраны в единый объект опять же на каждом процессе. В таком случае,
вместо
функции
MPI_Gather
следует
использовать
функцию
MPI_Allgather.
При использовании функции MPI_Allgather на всех
процессах в буфере recbuf будут собраны одинаковые данные - "большой"
объект, полученный как объединение фрагментов, переданных
с каждого
из процессов.
Другая полезная процедура
MPI_Alltoall пересылает данные по
принципу "все - всем"
Рис. 2.4. Работа MPI_Alltoall
Кроме
перечисленных, в MPI существует еще десяток функций,
осуществляющих различные коллективные операции. При работе с ними
следует помнить следующие основные моменты:
27
все коллективные операции выполняются в рамках коммуникатора.
Если
необходимо
выполнить
коллективную
операцию
над
подмножеством процессов, следует создать для этой цели свой
коммуникатор.
коллективные операции должны вызываться во всех процессах,
которые в них участвуют.
разумное использование коллективных операций - хорошее средство
повышения производительности.
Достарыңызбен бөлісу: