Камерон Хьюз - Параллельное и распределенное программирование на С++
- Название:Параллельное и распределенное программирование на С++
- Автор:
- Жанр:
- Издательство:Издательский дом «Вильямс»
- Год:2004
- Город:МоскваСанкт-ПетербургКиев
- ISBN:ISBN 5-8459-0686-5 (рус.)ISBN 0-13-101376-9 (англ.)
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Камерон Хьюз - Параллельное и распределенное программирование на С++ краткое содержание
Эта книга адресована программистам, проектировщикам и разработчикам программных продуктов, а также научным работникам, преподавателям и студентам, которых интересует введение в параллельное и распределенное программирование с использованием языка С++.
Параллельное и распределенное программирование на С++ - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
|Таблица 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) ; | Дублирует уже существующий коммуникатор со всей его кашированной информацией |
int MPI_Comm_free( MPI_Comm *Comm) ; | Отмечает объект коммуникатора как освобожденный |
int MPI_Comm_group( MPI_Comm Comm, MPI_Group *Group); | Получает доступ к группе, связанной с заданным коммуникатором |
int MPI_Comm_size( MPI_Comm Comm, int *Size); | Вычисляет и возвращает размер группы, связанной с заданным коммуникатором |
int MPI_Comm_split(MPI_Comm Comm, int Color,int Key,MPI_Comm *CommOut) ; | Создает новые коммуникаторы на основе цветов и ключей |
int MPI_Comm_test_inter( MPI_Comm Comm, int *Flag); | Определяет, является ли коммуникатор inter-коммуникатором |
int MPI_Comm_remote_group( MPI_Comm Comm, MPI_Group *Group); | Получает доступ к удаленной группе, связанной с заданным inter-коммуникатором |
int MPI_Comm_remote_size( MPI_Comm Comm, int *Size); | Вычисляет и возвращает размер удаленной |
группы, связанной с заданным inter- | |
коммуникатором |
Анатомия MPI-задачи
На рис.9.1 представлена каркасная MPI-программа. Задачи, выполняемые этой программой, просто сообщают свои ранги MPI-задаче с нулевым рангом. Каждая MPI-программа должна иметь по крайней мере функции MPI_Init()и MPI_Finalize().Функция MPI_Init()инициализирует MPI-среду для вызывающей задачи, а функция MPI_Finalize() освобождает ресурсы этой MPI-задачи. Каждая MPI-задача должна вызвать функцию MPI_Finalize()до своего завершения. Обратите вни м ание на обращения к функция м MPI_COMM_rank () HMPI_COMM_Size(). Они используются для получения значений ранга и количества процессов, которые принадлежат MPI-приложению. Эти функции вызываются большинством MPI-приложений. Вызов же остальных MPI-функций зависит от конкретного приложения. MPI-среда поддерживает более 300 функций (подробная информация представлена в соответствующей документации).
Рис. 9.1. MPI-программа |
Использование шаблонных функций для представления MPI-задач
Шаблоны функции позволяют обоб щ ать процедуры для любо г о типа данных. Рассмотрим процедуру умножения, которая работает для любо г о типа данных (точнее, для типов данных, для которых операция умножения имеет смысл),
template T multiplies(T X, T Y) {
return( X * Y);
}
Для такой шаблонной функции, как эта, используются необходимые пара м етры дл я типа Т.Пара м етр Tозначает некоторый тип данных, который будет реально ***казан при реализации это г о шаблона. Так, мы можем реализовать функцию multiplies() следую щ им образом.
//. . .
multiplies(3.2,4.5);
multiplies(7, 2) ; multiplies(«7/2»,«3/4»); //.. .
Здесь параметр Tза м еняется типо м double, intи rationalсоответственно, определяя тем самым точную реализацию операции умножения. Умножение д ля разных типов данных опре д еляется по-разно м у. Это означает, что д ля разных типов данных выполняется различный код. Шаблоннал функция позволяет написать одну операцию у м ножения (в виде функции multiplies()) и при м енить ее ко м ноги м различны м типа м данных.
Реализация шаблонов и модельБРМО (типы данных)
Пара м етризованные функции м ожно использовать с MPI-интерфейсо м д ля обработки ситуаций, в которых все процессы выполняют одинаковый код, но работают сразличны м и типа м и данных. Так, определив значение TaskRankпроцесса, м ы м о-жем распознать, с каки м и данны м и и данны м и какого типа должен работать процесс. В листинге 9.2 показано, как реализовать различные задачи д ля различных рангов.
//Листинг 9.2. Использование шаблонных функций для // определения «фронта работ» МР1-задач
int main(int argc, char *argv[]) {
//.. .
int Tag = 2; int WorldSize; int TaskRank; MPI_Status Status; MPI_Init(&argc,&argv) ,-
MPI_Comm_rank (MPI_COMM_WORLD, &TaskRank) ; MPI_Comm_size (MPI_COMM_WORLD, &WorldSize) ; //.. .
switch(TaskRank) {
case 1: multiplies(3.2,4.6); break;
case 2: multiplies(X,Y)
break; //case n:
//.. .
}
}
Поскольку не существует двух задач с одинаковым ранго м, все ветви в инструкции caseлистинга 9.2 будут выполнены различны м и MPI-задача м и. Кро м е того, такой тип параметризации м ожно распространить на контейнерные аргу м енты шаблонных функций. Это позволит передавать одной и той же шаблонной функции различные контейнеры объектов, содержащие различные типы объектов. Напри м ер, в листинге 9.3 показана обоб щ енная шаблоннал функция search ().
Читать дальшеИнтервал:
Закладка: