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

Конструкторы групп

Конструкторы групп применяются к подмножеству и расширенному множеству существующих групп. Эти конструкторы создают новые группы на основе существующих групп. Данные операции являются локальными и различные группы могут быть определены на различных процессах; процесс может также определять группу, которая не включает саму себя. MPI не имеет механизма для формирования группы с нуля, группа может формироваться только на основе другой, предварительно определенной группы. Базовая группа, на основе которой определены все другие группы, является группой, связанной с начальным коммуникатором MPI_COMM_WORLD (доступна через функцию MPI_COMM_GROUP).

Объяснение: Отсюда следует, что не имеется никакой функции дублирования группы, аналогичной MPI_COMM_DUP, описываемой позже в этой главе. Нет необходимости в дубликаторе группы. Группа, когда-либо созданная, может иметь несколько ссылок, путем копирования дескриптора. Следующие конструкторы предназначены для создания подмножеств и расширенных множеств существующих групп.[]

Совет разработчикам: Каждый конструктор группы ведет себя так, как будто он возвращает новый объект группы. Если эта новая группа является копией существующей группы, то можно избежать создания таких новых объектов, используя механизм ссылок.[]

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

MPI_COMM_GROUP(comm, group)

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

int MPI_Comm_group(MPI_Comm comm, MPI_Group *group)

MPI_COMM_GROUP(COMM, GROUP, IERROR)
INTEGER COMM, GROUP, IERROR

MPI::Group MPI::Comm::Get_group() const

ФункцияMPI_COMM_GROUP возвращает в group дескриптор группы из comm.

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

MPI_GROUP_UNION(group1, group2, newgroup)

IN group1 первая группа (дескриптор)
IN group2 вторая группа (дескриптор)
OUT newgroup объединенная группа (дескриптор)

int MPI_Group_union(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup)

MPI_GROUP_UNION(GROUP1, GROUP2, NEWGROUP, IERROR)
INTEGER GROUP1, GROUP2, NEWGROUP, IERROR

static MPI::Group MPI::Group::Union(const MPI::Group& group1,
const MPI::Group& group2)

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

MPI_GROUP_INTERSECTION(group1, group2, newgroup)

IN group1 первая группа (дескриптор)
IN group2 вторая группа (дескриптор)
OUT newgroup группа, образованная пересечением (дескриптор)

int MPI_Group_intersection(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup)

MPI_GROUP_INTERSECTION(GROUP1, GROUP2, NEWGROUP, IERROR)
INTEGER GROUP1, GROUP2, NEWGROUP, IERROR

static MPI::Group MPI::Group::Intersect(const MPI::Group& group1,
const MPI::Group& group2)

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

MPI_GROUP_DIFFERENCE(group1, group2, newgroup)

IN group1 первая группа(дескриптор)
IN group2 вторая группа (дескриптор)
OUT newgroup исключенная группа (дескриптор)

int MPI_Group_difference(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup)

MPI_GROUP_DIFFERENCE(GROUP1, GROUP2, NEWGROUP, IERROR)
INTEGER GROUP1, GROUP2, NEWGROUP, IERROR

static MPI::Group MPI::Group::Difference(const MPI::Group& group1,
const MPI::Group& group2)

Операции над множествами определяются следующим образом:

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

Новая группа может быть пуста, то есть эквивалентна MPI_GROUP_EMPTY.

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

MPI_GROUP_INCL(group, n, ranks, newgroup)

IN group группа (дескриптор)
IN n количество элементов в массиве номеров (и размер newgroup, целое)
IN ranks номера процессов в group, перешедших в новую группу (массив целых)
OUT newgroup новая группа, полученная из прежней, упорядоченная согласно ranks (дескриптор)

int MPI_Group_incl(MPI_Group group, int n,
int *ranks, MPI_Group *newgroup)

MPI_GROUP_INCL(GROUP, N, RANKS, NEWGROUP, IERROR)
INTEGER GROUP, N, RANKS(*), NEWGROUP, IERROR

MPI::Group MPI::Group::Incl(int n, const int ranks[]) const

Функция MPI_GROUP_INCL создает группу newgroup, которая состоит из n процессов из group с номерами ranks[0],..., ranks[n-1]; процесс с номером i в newgroup есть процесс с номером ranks[i] в group. Каждый из n элементов ranks должен быть правильным номером в group, и все элементы должны быть различными, иначе программа будет неверна. Если n = 0, то newgroup имеет значение MPI_GROUP_EMPTY. Эта функция может использоваться, например, для переупорядочения элементов группы (см. также MPI_GROUP_COMPARE).

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

MPI_GROUP_EXCL(group, n, ranks, newgroup)

IN group группа (дескриптор)
IN n количество элементов в массиве номеров (целое)
IN ranks массив целочисленных номеров в group, не входящих в newgroup
OUT newgroup новая группа, полученная из прежней, сохраняющая порядок, определенный group (дескриптор)

int MPI_Group_excl(MPI_Group group, int n, int *ranks, MPI_Group *newgroup)

MPI_GROUP_EXCL(GROUP, N, RANKS, NEWGROUP, IERROR)
INTEGER GROUP, N, RANKS(*), NEWGROUP, IERROR

MPI::Group MPI::Group::Excl(int n, const int ranks[]) const

Функция MPI_GROUP_EXCL создает группу процессов newgroup, которая получена путем удаления из group процессов с номерами ranks[0],..., ranks[n-1]. Упорядочивание процессов в newgroup идентично упорядочиванию в group. Каждый из n элементов ranks должен быть правильным номером в group, и все элементы должны быть различными; в противном случае, программа неверна. Если n = 0, то newgroup идентична group.

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

MPI_GROUP_RANGE_INCL(group, n, ranges, newgroup)

IN group группа (дескриптор)
IN n число триплетов в массиве ranges (целое)
IN ranges массив целочисленных триплетов формы (первый номер, последний номер, шаг), указывающий номера в group процессов, которые включены в newgroup
OUT newgroup новая группа, полученная из прежней, упорядоченная согласно ranges (дескриптор)

int MPI_Group_range_incl(MPI_Group group, int n, int ranges[][3], MPI_Group *newgroup)

MPI_GROUP_RANGE_INCL(GROUP, N, RANGES, NEWGROUP, IERROR)
INTEGER GROUP, N, RANGES(3,*), NEWGROUP, IERROR

MPI::Group MPI::Group::Range_incl(int n,
const int ranges[][3]) const

Если аргументы ranges состоят из триплетов

$
(first_1 , first_1 + stride_1), \dots, (first_n , first_n + stride_n)%%
$

то newgroup состоит из последовательности процессов с номерами

$first_1, first_1 + stride_1, \dots, first_1 + \left[{\frac{last_1 - first_1}{stride_1}} \right] stride_1, \dots$ $first_n, first_n + stride_n, \dots, first_n + \left[{\frac{last_n - first_n}{stride_n}} \right] stride_n.$

Каждый вычисленный номер должен быть правильным номером в group, и все вычисленные номера должны быть различным, иначе программа будет неверной. Заметим, что возможен случай, когда $first_i > last_i$, и $stride_i$ может быть отрицательным, но не может быть равным нулю.

Функциональные возможности этой процедуры позволяют расширить массив номеров до массива включенных номеров и передать результирующий массив номеров и другие аргументы в MPI_GROUP_INCL. Запрос к MPI_GROUP_INCL эквивалентен запросу к MPI_GROUP_RANGE_INCL с каждым номером i в ranks, замененным триплетом (i, i, 1) в аргументе ranges.

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

MPI_GROUP_RANGE_EXCL(group, n, ranges, newgroup)

IN group группа (дескриптор)
IN n количество элементов в массиве номеров (целое)
IN ranges одномерный массив целочисленных триплетов формы (первый номер, последний номер, шаг), отображающий номера в group процессов, которые исключаются из выходной группы newgroup.
OUT newgroup новая группа, образованная из прежней, сохраняющая порядок в group (дескриптор)

int MPI_Group_range_excl(MPI_Group group, int n, int ranges[][3], MPI_Group *newgroup)

MPI_GROUP_RANGE_EXCL(GROUP, N, RANGES, NEWGROUP, IERROR)
INTEGER GROUP, N, RANGES(3,*), NEWGROUP, IERROR

MPI::Group MPI::Group::Range_excl(int n,
const int ranges[][3]) const

Каждый вычисленный номер должен быть правильным номером в group, и все вычисленные номера должны быть различными, иначе программа будет неверной.

Функциональные возможности этой процедуры позволяют расширить массив номеров до массива исключенных номеров и передать результирующий массив номеров и другие аргументы в MPI_GROUP_EXCL. Запрос к MPI_GROUP_EXCL эквивалентен запросу к MPI_GROUP_RANGE_EXCL с каждым номером i в ranks, замененным триплетом (i, i, 1) в аргументе ranges.

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

Совет разработчикам: Диапазонные операции должны быть реализованы, если возможно, без перечисления членов группы, чтобы получить большую масштабируемость (временную и простран-ственную).[]


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