Лекция № 3: Свойства параллельных алгоритмов
Чтобы ускорить решение задачи, не достаточно иметь параллельную вычислительную систему. Кроме этого нужно ещё создать для такой системы специальную (параллельную) программу. Для того чтобы алгоритм мог быть эффективно реализован в виде параллельной программы, он должен обладать внутренним параллелизмом.
Граф вычислительного алгоритма
Любой алгоритм принимает исходные данные, проделывает над ними операции, и выдаёт результат. Если рассматривать этот процесс с конца, то можно заметить, что для получения результата должны быть готовы предыдущие данные, которые непосредственно используются для его получения. Эти данные, в свою очередь, зависят от других данных, и так далее до исходных данных.
Рассмотрим, например, алгоритм вычисления выражения:
![]() | (1) |
Вначале нужно вычислить произведения
и
, затем извлечь корень, и, наконец, выполнить сложение. Мы не можем выполнить сложение, пока не вычислены оба его аргумента. Описанный алгоритм можно изобразить следующим образом:

Рисунок 1. Схема вычисления выражения (1)
Мы видим, что процесс обработки данных может быть выражен в виде однонаправленного графа. Такой граф можно изобразить на плоскости, причём каждую арифметическую операцию располагать максимально высоко (если ось времени направлена вниз), но не выше тех операций, результат которых нужен для её вычисления. В таком случае высота графа будет равна минимальному времени (числу шагов/этапов) решения этой задачи на идеальной параллельной вычислительной системе с неограниченным числом вычислителей.
Степень параллелизма
Степенью параллелизма этапа численного алгоритма называется число операций, которые на данном этапе можно выполнять параллельно (ширина графа, построенного описанным выше способом).
Проиллюстрируем это определение несколькими примерами. Начнём с задачи сложения двух векторов
и
размерности n. Сложения
независимы и могут выполняться параллельно:

Рисунок 2. Схема сложения векторов
Таким образом, степень параллелизма этого алгоритма равна n. Отметим, что понятие степени параллелизма не связано с числом процессоров системы, оно является характеристикой, внутренне присущей алгоритму. От числа процессоров зависит время, необходимое для завершения вычислений. Например, если
, и число процессоров p также равно
, то все суммы теоретически можно вычислить за один временной шаг, однако при
потребуется
временны́х шагов.
Рассмотрим теперь задачу сложения n чисел
. Обычный последовательный алгоритм
![]() | (2) |
непригоден для параллельных вычислений. Однако задача может быть решена другим методом. На рисунке показано, как можно осуществить суммирование восьми чисел в три этапа при помощи алгоритма сдваивания:

Рисунок 3. Схема алгоритма сдваивания
Задача суммирования разделена на меньшие подзадачи, которые могут решаться независимо. Для
чисел алгоритм сдваивания состоит из
этапов; на первом этапе выполняются
сложений, на втором —
, и так далее, пока на последнем этапе не будет выполнено единственное сложение. Общее число операций сложения равно
: такое же, как в последовательном алгоритме (2).
Очевидно, что на первом этапе степень параллелизма равна
, на втором —
, и так далее. Подобный алгоритм может быть применён и для других целей, например, для нахождения максимального элемента в массиве и даже для сортировки (сортировка слиянием).
Сложение алгоритмом сдваивания имеет ещё одно преимущество перед последовательным сложением: он обеспечивает лучшую (в среднем) точность суммирования при использовании чисел с плавающей точкой.
Средней степенью параллелизма численного алгоритма называется отношение общего числа операций алгоритма к числу его этапов. Очевидно, для алгоритма сдваивания средняя степень параллелизма равна:
![]() | (3) |
Со степенью параллелизма также связано понятие зернистости. Крупнозернистость задачи означает наличие в ней больших независимых подзадач, которые можно обрабатывать параллельно. Примером может служить задача решения нескольких различных больших систем линейных уравнений, решения которых комбинируются на более поздних стадиях вычислительного процесса. Мелкозернистость соответствует возможности параллельного выполнения малых подзадач. Так, для сложения двух векторов подзадачей является сложение компонент, имеющих одинаковый номер. Крупнозернистые алгоритмы сложно распараллелить на большом числе процессоров.
Ускорение и эффективность параллельного алгоритма
Ускорением параллельного алгоритма называется отношение:
![]() | (4) |
где
— время вычисления задачи на p процессорах. Заметим, что в определении подразумеваются действительные времена вычислений. Это делает определение более полезным на практике, но затрудняет его использование в том случае, если требуемые времена неизвестны. Для идеальной вычислительной системы и идеальной параллельной реализации алгоритма его ускорение равно средней степени параллелизма.
С ускорением связана эффективность параллельного алгоритма. Эффективностью параллельного алгоритма называется величина:
![]() | (5) |
По определению,
. Теоретически должно быть
и
. Если алгоритм достигает максимального ускорения (
), то
. На практике эффективность убывает при увеличении числа процессоров.
Иногда бывают случаи, когда
(«суперлинейное ускорение»). Эта аномалия вызвана, чаще всего, двумя причинами:
- В качестве последовательного алгоритма был применён не самый быстрый алгоритм из доступных.
- С увеличением количества вычислителей растёт суммарный объём их оперативной и кэш памяти. Поэтому всё большая часть данных задачи умещается в оперативной памяти и не требует подкачки с диска, или (чаще всего) умещается в кэше («аггрегация кэшей»). В таких случаях для точного измерения эффективности реализованного алгоритма следует уменьшать объём кэш памяти каждого вычислителя обратно пропорционально числу вычислителей.
Закон Амдаля
Машинное время параллельной вычислительной системы сто́ит некоторых денег, поэтому одной из целей конструирования параллельных алгоритмов является достижение по возможности больших эффективности и ускорения. Однако эта ситуация не всегда достижима: на практике максимальное ускорение можно получить лишь для тривиальных задач. Главные факторы, обуславливающие отклонение от максимального ускорения, таковы:
- Отсутствие максимального параллелизма в алгоритме и/или несбалансированность нагрузки процессоров.
- Обмены, конфликты памяти и время синхронизации.
Хотя задержки, связанные с синхронизацией, обменами и конфликтами памяти, по своей природе различны, их воздействие на общий процесс вычисления одинаково: они замедляют его на время, необходимое для подготовки данных, нужных для дальнейшего счета. Поэтому иногда следует объединять все три фактора задержки, как это сделано в следующем определении.
Временем подготовки данных называется задержка, вызванная обменами, конфликтами памяти или синхронизацией и необходимая для того, чтобы разместить данные, требующиеся для продолжения вычислений, в соответствующих ячейках памяти.
Обратимся теперь к фактору отсутствия максимального параллелизма. Он может проявляться по-разному. При сложении n чисел мы видели, что на первом этапе алгоритма параллелизм максимален, однако на каждом последующем этапе степень параллелизма уменьшается вдвое. Таким образом, в большинстве случаев средняя степень параллелизма алгоритма меньше n.
Рассмотрим простую модель, когда часть операций в алгоритме выполняется одним вычислителем, а оставшиеся операции выполняются параллельно всеми вычислителями, тогда:
![]() | (6) |
где
— время, затрачиваемое на реализацию алгоритма на одном процессоре,
— доля операций в алгоритме, выполняемых одним процессором,
— доля операций, выполняемых всеми p процессорами,
— общее время, требуемое для подготовки данных. В случае если
и
, ускорение максимально:
. Предпосылки данного случая заключаются в том, что все операции выполняются с максимальным параллелизмом и отсутствуют задержки на подготовку данных. В случае
получаем формулу, называемую законом Амдаля:
![]() | (7) |
Закон Амдаля, несмотря на то, что он не учитывает многих факторов, накладывает сильные ограничения на максимально достижимую эффективность параллельного алгоритма.
Предположим, например, что
, то есть две трети операций в алгоритме могут выполняться параллельно, а треть — нет. Тогда ускорение
. Таким образом, независимо от количества процессоров и даже при игнорировании всех затрат на подготовку данных мы не сможем ускорить решение задачи более, чем в три раза. Графики зависимости ускорения и эффективности от числа процессоров показаны на рисунке для
:
Из графика видно, что если треть операций алгоритма не удаётся распараллелить, то для того, чтобы ускорить решение задачи в два раза, её нужно запустить на 4-х процессорах, а для того, чтобы ускорить в 2.5 раза — аж на 10-ти процессорах. И это лишь теоретическая оценка: на практике будет ещё хуже.
Для сравнения на рисунке 5 показаны те же графики для
:

Рисунок 5. Ускорение и эффективность,
вычисленные по уравнению (7) для
. Обратите внимание на другой масштаб вертикальной оси по сравнению с предыдущим рисунком.
Видим, что в этом случае ситуация гораздо лучше.
Очень важно на ранних стадиях разработки алгоритма оценить его характеристики, чтобы определить, будет ли эта разработка целесообразной. Ведь может оказаться так, что программу нужно будет запустить всего несколько раз для получения результатов. И иногда проще подождать неделю, пока отработает последовательная программа, чем на неделю дольше создавать параллельную программу.
P.S.
Бо́льшая часть материала лекции взята отсюда: http://oldunesco.kemsu.ru/mps/ (параграфы 26–28).








Три отзыва на запись «Лекция № 3: Свойства параллельных алгоритмов»
Автор: Гриня. Дата: 25-го января 2010 г. Время: 20:10.
Аффтар писчи исчо!!!
Автор: Гриня. Дата: 25-го января 2010 г. Время: 20:12.
А вапще я первый нах!
Автор: Сашка. Дата: 20-го мая 2011 г. Время: 12:36.
второй, чо