Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

malyshkin_ve_korneev_vd_-_parallelnoe_programmirovanie_multikompyuterov

.pdf
Скачиваний:
66
Добавлен:
28.03.2016
Размер:
3.12 Mб
Скачать

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

ина работу на гетерогенной системах.

5)компиляторами для Fortran(a) и C.

Эффективность и надежность обеспечиваются:

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

2)использованием непрозрачных объектов в MPI

(группы, коммуникаторы, типы и т.д.);

3)хорошей реализацией функций передачи данных, адаптирующихся к структуре физической системы.

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

Почему OpenMP? OpenMP является стандартом для программирования на масштабируемых SMP-системах (SSMP, ccNUMA, и т.д.) в модели общей памяти (shared memory model). Примерами систем с общей памятью, масштабируемых до большого числа процессоров, могут служить суперкомпьютеры Cray Origin2000 (до 128 процессоров), HP 9000 V-class (до 32 процессоров в одном узле, а в конфигурации из 4 узлов - до 128 процессоров), Sun Starfire (до 64 процессоров).

MPI тоже работает на таких системах, однако модель передачи сообщений недостаточно эффективна на SMP- системах. POSIX-интерфейс для организации нитей (Pthreads) поддерживается широко (практически на всех UNIX-системах), однако по многим причинам не подходит для практического параллельного программирования: нет поддержки Fortran-а, слишком низкий уровень программирования, нет поддержки параллелизма по данным.

358

OpenMP можно рассматривать как высокоуровневую надстройку над Pthreads (или аналогичными библиотеками нитей). Многие поставщики SMP-архитектур (Sun, HP, SGI) в своих компиляторах поддерживают специальные директивы для распараллеливания циклов. Однако эти наборы директив, как правило, 1) весьма ограничены; 2) несовместимы между собой; в результате чего разработчикам приходится распараллеливать приложение отдельно для каждой платформы. OpenMP является во многом обобщением и расширением упомянутых наборов директив.

Какие преимущества OpenMP дает разработчику?

1.За счет идеи "инкрементального распараллеливания" OpenMP идеально подходит для разработчиков, желающих быстро распараллелить свои вычислительные программы с большими параллельными циклами. Разработчик не создает новую параллельную программу, а просто последовательно добавляет в текст программы OpenMP-директивы.

2.При этом, OpenMP - достаточно гибкий механизм, предоставляющий разработчику большие возможности контроля над поведением параллельного приложения.

3.Предполагается, что OpenMP-программа на однопроцессорной платформе может быть использована в качестве последовательной программы, т.е. нет необходимости поддерживать последовательную и параллельную версии. Директивы OpenMP просто игнорируются последовательным компилятором.

4.Одним из достоинств OpenMP его разработчики считают поддержку так называемых "orphan" (оторванных) директив, то есть директивы синхронизации и распределения работы могут не входить непосредственно в лексический контекст параллельной области.

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

359

этим эта модель интересна. Кроме того, эта система программирования имеет большую поддержку многих крупных фирм производителей.

Первичные цели при развитии HPF включают:

1.Поддержку параллелизма по данным.

2.Мобильность задания пересекающихся различных архитектур (в основном решеток).

3.Высокую эффективность на параллельных компьютерах

снеоднородными затратами доступа к памяти.

4.Возможность использования HPF-программы на однопроцессорной платформе в качестве последовательной программы, т.е. нет необходимости поддерживать последовательную и параллельную версии. Директивы HPF просто игнорируются последовательным компилятором.

5.Использование стандартного ФОРТРАНа (в настоящее время ФОРТРАН 95) как основы;

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

MPI).

Вторичные цели включают:

1.Возможность расширения в случае расширения в будущим стандартов для ФОРТРАНа и C;

2.Эволюционный путь развития для того, чтобы была возможность непротиворечивым образом добавлять расширения к системе программирования.

360

Рис.8.1. Три модели параллельного программирования

361

8.2.Программирование на распределенных мультикомпьютерах и примеры параллельных программ

вMPI

Вэтом параграфе приводятся примеры параллельных алгоритмов решения задач на вычислительных системах с распределенной памятью с использованием системы параллельного программирования MPI. Приведенные здесь параллельные программы решения задач являются иллюстрационными, демонстрирующими способы распараллеливания задач подобного класса, и показывающими применение и возможности функций MPI. Информация по MPI может быть получена, например, в [20] или в информационных ресурсах сети Интернет.

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

Представленные здесь примеры используют в основном SPMD-модель вычислений. Однородное распределение данных по компьютерам – основа для хорошего баланса времени, затрачиваемого на вычисления, и времени, затрачиваемого на взаимодействия ветвей параллельной программы. При таком распределении преследуется цель – равенство объёмов распределяемых частей данных и соответствие нумерации распределяемых частей данных нумерации компьютеров в системе. Исходными данными рассматриваемых здесь алгоритмов являются матрицы, векторы и 2D (двумерное) пространство вычислений. В этих алгоритмах применяются

362

следующие способы однородного распределения данных:

горизонтальными полосами, вертикальными полосами и циклическими горизонтальными полосами. При распределении горизонтальными полосами матрица, вектор или 2D

пространство "разрезается" на полосы по строкам (далее слово "разрезанная" будем писать без кавычек и матрицу, вектор или 2D пространство обозначать для краткости словом - данные). Пусть M – количество строк матрицы, количество элементов вектора или количество строк узлов 2D пространства, P – количество виртуальных компьютеров в системе, С1 = М/Р – целая часть от деления, С2 = М%Р – дробная часть. Данные разрезаются на Р полос. Первые (Р– С2) полос имеют по С1 строки, а остальные С2 полосы имеют по С1+1 строки. Полосы данных распределяются по компьютерам следующим образом. Первая полоса помещается в компьютер с номером 0, вторая полоса – в компьютер 1, и т. д. Такое распределение полос по компьютерам учитывается в параллельном алгоритме. Распределение вертикальными полосами аналогично предыдущему, только в распределении участвуют столбцы матрицы или столбцы узлов 2D пространства. И, наконец,

распределение циклическими горизонтальными полосами. При таком распределении данные разрезаются на количество полос значительно большее, чем количество компьютеров. И чаще всего полоса состоит из одной строки. Первая полоса загружается в компьютер 0, вторая – в компьютер 1, и т.д., затем, (Р-1)-я полоса снова в компьютер 0, Р-я полоса в компьютер 1, и т.д.

Приведенные два алгоритма решения СЛАУ методом Гаусса показывают, что однородность распределения данных сама по себе еще недостаточна для эффективности алгоритма. Эффективность алгоритмов зависит еще и от способа распределения данных. Разные способы представления данных влекут, соответственно, и разные организации алгоритмов, обрабатывающих их.

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

363

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

8.2.1.1 Алгоритм 1. Заданы две исходные матрицы A и B. Вычисляется произведение C = А х B, где А - матрица n1 х n2, и B - матрица n2 х n3. Матрица результатов C имеет размер n1 х n3. Исходные матрицы предварительно разрезаны на полосы, полосы записаны на дисковую память отдельными файлами со своими именами и доступны всем компьютерам. Матрица результатов возвращается в нулевой процесс.

Реализация алгоритма выполняется на кольце из p1 компьютеров. Матрицы разрезаны как показано на рис. 8.2. матрица А разрезана на p1 горизонтальных полос, матрица B разрезана на p1 вертикальных полос, и матрица результата C разрезана на p1 полосы. Здесь предполагается, что в память каждого компьютера загружается и может находиться только одна полоса матрицы А и одна полоса матрицы B.

364

C

Рис. 8.2. Разрезание произведения двух компьютеров.

A

 

данных

для

матриц

при

B

параллельного алгоритма вычислении на кольце

Поскольку по условию в компьютерах находится по одной полосе матриц, то полосы матрицы B (либо полосы матрицы A) необходимо "прокрутить" по кольцу компьютеров мимо полос матрицы A (матрицы B). Каждый сдвиг полос вдоль кольца и соответствующее умножение представлено на рис. 8.3 в виде отдельного шага. На каждом таком шаге вычисляется только часть полосы. Процесс i вычисляет на j-м шаге произведение i- й горизонтальной полосы матрицы A и j-й вертикальной полосы матрицы B, произведение получено в подматрице (i,j) матрицы C. Текст программы, реализующий алгоритм, приведен ниже.

Последовательные стадии вычислений иллюстрируются на рис. 8.3.

1.Каждый компьютер считывает с диска соответствующую ему полосу матрицы А. Нулевая полоса должна считываться нулевым компьютером, первая полоса - первым компьютером и т.д., последняя полоса - считывается последним компьютером. На рис. 8.3. полосы матрицы А и B пронумерованы.

2.Каждый компьютер считывает с диска соответствующую ему полосу матрицы B. В данном случае нулевая полоса должна считываться нулевым компьютером, первая полоса -

365

первым компьютером и т.д., последняя полоса - считывается последним компьютером.

3.Вычислительный шаг 1. Каждый процесс вычисляет одну подматрицу произведения. Вертикальные полосы матрицы B сдвигаются вдоль кольца компьютеров.

4.Вычислительный шаг 2. Каждый процесс вычисляет одну подматрицу произведения. Вертикальные полосы матрицы B сдвигаются вдоль кольца компьютеров. И т. д.

5.Вычислительный шаг p1-1. Каждый процесс вычисляет одну подматрицу произведения. Вертикальные полосы матрицы B сдвигаются вдоль кольца компьютеров.

6.Вычислительный шаг p1. Каждый процесс вычисляет одну подматрицу произведения. Вертикальные полосы матрицы B сдвигаются вдоль кольца компьютеров.

7.Матрица C собирается в нулевом компьютере.

Если "прокручивать" вертикальные полосы матрицы B, то матрица С будет распределена горизонтальными полосами, а если "прокручивать" горизонтальные полосы матрицы A, то матрица С будет распределена вертикальными полосами. Алгоритм характерен тем, что после каждого шага вычислений осуществляется обмен данными.

Если, время передачи данных велико по сравнению с временем вычислений, либо каналы передачи данных медленные, то ускорение алгоритма, по сравнению с последовательным, будет не высока.

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

366

 

1. scatter A

 

0

0

1

1

 

 

 

 

x

=

 

x

=

3. Шаг 1

 

 

 

3

3

 

2

 

 

2

 

 

x

=

x

=

 

 

 

0

2

 

3

 

 

1

 

 

x

=

x

=

 

 

 

 

2. scatter B

 

 

1

 

2

 

0

 

1

1

 

 

 

 

x

=

 

x

=

4. Шаг 2

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

 

 

 

 

3

 

 

 

 

 

 

3

x

 

=

2

x

=

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

0

 

 

 

 

 

 

0

x

 

=

1

x

 

 

 

=

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5. Шаг 3

 

 

6. Шаг 4

 

 

 

 

 

1

 

0

2

1

2

 

3

2

3

 

x

x

=

x =

x =

 

=

 

 

 

7. Сбор результатов в С

367

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]