Этот раздел представляет четыре блокирующих операции интер-коммуникатора.
Фунция
MPI_INTERCOMM_CREATE используется для объединения двух
интра-коммуникаторов в интер-комму-никатор; функция MPI_INTERCOMM_MERGE создает интра-коммуникатор, объединяя локальную и
удаленную группы интер-коммуникатора. Функции MPI_COMM_DUP и
MPI_COMM_FREE, введенные ранее, соответственно дублируют и
удаляют интер-коммуникатор.
Перекрытие локальной и удаленной групп, которые связаны в интер-коммуникатор, запрещено. Если имеется перекрытие, то программа неверна и вероятен дедлок. (Если процесс многопоточный и запросы MPI блокируют только поток, а не процесс, то может быть поддержано ``двойное членство''. Это возможно тогда, когда пользователь гарантирует, что вызовы от имени двух ``ролей'' процесса выполнены двумя независимыми потоками.)
Функция MPI_INTERCOMM_CREATE может использоваться для создания интер-коммуникатор из двух существующих интра-коммуникаторов в следующей ситуации: по крайней мере один выделенный член от каждой группы (``лидер группы'') имеет способность обмениваться с выделенным членом от другой группы; то есть существует коммуникатор, в котором оба лидера равноправны и каждый лидер знает номер другого лидера в этом коммуникаторе (эти два лидера могут быть одним и тем же процессом). Кроме того, члены каждой группы знают номер их лидера.
Конструирование интер-коммуникатора из двух интра-коммуникаторов требует отдельных коллективных операций в локальной и удаленной группах, также как и парного обмена между процессами в локальной и удаленной группах.
В стандартной реализации MPI (со статическим распределением процессов при инициализации) коммуникатор MPI_COMM_WORLD (или специализированный коммуникатор, дублирующий его, что предпочтительнее) может быть этим коммуникатором, обеспечивающим равноправие. В динамических реализациях MPI, где процесс может порождать новые дочерние процессы во время выполнения программы MPI, родительский процесс может быть ``мостом'' между старой и новой областью обмена.
Прикладные функции топологии, описанные в главе 6, не применимы к интер-коммуникаторам. Пользователи, которым это нужно, должны использовать MPI_INTERCOMM_MERGE, чтобы построить интра-коммуникатор, а затем уже применять древовидную или декартову топологию к этому интра-коммуникатору, создавая соответствующий настроенный на выбранную топологию интра-коммуникатор. Пользователь имеет возможность создавать для этого случая и собственные прикладные топологические механизмы.
Синтаксис функции MPI_INTERCOMM_CREATE представлен ниже.
MPI_INTERCOMM_CREATE(local_comm,local_leader,peer_comm,remote_leader,tag,newintercomm)
IN | local_comm | локальный интракоммуникатор (дескриптор) | |
IN | local_leader | номер лидера локальной группы в local_comm (целое) | |
IN | peer_comm | ``уравнивающий коммуникатор'', используется только на local_leader (дескриптор) | |
IN | remote_leader | номер лидера удаленной группы в peer_comm, используется только на local_leader (целое) | |
IN | tag | тэг <безопасности> (целое) | |
OUT | newintercomm | новый интеркоммуникатор (дескриптор) |
int MPI_Intercomm_create(MPI_Comm local_comm,
int local_leader, MPI_Comm peer_comm,
int remote_leader, int tag, MPI_Comm *newintercomm)
MPI_INTERCOMM_CREATE(LOCAL_COMM, LOCAL_LEADER, PEER_COMM,
REMOTE_LEADER, TAG, NEWINTERCOMM, IERROR)
INTEGER LOCAL_COMM, LOCAL_LEADER, PEER_COMM,
REMOTE_LEADER, TAG, NEWINTERCOMM, IERROR
MPI::Intercomm MPI::Intracomm::Create_intercomm(
int local_leader, const MPI::Comm& peer_comm,
int remote_leader, int tag) const
Функция MPI_INTERCOMM_CREATE создает интер-коммуникатор. Это коллективная операция над объединением локальной и удаленной групп. Процессы должны обеспечить идентичные аргументы local_comm и local_leader в пределах каждой группы. Неопределенность в задании номеров процессов не допускается для remote_leader, local_leader, и тэга.
Этот запрос использует двухточечный обмен между лидерами через коммуникатор peer_comm с тэгом tag. Поэтому нужно принять меры, чтобы на peer_comm отсутствовали ждущие обмены, которые могли бы взаимодействовать с этим обменом.
Совет пользователям: Рекомендуется использовать выделенный peer-коммуникатор, например, дубликат коммуникатора MPI_COMM_WORLD, чтобы избежать неприятностей с peer-коммуника-торами.[]
Синтаксис функции MPI_INTERCOMM_MERGE представлен ниже.
MPI_INTERCOMM_MERGE(intercomm, high, newintracomm)
IN | intercomm | интеркоммуникатор (дескриптор) | |
IN | high | (логическое значение) | |
OUT | newintracomm | новый интракоммуникатор (дескриптор) |
int MPI_Intercomm_merge(MPI_Comm intercomm,
int high, MPI_Comm *newintracomm)
MPI_INTERCOMM_MERGE(INTERCOMM, HIGH, INTRACOMM, IERROR)
INTEGER INTERCOMM, INTRACOMM, IERROR
LOGICAL HIGH
MPI::Intracomm MPI::Intercomm::Merge(bool high) const
Эта функция создает интра-коммуникатор путем объединения двух групп, которые связаны с intercomm. Все процессы должны обеспечить одинаковое значение high в пределах каждой из этих двух групп. Если процессы в одной группе имеют значение high = false, а процессы в другой группе - значение high = true, тогда объединение помещает ``low'' группу перед ``high'' группой. Если все процессы имеют одинаковый аргумент high, тогда порядок объединения произвольный. Этот запрос является блокирующим и коллективен в пределах объединения из этих двух групп.
Совет разработчикам: Выполнение MPI_INTERCOMM_MERGE, MPI_COMM_FREE и MPI_COMM_DUP похоже на реализацию MPI_INTERCOMM_CREATE, за исключением того, что для обмена между лидерами группы чаще используются контексты, частные по отношению ко входному интер-коммуникатору, а не контексты внутри коммуникатора-моста.[]