Параллельное программирование: Учебное пособие, страница 117

MPI_Comm_group(MPI_COMM_WORLD, &MPI_GROUP_WORLD);

        /* Создаем новую группу subgroup с 4 процессами из ranks */

MPI_Group_incl(MPI_GROUP_WORLD, 4, ranks, &subgroup);

        /* Обеспечиваем выборку ранга процесса из группы subgroup */

MPI_Group_rank(subgroup, &myrank);

        /* Создаем новый коммуникатор subcomm для группы subgroup */

MPI_Comm_create(MPI_COMM_WORLD, subgroup, &subcomm);

if(myrank != MPI_UNDEFINED)      /* Если ранг определен, то      */

{  /* над count элементами буфера sendbuf выполняется операция */

   /* MPI_SUM  и результат передается через коммуникатор subcomm */

   /* в корневой процесс root в буфер recvbuf   */

MPI_Reduce(&sendbuf, &recvbuf, count, MPI_INT,

MPI_SUM, root, subcomm);

if(myrank == root) /* Если программа исполняется в процессе */

  /* с рангом root , то печатаем значения элементов в recvbuf */

printf("Reduced values");

for(i = 0; i < count; i++)

{

printf(" %i ", recvbuf[i]);

}

}

printf("\n");

           /* Освобождаем память, занятую коммуникатором и группами */

MPI_Comm_free(&subcomm); MPI_Group_free(&MPI_GROUP_WORLD); MPI_Group_free(&subgroup);

}

MPI_Finalize() ;

return 0;

}

Судя по значениям рангов, упоминавшихся в тексте, программа должна запускаться не менее, чем в восьми процессах, хотя здесь и создается подгруппа, состоящая из процессов с рангами  1, 3, 5  и  7 и соответствующий ей коммуникатор, описатели которых в конце работы программы удаляются. Редукция выполняется только процессами из этой группы.

6.4  Учет топологии взаимодействия процессов

В некоторых важных вычислительных задачах граф информационной зависимости имеет регулярную структуру (топологию). Для учета этой регулярности в MPI предусмотрены дополнительные возможности, которые позволяют упростить разработку параллельных программ, содержащих операции коллективного обмена данными. Организация коллективного обмена основана на свойствах коммуникатора быть описателем области взаимодействия. Кроме списка процессов и контекста обмена с коммуникатором можно связать (кэшировать) дополнительную информацию. Разновидностью такой информации является топология обменов. Топологии в MPI представляют собой механизм сопоставления процессам некоторой группы специальных схем адресации, в дополнение к адрессации, описанной в рассмотренных выше процедурах обмена. Надо иметь в виду, что топологии обменов сообщениями в MPI являются виртуальными и не связаны с физической топологией коммуникационной сети параллельной вычислительной системы. Использование коммуникаторов и топологий отличает MPI от большинства других систем передачи сообщений.

Узлами в топологиях MPI являются процессы, а каналы обмена сообщениями являются соединениями. Граф информационной зависимости задачи своими узлами и ориентированными ребрами однозначно определяет топологию сети из процессов и каналов связи в параллельной программе. Грамотное описание регулярных свойств ГИЗ с помощью топологий MPI может существенно повысить эффективность выполнения коллективных обменов в параллельной вычислительной среде.

В MPI существуют два типа топологий: декартова топология, то есть прямоугольная решетка произвольной размерности из узлов-процессов (рис. 6.8), и топология графа, то есть регулярная древовидная структура, состоящая из фрагментов в виде процесса-вершины и процессов-листьев, соединенных каналами-ребрами (рис. 6.9).


Рисунок 6.8. Декартова топология


Рисунок 6.9. Топология графа

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

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