next up previous contents
Next: Деструкторы коммуникаторов Up: Управление коммуникаторами Previous: Доступ к коммуникаторам   Contents

Конструкторы коммуникаторов

Нижеперечисленные функции являются коллективными и вызываются всеми процессами в группе, связанной с comm.

Объяснение: Заметим, что в MPI для создания нового коммуникатора необходим исходный коммуникатор. Основным коммуникатором для всех MPI коммуникаторов является коммуникатор MPI_COMM_WORLD, он предопределен извне независимо от MPI. Эта модель была достигнута после больших дебатов, и была выбрана для увеличения ``безопасности'' программ, написанных в MPI.[]

Синтаксис функции MPI_COMM_DUP представлен ниже

MPI_COMM_DUP(comm, newcomm)

IN comm коммуникатор (дескриптор)
OUT newcomm копия comm (дескриптор)

int MPI_Comm_dup(MPI_Comm comm, MPI_Comm *newcomm)

MPI_COMM_DUP(COMM, NEWCOMM, IERROR)
INTEGER COMM, NEWCOMM, IERROR

MPI::Intracomm MPI::Intracomm::Dup() const

MPI::Intercomm MPI::Intercomm::Dup() const

MPI::Cartcomm MPI::Cartcomm::Dup() const

MPI::Graphcomm MPI::Graphcomm::Dup() const

Функция MPI_COMM_DUP дублирует существующий коммуникатор comm вместе со связанными с ним значениями ключей. Для каждого значения ключа соответствующая функция обратного вызова для копирования определяет значение атрибута, связанного с этим ключом в новом коммуникаторе; одно частное действие, которое может сделать вызов для копирования, состоит в удалении атрибута из нового коммуникатора. Операция MPI_COMM_DUP возвращает в аргументе newcomm новый коммуникатор с той же группой, любой скопированной кэшированной информацией, но с новым контекстом (см. раздел 5.7.1).

Совет пользователям: Эта операция используется, чтобы предоставить вызовам параллельных библиотек дублированное коммуникационное пространство, которое имеет те же самые свойства, что и первоначальный коммуникатор. Обращение к MPI_COMM_DUP имеет силу, даже если имеются ждущие парные обмены, использующие коммуникатор comm. Типичный вызов мог бы запускать MPI_COMM_DUP в начале параллельного обращения и MPI_COMM_FREE этого дублированного коммуникатора - в конце вызова. Возможны также и другие модели управления коммуникаторами. Этот запрос применим как к интра-коммуникаторам, так и к интер-коммуникаторам.[]

Совет разработчикам: Производить фактическое копирование информации о группе не обязательно, достаточно добавить новую ссылку и нарастить счетчик ссылок.[]

Синтаксис функции MPI_COMM_CREATE представлен ниже

MPI_COMM_CREATE(comm, group, newcomm)

IN comm коммуникатор (дескриптор)
IN group группа, являющаяся подмножеством группы comm (дескриптор)
OUT newcomm новый коммуникатор (дескриптор)

int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm)

MPI_COMM_CREATE(COMM, GROUP, NEWCOMM, IERROR)
INTEGER COMM, GROUP, NEWCOMM, IERROR

MPI::Intercomm MPI::Intercomm::Create(const MPI::Group& croup) const

MPI::Intracomm MPI::Intracomm::Create(const MPI::Group& croup) const

Эта функция создает новый коммуникатор newcomm с коммуникационной группой, определенной аргументом group и новым контекстом. Из comm в newcomm не передается никакой кэшированной информации. Функция возвращает MPI_COMM_NULL для процессов, не входящих в group. Запрос неверен, если не все аргументы в group имеют одинаковое значение, или если group не является подмножеством группы, связанной с comm. Заметим, что запрос должен быть выполнен всеми процессами в comm, даже если они не принадлежат новой группе. Этот запрос применяется только к интра-коммуникаторам.

Объяснение: Требование, чтобы вся группа из comm участвовала в запросе, основано на следующих соображениях:

[]

Совет пользователям: MPI_COMM_CREATE обеспечивает возможность для подмножества процессов группы выполнять отдельные MIMD вычисления, с отдельным пространством связи. newcomm, который создается MPI_COMM_CREATE, может использоваться в последующих обращениях к
MPI_COMM_CREATE (или к другим конструкторам коммуникаторов), чтобы разделить вычисление на параллельные подвычисления. Более общие возможности реализует функция MPI_COMM_SPLIT.[]

Совет разработчикам: Поскольку все процессы, вызываемые либо MPI_COMM_DUP, либо
MPI_COMM_CREATE используют тот же самый аргумент group, теоретически возможно cоздать на размере группы уникальный контекст без всякого обмена. Однако, локальное выполнение этих функций требует использования большего пространства контекстных наименований и уменьшает возможности контроля ошибок. Реализации MPI могут использовать различные компромиссы между этими противоречивыми целями, такие как объемное распределение множественных контекстов в одной коллективной операции.

Важное замечание: если новые коммуникаторы создаются без синхронизации процессов, то коммуникационная система должна быть способна справиться с сообщениями, прибывающими в контексте, который еще не был установлен на процессе-получателе.[]

Синтаксис функции MPI_COMM_SPLIT представлен ниже

MPI_COMM_SPLIT(comm, color, key, newcomm)

IN comm коммуникатор (дескриптор)
IN color управление соданием подмножества (целое)
IN key управление назначением номеров (целое)
OUT newcomm новый коммуникатор (дескриптор)

int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm)

MPI_COMM_SPLIT(COMM, COLOR, KEY, NEWCOMM, IERROR)
INTEGER COMM, COLOR, KEY, NEWCOMM, IERROR

MPI::Intercomm MPI::Intercomm::Split(int color, int key) const

MPI::Intracomm MPI::Intracomm::Split(int color, int key) const

Эта функция делит группу, связанную с comm на непересекающиеся подгруппы, по одной для каждого значения цвета color. Каждая подгруппа содержит все процессы того же самого цвета. В пределах каждой подгруппы процессы пронумерованы в порядке, определенном значением аргументаkey, со связями, разделенными согласно их номеру в старой группе. Для каждой подгруппы создается новый коммуникатор и возвращается в аргументе newcomm. Процесс может иметь значение цвета MPI_UNDEFINED, тогда newcomm возвращает MPI_COMM_NULL. Это коллективная операция, но каждому процессу разрешается иметь различные значения для color и key.

Обращение к MPI_COMM_CREATE (сomm, group, newcomm) эквивалентно обращению
к MPI_COMM_SPLIT(comm, color, key, newcomm), где все члены group имеют color = 0 и key = номеру в group, и все процессы, которые не являются членами group, имеют color = MPI_UNDEFINED. Функция MPI_COMM_SPLIT допускает более общее разделение группы на одну или несколько подгрупп с необязательным переупорядочением. Этот запрос могут использовать только интра-комму-никаторы.

Значение color должно быть неотрицательным.

Совет пользователям: Это чрезвычайно мощный механизм для разделения единственной коммуникационной группы процессов на k подгрупп, где k неявно выбрано пользователем (количеством цветов для раскраски процессов). Полученные коммуникаторы будут не перекрывающимися. Такое деление полезно для организации иерархии вычислений, например для линейной алгебры.

Чтобы преодолеть ограничение на перекрытие создаваемых коммуникаторов, можно использовать множественные обращения к MPI_COMM_SPLIT. Этим способом можно создавать множественные перекрывающиеся коммуникационные структуры.

Заметим, что для фиксированного цвета ключи не должны быть уникальными. MPI_COMM_SPLIT сортирует процессы в возрастающем порядке согласно этому ключу, и разделяет связи непротиворечивым способом. Если все ключи определены таким же образом, то все процессы одинакового цвета будут иметь относительный порядок номеров такой же, как и в породившей их группе. (В общем случае они будут иметь различные номера.)

Если значение ключа для всех процессов данного цвета сделано нулевым, то это означает, что порядок номеров процессов в новом коммуникаторе безразличен.[]

Объяснение: Аргумент сolor не может иметь отрицательного значения, чтобы не конфликтовать со значением, присвоенным MPI_UNDEFINED.[]


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