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



Управление коммуникаторами


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

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

  • дублирование уже существующего коммуникатора:

int MPI_Comm_dup(MPI_Comm oldcom, MPI_comm *newcom),

где

  • oldcom — существующий коммуникатор, копия которого создается;
  • newcom — новый коммуникатор;
  • создание нового коммуникатора из подмножества процессов существующего коммуникатора:

int MPI_comm_create(MPI_Comm oldcom, MPI_Group group, MPI_Comm *newcom),

где

  • oldcom — существующий коммуникатор;
  • group — подмножество процессов коммуникатора oldcom;
  • newcom — новый коммуникатор.

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

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

Для пояснения рассмотренных функций можно привести пример создания коммуникатора, в котором содержатся все процессы, кроме процесса, имеющего ранг 0 в коммуникаторе MPI_COMM_WORLD (такой коммуникатор может быть полезен для поддержки схемы организации параллельных вычислений "менеджер – исполнители" – см. лекцию 4):

MPI_Group WorldGroup, WorkerGroup; MPI_Comm Workers; int ranks[1]; ranks[0] = 0; // Получение группы процессов в MPI_COMM_WORLD MPI_Comm_group(MPI_COMM_WORLD, &WorldGroup); // Создание группы без процесса с рангом 0 MPI_Group_excl(WorldGroup, 1, ranks, &WorkerGroup); // Создание коммуникатора по группе MPI_Comm_create(MPI_COMM_WORLD, WorkerGroup, &Workers); ... MPI_Group_free(&WorkerGroup); MPI_Comm_free(&Workers);

Быстрый и полезный способ одновременного создания нескольких коммуникаторов обеспечивает функция:




Содержание  Назад  Вперед