ТЕХНОЛОГИИ ПРОГРАММИРОВАНИЯ. МАТЕМАТИЧЕСКОЕ И КОМПЬЮТЕРНОЕ МОДЕЛИРОВАНИЕ
УДК 004.42
Е.А. Еремин
К ВОПРОСУ ОБ ОЦЕНКЕ УСКОРЕНИЯ ПРОГРАММЫ ПРИ ИЗУЧЕНИИ ЭФФЕКТА ОТ ПАРАЛЛЕЛЬНЫХ ВЫЧИСЛЕНИЙ
Выведены простые формулы, позволяющие оценить ускорение решения задачи на многопроцессорной системе по сравнению с однопроцессорной машиной. Дополнительно к классическому закону Амдала учитывается удлинение программы при переходе к параллельным вычислениям. В рассматриваемых примерах влияние этого фактора оказалось существенным. Продемонстрировано, как можно проверить полученные аналитические выводы с помощью учебного компьютера «Е14».
Ключевые слова: ускорение, параллельные вычисления, закон Амдала, параллельная программа, многопроцессорная система.
1. Количество выполненных команд как мера времени работы программы
Главный эффект, которого мы добиваемся от применения параллельной вычислительной системы, должен состоять в том, что задача на ней должна считаться быстрее, чем на однопроцессорной машине. Очевидно, что ускорение £ от распределения вычислений между р процессорами определяется формулой
£ = Т1 / Тр, (1)
где Т1 - время получения результата на одном процессоре, а Тр - на всех имеющихся. Чем больше величина £, тем существеннее эффект от применения параллельных вычислений. Практический интерес, естественно, представляют только случаи с £ > 1.
Любая компьютерная программа состоит из отдельных команд. Общее время выполнения всей программы есть не что иное, как сумма времен выполнения каждой из проработавших команд программы (с учетом того, что некоторые команды могли циклически повторяться по несколько раз):
к
Т = (2)
1=1
Несмотря на простоту формулы (2), ее не всегда легко применить на практике. Причина в том, что разные команды состоят из неодинакового количества элементарных действий (микрокоманд или, как часто говорят, тактов), и, следовательно, выполняются за разные промежут-
© Еремин Е.А., 2015
ки времени тг-. Например, для некогда широко распространенного процессора Intel 80386 в [4] приводятся следующие данные. Простейшие операции над целыми числами (копирование, сложение, вычитание, логические операции) требуют от 2 до 7 тактов (заметим, что верхняя граница интервала достигается при извлечении данных из оперативной памяти), а целочисленные умножение и деление выполняется за 9-25 тактов.
К счастью, в ходе борьбы за повышение эффективности выполнения процессорных инструкций инженеры старались всячески оптимизировать скорость для каждой из них и максимально приблизить быстродействие к теоретическим пределам. Это привело к выравниванию времени выполнения базовых команд. В первую очередь эффект был достигнут за счет применения в современных процессорах конвейерных технологий обработки команд. Позаимствовав общую идею из автомобильного производства, изготовители микропроцессоров разделили все инструкции на стандартные этапы, каждый из которых выполняется отдельным устройством. В результате, выполняя очередную команду, процессор способен одновременно делать подготовительные действия по следующим. Подобно тому, как с конвейера автозавода раз в несколько минут сходит готовая машина, процессор каждый такт, как правило, завершает одну команду.
Дополнительной мерой «сглаживания» разницы между операциями с данными из оперативной памяти и из быстродействующих регистров микропроцессора стало применение кэшпамяти. Эта быстрая память (промежуточная между процессором и ОЗУ) существенно ускоряет считывание тех данных, которые уже использовались ранее.
Таким образом, благодаря оптимизации внутреннего устройства современные процессоры выполняют базовые инструкции за одинаковое время. Это положение используется при оценке быстродействия процессоров в большинстве книг по архитектуре компьютеров. Как правило, формула для времени выполнения программы записывается в виде
T = K • CPI / F, (3)
где K - это количество выполненных команд, CPI (Cycles Per Instruction) - количество тактов на одну команду, а F - тактовая частота процессора [3, 7].
Отношение т = CPI / F имеет размерность времени и определяет длительность типовой операции для конкретной модели процессора. Считая время т постоянным, и из (2), и из (3) получаем одинаковое соотношение
T = т • K. (4)
Константа т различна для разных моделей процессоров. Зато K, напротив, слабо зависит от конкретной модели. Причина в том, что общие принципы построения системы команд у процессоров во многом аналогичны [5], а требование сохранения программной совместимости делает эти принципы очень консервативными [7]. Отсюда следует, что программы на уровне машинных команд весьма похожи, а количество выполненных команд K и пропорциональное время их выполнения T можно считать характеристикой программы. Это практически полезный вывод, поскольку он позволяет оценить время работы программы, просто проанализировав ее текст.
Во всех дальнейших оценках мы будем опираться на формулу (4), которая утверждает,
что время исполнения программы пропорционально количеству команд, выполненных в процессе ее работы. Конкретное значение коэффициента пропорциональности т для нас значения не имеет, так как в формулу для ускорения (1) входит отношение двух времен.
2. Классическая оценка - закон Амдала
В 1967 г. сотрудник IBM Джин Амдал (Gene Amdahl) опубликовал статью [6], ставшую впоследствии классической. Ее главная идея заключалась в том, что в любой программе можно выделить некоторую служебную часть (Амдал называет ее термином «housekeeping»), которая по своей природе является последовательной программой. Она никаким образом не поддается распараллеливанию. По мнению Амдала, в большинстве практических алгоритмов последовательная часть достаточно велика, чтобы параллельные вычисления оказались не слишком эффективными, и программисту пришлось сделать выбор в пользу классической однопроцессорной ЭВМ.
В статье не была приведена какая-либо математическая формула, описывающая обсуждаемые закономерности. Позднее, со ссылкой на идеи Амдала, такая формула была опубликована и получила название закона Амдала [1, 3, 8].
1 процессор
t.
т
-1
N раз
/ \
t. ■ ■ ■ t.
т т
N/p раз N/p раз
p процессоров
Рис. 1
Пусть последовательная часть алгоритма выполняется на обычном компьютере за время г,, а предназначенная для распараллеливания циклическая - за гс. При переходе к вычислительной системе с р процессорами г, останется без изменения, зато гс, распределившись между всеми процессорами, пропорционально уменьшится до гс /р (см. рис. 1). В итоге получаем:
Т1 = г, + Хс (5)
Тр = г, + гс / р (6)
Поделим обе части (5) на Т1:
1 = а + гс / Т1. (7)
Здесь а = г, / Т1 есть величина, которая характеризует долю последовательных вычислений в алгоритме.
Теперь подставим (5) и (6) в (1). Поделив числитель и знаменатель на Т1, с учетом (7) получим окончательную формулу закона Амдала
Я =-1--(8)
а + (1 - а)!р
Смысл закона заключается в следующем.
Когда доля последовательных вычислений а велика (т.е. близка к 1), ускорение £ перестает зависеть от р и становится равным £ = 1 / а ~ 1. Последнее означает, что для таких случаев многопроцессорные системы практически бесполезны, сколько бы в них не было процессоров.
Заметим, что и при р ^ ю (процессоров очень много) значение £ ^ 1 / а.
В другом предельном случае а = 0 (т.е. последовательная часть отсутствует вовсе, чего на практике не бывает) из (8) получается £ = р. Такая максимально оптимистическая оценка является асимптотической - к ней стремится ускорение £ при малых а.
В общем случае имеет место промежуточная картина: 1 < £ < р.
Таким образом, закон Амдала показывает, как доля последовательных команд алгоритма а ограничивает возможное благодаря параллельным вычислениям ускорение.
3. Модифицированная оценка ускорения вычислений
При выводе закона Амдала полагалось, что при переходе от однопроцессорного компьютера к многопроцессорной вычислительной системе программа остается неизменной (только уменьшается количество повторений цикла). На практике это не так, и к параллельной программе приходится добавлять дополнительные команды. Рассмотрим, как это повлияет на итоговое время ее выполнения.
3.1. Общий подход.
Для удобства рассуждений сразу перейдем от времени выполнения команд к их количеству (вспомните формулу (4)).
Пусть в исходной однопроцессорной программе К команд в последовательной части и Я команд, которые образуют цикл, выполняемый N раз. В таком случае общее количество выполненных команд в программе равняется
К1 = & + Я^ (9)
Перейдем теперь к параллельной программе для р процессоров. К ней добавится две группы команд (см. рис. 2). Во-первых, вырастет последовательная часть, поскольку появятся расчеты, связанные с распределением работ между процессорами. Обозначим это увеличение числа команд через As. Во-вторых, возрастет количество команд внутри цикла. Причина роста состоит в необходимости как-то «доставить» каждому процессору необходимые исходные данные. Это может быть как отдельный цикл, предварительно копирующий обрабатываемую часть массива, так и команды, обеспечивающие извлечение данных из общей памяти непосредственно внутри основного цикла. В любом случае на каждый циклически обрабатываемый элемент придется на некоторое количество команд Аг больше.
1 процессор
Ы/р раз р процессоров
Рис. 2
В итоге формула для количества команд Кр в параллельной программе для каждого из процессоров усложнится (сравните с (9)):
Кр = К + As) + (Я + Аг) • N / р. (10)
Заметим, что при As = Аг = 0 формулы (9) и (10) немедленно переходят в (5) и (6), если ввести обозначения ts = К и 1С = Я • N.
Проведем совместный анализ полученных формул (9) и (10). Для этого подсчитаем две величины: разность числа команд К1 - Кр и их отношение К1 / Кр. Первая позволит выяснить, как влияют параметры на рост быстродействия параллельных вычислений, а вторая даст обобщение формулы (1) с учетом изменения длины программы.
3.2. Вычисление разности
Вычислим разницу АК = К1 - Кр. Она характеризует, насколько изменится число выполненных команд при мультипроцессорной обработке программы по сравнению с однопроцессорной.
АК = К1 - [(К + As) + (Я + Аг) • N /р] = Я • N • (р - 1) /р - As - Аг • N /р. (11)
Первое слагаемое в (11) описывает классический эффект сокращения вычислительной работы благодаря уменьшению числа повторений циклов. Два последних слагаемых, содержащих As и Аг, появляются из-за учета изменения длины программы. Они входят в формулу с противоположным знаком, так что итоговый результат есть разность между двумя конкурирующими факторами: ростом скорости из-за уменьшения количества циклов и ее падением из-за удлинения параллельной программы. Из формулы также видно, что при больших N влияние Аг многократно сильнее, чем А^.
Естественно, что эффект хоть какого-то ускорения в обработке данных получится при АК > 0 (т.е. когда К1 > Кр).
3.3. Вычисление отношения
Теперь перейдем к вычислению отношения К1 / Кр, которое, согласно (1) и (4), есть интересующее нас ускорение от параллельных вычислений.
Поделив (9) на (10), получим:
£ = (К + Я • N / [(К + А') + (Я + Аг) • N/р]. (12)
Особый интерес для практики представляют задачи с большим количеством повторений цикла N (задачи «небольшого размера» можно решать и на обычном компьютере). В рассматриваемом случае всеми слагаемыми в (12), не содержащими N, можно пренебречь. После сокращения на N останется
£ =^ = (13)
Я + Аг 1 + Аг / Я
И, наконец, введя обозначение Ь = Аг / Я, окончательно имеем асимптотическую формулу для больших N:
£=р / (1 + Ь) (14)
Из (14) видно, что ускорение вычислений, которое имеет место в случае £ > 0, возможно, только когда число процессоров р превысит величину
р > 1 + Ь. (15)
Заметим, что точно такая же формула могла быть получена и из (11).
3.4. Некоторые выводы
Таким образом, нам удалось построить несложную математическую модель, оценивающую выигрыш от применения многопроцессорной системы. Формула (14) выведена в предположении определенных условий. Напомним их еще раз:
1) программа состоит из двух частей - последовательной и циклической (параллельной). Более сложные алгоритмы (например, развилки или вложенные циклы) не рассматриваются. Данный подход полностью повторяет принятый при выводе закона Амдала.
2) количество циклов достаточно велико, так что временем выполнения последовательной части можно пренебречь. В терминах закона Амдала (8) это малые значения а. Если условие а << 1 не выполняется, придется пользоваться более сложной формулой (12).
3) все основные команды процессор выполняет за одинаковое время, что позволяет перейти от времени выполнения к числу команд с помощью (4).
Подчеркнем, что в отличие от закона Амдала, выведенные формулы учитывают удлинение программы при переносе с однопроцессорной системы на многопроцессорную.
Интересным результатом анализа является возможность делать выводы (в рамках указанных выше допущений) об эффективности параллельных вычислений исключительно по устройству главного цикла программы.
4. Практическая проверка оценок
Выведенные формулы были проверены с помощью учебного компьютера «Е14» [2], который представляет собой программное обеспечение для изучения принципов работы многопроцессорных систем. «Е14» это виртуальная многопроцессорная машина. Она имеет пять процессоров, из которых один является главным (он распределяет работу и руководит вычислениями), а четыре - подчиненными (они производят параллельные вычисления).
Полезной для нас функцией программы является автоматический подсчет числа выполненных команд. Полученные данные могут быть подставлены в выведенные ранее формулы с целью проверки их правильности.
Были решены три тестовые задачи.
1. Суммирование элементов одномерного массива из N целых чисел с помощью стандартного алгоритма: сначала центральный процессор копирует в память каждого из четырех процессоров нужную часть массива, а затем запускает во всех процессорах программу суммирования.
2. Решение той же задачи, но с использованием другого алгоритма: каждый из процессоров при осуществлении суммирования самостоятельно считывает нужные ему элементы массива из общей памяти.
3. Заполнение одномерного массива последовательными нечетными числами; алгоритм во многом похож на предыдущий, только считывание исходных данных из общей памяти в нем заменено записью туда результатов.
Для численных оценок максимально возможного ускорения £ использовалась формула (14). Во всех трех задачах число процессоров р было равно 4. Анализ программы позволил легко подсчитать количество команд в рабочем цикле однопроцессорной программы Я и дополнительные команды, связанные с передачей элементов массива Аг. Эти данные подставлялись в формулы, и вычислялось значение ускорения £. Полученные результаты сведены в следующую таблицу:
Задача Р Я Аг Ь
1 4 8 2 1,33
2 4 4 5 1,25 1,78
3 8 4 0,5 2,67
Вычислив предельные значения для больших N, можно проверить их путем непосредственного исполнения каждой из написанных программ на учебном компьютере «Е14». Для всех трех случаев сначала делался расчет только на одном (главном) процессоре, что давало значение К1. Затем запускался четырехпроцессорный вариант параллельной программы и определялось Кр. Отношение полученных чисел давало значение £ для выбранного N. Расчеты проводились для различных значений N, после чего строился график £(^) - см. рис. 3.
Номера графиков на рис.3 совпадают с приведенными выше номерами задач. Для каждого из трех графиков пунктиром построена асимптота (а1 - а3), значение для которой взято из последнего столбца таблицы. Отчетливо видно, что при больших N графики действительно стремятся к соответствующим значениям.
На этом же рисунке для сравнения построены графики классического закона Амдала (8). Как видно из формулы, для этого (считая р заданным) достаточно определить долю а последовательных команд в (однопроцессорном!) алгоритме: а = К / К1. Для задачи суммирования К = 5, а для заполнения массива нечетными числами К = 4. Значение К1 легко определяется по
формуле (9). Заметим, что тесты номер 1 и 2 относятся к одной и той же задаче, а значит, им соответствует единая кривая закона Амдала (Ам12 на рис. 3). Как видно из рис.3, учет изменения длины программы существенно «сдвигает» графики в сторону меньших что подтверждает максимальную оптимистичность закона Амдала.
4
3,5 3
« 2,5 2 1.5 1
Рис. 3
Дополнительные практически полезные выводы можно получить из попарного сравнения графиков на рис. 3.
Сначала сопоставим между собой графики 1 и 2. Это одна и та же задача, но решенная с помощью различных алгоритмов. Главное различие этих алгоритмов состоит в значениях Аг (см. таблицу). Для кривой 1 соответствующее значение больше, и график ожидаемо идет ниже: чем меньше команд дополняется в цикл при переходе к параллельной программе, тем она работает быстрее и тем, следовательно, выше эффект от применения многопроцессорной системы.
Теперь сравним графики 2 и 3. Они соответствуют разным задачам. Значения Аг для них близки, но зато заметно отличается величина Ь. Мы видим, что эффект ускорения выше для меньших Ь = Аг / Я. Таким образом, для повышения эффекта от параллельности вычислений желательно, чтобы доля дополнительных команд Аг составляла как можно меньшую часть от Я. На практике просматривается два пути: первый - стараться уменьшить Аг, что возможно лишь до определенного предела, а второй - увеличивать Я, т.е. решать более сложные задачи. Последний вывод (на сложных задачах эффекты от применения параллельности будут выше) благоприятен для практики.
Таким образом, выведены простые формулы, позволяющие оценить ускорение решения задачи на многопроцессорной системе по сравнению с однопроцессорной машиной. Показано, что учет изменения длины программы при переходе к параллельным вычислениям приводит к результатам, существенно отличающимся от вычисленных с помощью классического закона Амдала. Продемонстрировано, как можно проверить полученные аналитические выводы с помощью учебного компьютера «Е14».
Список литературы
1. Амдал Дж. Компьютерная архитектура и закон Амдала // Открытые системы. - 2014. -№ 2 [Электронный ресурс]. - URL: http://www.osp.ru/os/2014/02/13040049/ (дата обращения: 23.12.2015).
2. Еремин Е.А. О выборе подхода к построению компьютерной поддержки для изучения многопроцессорных систем // Вестник Пермского государственного гуманитарно-педагогического университета. Серия: Информационные компьютерные технологии в образовании. - 2014. - Вып. 10. - С.5-14.
3. Крейгон Х. Архитектура компьютеров и ее реализация. - М.: Мир, 2004. - 416 с.
4. Смит Б.Э. Джонсон М.Т. Архитектура и программирование процессора INTEL 80386. - М.: Конкорд, 1992. - 334 с.
5. Столлингс В. Структурная организация и архитектура компьютерных систем. - М.: Издательский дом «Вильямс», 2002. - 896 с.
6. Amdahl G.M. Validity of the Single Processor Approach to Achieving Large Scale Computing Capabilities // Proceedings AFIPS Spring Joint Computer Conference. Reston, VA: AFIPS Press, 1967. - P. 483-485.
7. Shen J.P., Lipasti M.H. Modern Processor Design: Fundamentals of Superscalar Processors. New Delhi: Tata McGraw-Hill, 2005. - 656 p.
8. Ware W. The Ultimate Computer // IEEE Spectrum. -1972, - V. 9, - P. 84-91.