ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ
63
Коммуникатор описывает контекст коммуникации для операции обмена.
Каждый контекст задает отдельную область взаимодействия, сообщения принима-
ются в том контексте, в котором они были отправлены, а сообщения, отправленные
в разных контекстах, не пересекаются и не мешают друг другу. Другими словами,
процессы, связанные с MPI-программой, могут взаимодействовать, только если они
связаны с одним коммуникатором. Значение коммуникатора (оно используется по
умолчанию) mpi_comm_world соответствует всем процессам данной программы.
В MPI имеются средства создания и преобразования коммуникаторов, кото-
рые дают возможность программисту в дополнение к стандартным предопределен-
ным объектам создавать свои собственные. Это не только позволяет использовать
разнообразные и достаточно сложные схемы взаимодействия процессов, но и обес-
печивает поддержку модульности в параллельных MPI-программах. Модульность
— это возможность создавать библиотеки (библиотечные модули) параллельных
подпрограмм. Читатель уже знает, что в таких подпрограммах используются аргу-
менты, позволяющие определить источник и адресат обмена, а также теги сообще-
ний. Теги позволяют различать сообщения, отправленные для разных целей, но ме-
ханизма тегов недостаточно для поддержки модульности. Рассмотрим пример.
Пусть программа использует библиотечную подпрограмму из созданного програм-
мистом модуля параллельных процедур. Для правильной организации обмена
сообщениями важно, чтобы теги сообщений, применяемые в библиотеке, отлича-
лись от тегов, используемых в оставшейся части приложения. Но пользователь биб-
лиотечной процедуры может и не знать, какие теги она использует. В этом случае
возникает опасность создания нестабильно работающей параллельной программы с
непредсказуемым поведением.
Решением этой проблемы и являются коммуникаторы. Используя средства
MPI, можно создать новый коммуникатор, содержащий, например, те же процессы,
что и исходный, но с новым контекстом (т. е. с новыми свойствами). Обмен возмо-
жен только в рамках одного контекста, а обмены в разных коммуникаторах проис-
ходят независимо. Новый коммуникатор можно передать в качестве аргумента биб-
лиотечной подпрограмме, как в следующем примере:
…
CALL MPI_COMM_DUP(COMM, NEWCOMM, IERR)
CALL GAUSS_PARALLEL(NEWCOMM, A, B)
CALL MPI_FREE(NEWCOMM, IERR)
…
Здесь сначала создается новый коммуникатор (о подпрограмме
MPI_Comm_dup речь пойдет ниже), подпрограмма gauss_parallel использует