Теория и практика параллельных вычислений

         

Управление группами


Группы процессов могут быть созданы только из уже существующих групп. В качестве исходной группы может быть использована группа, связанная с предопределенным коммуникатором MPI_COMM_WORLD. Также иногда может быть полезным коммуникатор MPI_COMM_SELF, определенный для каждого процесса параллельной программы и включающий только этот процесс.

Для получения группы, связанной с существующим коммуникатором, применяется функция:

int MPI_Comm_group(MPI_Comm comm, MPI_Group *group),

где

  • comm — коммуникатор;
  • group — группа, связанная с коммуникатором.

Далее, на основе существующих групп, могут быть созданы новые группы:

  • создание новой группы newgroup из существующей группы oldgroup, которая будет включать в себя n процессов — их ранги перечисляются в массиве ranks:

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

где

  • oldgroup — существующая группа;
  • n — число элементов в массиве ranks;
  • ranks — массив рангов процессов, которые будут включены в новую группу;
  • newgroup — созданная группа;
  • создание новой группы newgroup из группы oldgroup, которая будет включать в себя n процессов, чьи ранги не совпадают с рангами, перечисленными в массиве ranks:

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

где

  • oldgroup — существующая группа;
  • n — число элементов в массиве ranks;
  • ranks — массив рангов процессов, которые будут исключены из новой группы;
  • newgroup — созданная группа.

Для получения новых групп над имеющимися группами процессов могут быть выполнены операции объединения, пересечения и разности:

  • создание новой группы newgroup как объединения групп group1 и group2:

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

где

  • group1 — первая группа;
  • group2 — вторая группа;
  • newgroup — объединение групп;
  • создание новой группы newgroup как пересечения групп group1 и group2:

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

где

  • group1 — первая группа;
  • group2 — вторая группа;
  • newgroup — пересечение групп;
  • создание новой группы newgroup как разности групп group1 и group2:


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

где

  • group1 — первая группа;
  • group2 — вторая группа;
  • newgroup — разность групп;


При конструировании групп может оказаться полезной специальная пустая группа MPI_COMM_EMPTY.

Ряд функций MPI обеспечивает получение информации о группе процессов:

  • получение количества процессов в группе:


int MPI_Group_size(MPI_Group group, int *size),

где

  • group — группа;
  • size — число процессов в группе;
  • получение ранга текущего процесса в группе:


int MPI_Group_rank(MPI_Group group, int *rank),

где

  • group — группа;
  • size — ранг процесса в группе.




После завершения использования группа должна быть удалена:

int MPI_Group_free(MPI_Group *group),

где

  • group — группа, подлежащая удалению


(выполнение данной операции не затрагивает коммуникаторы, в которых используется удаляемая группа).


Содержание раздела