Рейтинговые книги
Читем онлайн Параллельное и распределенное программирование на С++ - Хьюз Камерон

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 86 87 88 89 90 91 92 93 94 ... 181

MPI_Send(Buffer,Count, MPI_LONG, TaskRank, Tag,Comm) ;

будет отправлено Count значений типа long MPI-процессу с рангом, равным значению TaskRank. Параметр Buffer представляет собой указатель на данные, посылаемые процессу TaskRank. Параметр Count характеризует количество элементов в буфере Buffer, а не его раз м ер. Каждое сообщение имеет тег. Этот тег позволяет отличить одно сообщение от другого, сгруппировать сообщения в классы, связать определенные сообщения с определенными коммуникаторами и пр. Тег имеет тип int, а его значение определяется пользователем. Параметр Comm представляет коммуникатор, которому назначается процесс. Если ранг и коммуникатор задачи известны, этой задаче можно посылать сообщения. При выполнении вызова

MPI_Recv(Buffer, Count, MPI_INT, TaskRank, Tag, Comm, &Status);

будет получено Count значений типа int от процесса с рангом TaskRank. Инициатор вызова будет заблокирован до тех пор, пока не получит сообщение от процесса с рангом TaskRank и соответствующим значением тега (Tag). MPI-интерфейс для параметров ранга и тега поддерживает групповые символы. Такими групповыми символами являются значения MPI_ANY_TAG и MPI_ANY_SOURCE. При использовании этих значений вызывающий процесс примет следующее полученное им сообщение независимо от его источника и тега. Параметр Status имеет тип MPI_Status. Информацию об операции приема можно получить из объекта Status. Параметр статуса содержит три поля: MPI_SOURCE, MPI_TAG и MPI_ERROR. Следовательно, объект Status можно использовать для определения тега и источника процесса-отправителя. При известном количестве процессов-участников можно точно определить отправителей сообщений и их получателей. Обычно для этого используется конкретное приложение. Распределение работы также зависит от приложения. Перед началом работы каждый процесс сразу же определяет, сколько других процессов включено в приложение. Это реализуется следующим вызовом: MPI_Comm_size(MFI_COMM_WORLD, &WorldSize) ;

С помощью этой функции определяется размер группы процессов, связанных с конкретным коммуникатором. В данном используется стандартный коммуникатор (MPI_COMM_WORLD). Количество процессов-участников возвращается в параметре WorldSize. Этот параметр имеет тип int. Если каждому процессу известно значение WorldSize, значит, он знает, сколько процессов связано его коммуникатором.

Группирование задач по коммуникаторам

Процессы связываются не только с ранга м и, но и с ко мм уникатора м и. Коммуникатор определяет область коммуникации для некоторого множества процессов. Все процессы, связанные с одним и тем же коммуникатором, относятся к одной и той же группе коммуникации. Работу, выполняемую MPI-программой, можно разделить между группами коммуникаций. По умолчанию все процессы относятся к группе MPI_C0MM_WORLD. Для создания новых ко м муникаторов можно использовать функцию MPI_Comm_create (). Список функций (с краткими описаниями), используемых для работы с коммуникаторами, приведен в табл. 9.1.

Благодаря использованию рангов и коммуникаторов MPI-задачи легко идентифицировать и различать. Ранг и коммуникатор позволяют структурировать программу как SPMD- или MPMD-модель либо как некоторую их комбинацию. Для упрощения кода MPI-программы мы используем ранг и коммуникатор в сочетании с параметризованным программированием и объектно-ориентированными методами. Шаблоны можно использовать не только при м енительно к аспекту различных данных SIMD-модели, но и к заданию различных типов данных. Это значительно упрощает структуру многих приложений, требующих выполнения большого объема одинаковых вычислений, но с различными типами данных. Для реализации модели MPMD (MIMD) мы рекоменлуем использовать динамический полиморфизм (поддерживаемый объектами), параметрический полиморфизм (поддерживаемый шаблонами), объекты-функции и предикаты. Для разделения всего объема работы MPI-приложения эти методы используются в сочетании с рангами и коммуникаторами MPI-процессов. При использовании объектно-ориентированного подхода работа программы делится между семействами объектов. Все семейства объектов связываются с различными коммуникаторами. Соответствие семейств объектов различным коммуникаторам способствует модульности проекта MPI-приложения. Такой способ разделения также помогает понять, как следует применить параллелизм. Мы убедились, что объектно-ориентированный подход делает MPl-программы более открытыми для расширения, атакже простыми для поддержки, отладки и тестирования.

|Таблица 9.1. Функции, используемыедля работы с коммуникаторами

Функции

Описание

int

MPI_Intercomm_create

(MPI_Comm LocalComm,int LocalLeader, MPI_Comm PeerComm, int remote_leader, int MessageTag, MPI_Comm *CommOut);

 

 Создает

inter

-коммуникатор из двух

intra

коммуникаторов

int

MPI_Intercomm_merge

(MPI_Comm Comm, int High,

MPI_Comm *CommOut);

 Соз

д

ает

intra

-коммуникатор из

inter- коммуникатора

int

MPI_Cartdim_get

(MPI_Comm Comm,int *NDims);

 Возвращает декартову топологическую информацию, связанную с коммуникатором

int

MPI_Cart_create

(MPI_Comm CommOld, int NDims, int *Dims, int *Periods, int Reorder, MPI_Comm *CommCart)

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

int

MPI_Cart_sub

(MPI_Comm Comm, int *RemainDims, MPI_Comm *CommNew);

Делит коммуникатор на подгруппы, которые образуют декартовы подсистемы более низкой размерности

int

MPI_Cart_shift

(MPI_Comm Comm, int Direction, int Display,int *Source,int *Destination);

Считывает смещенные ранги источника и приемника при заданном направлении и величине смещения

int

MPI_Cart_map

(MPI_Comm CommOld, int NDims, int *Dims, int *Periods, int *Newrank);

Преобразует процесс в декартову топологическую информацию

int

MPI_Cart_get

(MPI_Comm Comm, int MaxDims, int *Dims, int *Periods, int *Coords);

Возвращает декартову топологическую информацию, связанную с коммуникатором

int

MPI_Cart_coords

(MPI_Comm Comm, int Rank, int MaxDims, int *Coords);

Вычисляет координаты процесса в декартовой топологии при заданном ранге в группе

int

MPI_Comm_create

(MPI_Comm Comm, MPI_Group Group, MPI_Comm *CommOut) ;

Создает новый коммуникатор

int

MPI_Comm_rank

(MPI_Comm Comm, int *Rank ) ;

Вычисляет и возвращает ранг вызывающего процесса в коммуникаторе

int

MPI_Cart_rank

(MPI_Comm Comm, int *Coords, int *Rank );

Вычисляет и возвращает ранг процесса в коммуникаторе при заданном декартовом местоположении

int

MPI_Comm_compare

(MPI_Comm Comm1, MPI_Comm Comm2, int *Result);

Сравнивает два коммуникатора Comm1 и Comm2

int

MPI_Comm_dup

( MPI_Comm CommIn, MPI_Comm *CommOut) ;

1 ... 86 87 88 89 90 91 92 93 94 ... 181
На этой странице вы можете бесплатно читать книгу Параллельное и распределенное программирование на С++ - Хьюз Камерон бесплатно.
Похожие на Параллельное и распределенное программирование на С++ - Хьюз Камерон книги

Оставить комментарий