В стандарте MPI-1 (раздел 4.2) коллективные операции применимы только к интракоммуникаторам; однако, большинство коллективные операций MPI может быть обобщено и для интеркоммуникаторов. Чтобы понять, как MPI может быть расширен, мы можем рассматривать большинство коллективных операций MPI с интракоммуникаторами, как подпадающие под одну из следующих категорий (смотри, например, [20]):
Все процессы участвуют в вычислении результата. Все процессы получают результат.
MPI_Alltoall
, MPI_Alltoallv
MPI_Allreduce
, MPI_Reduce_scatter
Все процессы участвуют в вычислении результата. Один процесс получает результат.
MPI_Gather
, MPI_Gatherv
MPI_Reduce
Один процесс вычисляет результат. Все процессы получают результат.
MPI_Bcast
MPI_Scatter
, MPI_Scatterv
Коллективные операции, которые не подпадают ни под одну из категорий выше.
MPI_Scan
MPI_Barrier
Операция MPI_Barrier
не вписывается в эту классификацию по той
причине, что никаких данных не пересылается (только неявный факт создания
барьера). Схема перемещения данных MPI_Scan
под эту классификацию
также не подпадает.
Расширение возможностей коллективной связи от интракоммуникаторов к
интеркоммуникаторам наиболее удобно описывается в терминах левых и правых
групп. Например, all-to-all
операция MPI_Allgather
может
быть описана, как сбор данных от всех членов одной группы, результатом
чего является появление данных во всех членах другой группы (см. рисунок
7.3). В качестве другого примера, one-to-all
операция
MPI_Bcast
посылает данные от одного члена одной группы всем членам
другой группы. Коллективные операции вычисления, такие как
MPI_REDUCE_SCATTER
, имеют похожую интерпретацию (см. рисунок 7.4).
Для интракоммуникаторов эти две группы являются одинаковыми. Для
интеркоммуникаторов эти две группы различаются. Для all-to-all
операций каждая из них описывается в двух фазах, в связи с чем они имеют
симметричую, полнодуплексную реализацию.
В MPI-2 следующие коллективные операции с интракоммуникаторами также применимы и к интеркоммуникаторам:
MPI_BCAST
,
MPI_GATHER
, MPI_GATHERV
,
MPI_SCATTER
, MPI_SCATTERV
,
MPI_ALLGATHER
, MPI_ALLGATHERV
,
MPI_ALLTOALL
, MPI_ALLTOALLV
, MPI_ALLTOALLW
MPI_REDUCE
, MPI_ALLREDUCE
,
MPI_REDUCE_SCATTER
,
MPI_BARRIER
.
(MPI_ALLTOALLW
- это новая функция, описанная в разделе 7.3.5.) Эти
функции используют такие же списки аргументов, как и их двойники из
MPI-1,
кроме того, они работают с интракоммуникаторами как и ожидается.
Следовательно, нет потребности в их новых языковых привязках на ФОРТРАНe или Си. Однако, в С++ привязки были ``ослаблены''; эти
функции-члены классов были перемещены из класса MPI::Intercomm
в
класс MPI::Comm
. Но, так как коллективные операции не имеют смысла
в С++ функции MPI::Comm
(так как она не является ни
интеркоммуникатором, ни интракоммуникатором), эти функции являются чисто
виртуальными. В реализации MPI-2 привязки, описанные в этой главе,
заменяют соответствующие привязки в MPI-1.2.
allgather
. В центре -
нерегламентируемые семантикой данные для одного процесса. Показаны две
фазы выполнения allgathers
в обоих направлениях.