next up previous contents
Next: Примеры интер-коммуникаторов Up: Интер-коммуникация Previous: Доступ в интеркоммуникаторах   Contents

Операции в интеркоммуникаторах

Этот раздел представляет четыре блокирующих операции интер-коммуникатора. Фунция
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, за исключением того, что для обмена между лидерами группы чаще используются контексты, частные по отношению ко входному интер-коммуникатору, а не контексты внутри коммуникатора-моста.[]


next up previous contents
Next: Примеры интер-коммуникаторов Up: Интер-коммуникация Previous: Доступ в интеркоммуникаторах   Contents
Alex Otwagin 2002-12-10