Анализ и преобразование последовательных программ с целью устранения индуктивных переменных циклов
Механизм анализа и преобразования последовательных программ с целью устранения индуктивных переменных циклов, мешающих эффективному распараллеливанию. Изменение значения переменной индукции на каждой итерации цикла. Тривиальное преобразование цикла.
| Рубрика | Программирование, компьютеры и кибернетика |
| Вид | статья |
| Язык | русский |
| Дата добавления | 28.10.2018 |
| Размер файла | 255,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Анализ и преобразование последовательных программ с целью устранения индуктивных переменных циклов
14.01.2014 г., Н.А.Катаев
В 2013 году был предложен механизм анализа и преобразования последовательных программ с целью устранения индуктивных переменных циклов, мешающих эффективному распараллеливанию.
Переменная индукции, или индуктивная переменная цикла - переменная, на каждой итерации цикла изменяющая свое значение на некоторую величину, отличную от нуля и инвариантную (неизменную после любого количества итерации) для данного цикла. Введенное определение эквивалентно определению из [1, с. 820].
Значение переменной индукции в начале итерации с номером выражается, во-первых, через значение данной переменной в начале итерации с номером : , во-вторых, через номер итерации: . При этом - значение индукционной переменной перед входом в цикл, и - символьные константы (величины, инвариантные для цикла). Будем называть - шагом индукции, - начальным значением индукции.
Изменение значения переменной индукции на каждой итерации цикла вызывает в цикле антизависимость и зависимость через выход [1, с. 846], устранение которых необходимо для распараллеливания данного цикла.
Переменные индукции обычно используются для обращения к элементам массива. В этом случае знание шага индукции необходимо для доказательства отсутствия зависимости между двумя обращениями и возможности распараллеливания цикла.
Для эффективного распараллеливания последовательных программ необходимо:
1. Выполнить анализ переменных индукции: для каждого цикла программы определить переменные индукции, их начальные значения и шаги.
2. Выполнить преобразование последовательной программы: устранить зависимости, вызванные изменением значений переменных индукции.
Для анализа индукционных переменных было решено воспользоваться подходом, описанным в [1, с. 819] и использующим алгоритм анализа на основе областей [1, c. 803]. Указанный подход обладает следующими недостатками:
1. Анализ выполняется в рамках одной процедуры, без выполнения межпроцедурного анализа.
2. Анализ позволяет определить инварианты циклов, только если они являются афинными выражениями [1, c. 820]. Знание инвариантов циклов необходимо для выполнения предложенного преобразования последовательной программы.
3. Анализ позволяет определить только те индукционные переменные, шаг которых является константой (не символьной константой).
В ходе работы над проектом указанные недостатки были устранены. Анализ выполняется над представлением процесса распараллеливания программы в системе САПФОР [2], разработанном на предыдущем этапе проекта в 2012 году. Таким образом, разработанный в 2013 году алгоритм анализа переменных индукции не зависит от языка программирования и состоит из следующих шагов:
I. Построение иерархии и упорядочивание областей (см. Рис. 1):
1. Выделение сильно связных компонент [3, c. 635] в графе вызовов последовательной программы. Граф вызовов программы - ориентированный граф, вершинами которого являются процедуры, а дуги указывают направление вызова одной процедуры из другой. Каждой дуге графа соответствует список точек вызова, указывающих места в вызывающей процедуре, в которых осуществляется вызов вызываемой процедуры. Сильно связные компоненты разбивают граф вызовов на группы процедур, рекурсивно вызывающих друг друга.
2. Упорядочивание в глубину графа [1, c. 790], полученного на основе графа вызовов, каждая сильно связная компонента которого рассматривается как единая вершина.
3. Для каждой процедуры в порядке установленном на этапе (II.2), а для процедур, входящих в сильно связные компоненты, в произвольном порядке:
a. Построение графа потока управления (CFG) на основе представления процесса распараллеливания в САПФОР. Граф управления процедуры - ориентированный граф, вершинами которого являются базовые блоки [3, c. 641], а дуги показывают направление потока управления в программе. Вызовы процедур выделяются в отдельные базовые блоки, при необходимости могут быть введены временные внутренние переменные для сохранения промежуточных результатов вызовов функций.
b. Построение дерева доминаторов [1, c. 787] для графа потока управления процедуры.
c. Построение глубинного остовного дерева [1, c. 790] для графа потока управления процедуры.
d. Построение дерева естественных циклов [1, c. 798]. В алгоритме предполагается, что граф потока управления процедуры приводим [1, c. 794]. Данное предположение оправдано тем, что при использовании структурированных инструкций (ветвления, циклы) графы потока всегда приводимы. В остальных случаях можно воспользоваться алгоритмом расщепления графа потока [1, c. 816].
e. Получение иерархии областей, являющихся базовыми блоками, телами циклов, циклами и всей процедурой [1, c. 805]. Циклы обрабатываются в направлении обратного обхода дерева циклов (от самых внутренних к внешним). При построении области, являющейся телом цикла, выполняется упорядочивание всех ее подобластей в топологическом порядке [3, c. 632].
II. Восходящий анализ последовательности областей в порядке, обратном установленному на этапе I.
III. Нисходящий анализ в порядке, установленном на этапе I, для поиска значений потока данных в начале и конце каждой области.
Рис. 1. Построение иерархии и упорядочивание областей.
На шагах II и III используется общая схема алгоритма анализа на основе областей с рядом дополнений.
Во-первых, если рассматриваемая в данный момент область является базовым блоком, содержащим вызов процедуры (согласно I.3.а такой базовый блок не может содержать других операций), считается, что данная область является внешней по отношению к области соответствующей всей процедуре.
Во-вторых, передаточные функции, их композиция, сбор и замыкания расширяют описанные в [1, с. 819] с целью устранения недостатков (2) и (3) указанных пере описанием данного алгоритма.
Если после вычисления передаточной функции для инструкции присваивания некоторого значения переменной , вводится вспомогательная ссылочная переменная [1, с. 819] и инструкция присваивания . Далее считается, что . Здесь - символическое отображение [1, c. 822], отображающее переменную на ее представление в виде афинного выражения, - специальный символ, представляющий неафинное выражение.
В результате влияние одной итерации цикла будет подытожено передаточной функцией одного из следующих видов:
1.
2.
3.
Где - константы, - вспомогательные ссылочные переменные, введенные во внешних по отношению к обрабатываемому циклу областях, - вспомогательные ссылочные переменные введенные внутри тела обрабатываемого цикла.
Если значение является инвариантной величиной для обрабатываемого цикла, то в случае (1) или (2) является символьной константой, а в случае (2) переменной индукции с шагом . Так как вспомогательные ссылочные переменные получают значение только один раз в точке появления, сумма имеет величину инвариантную для данного цикла. Для проверки инвариантности суммы достаточно убедиться в инвариантности переменных , то есть убедиться, что на каждой итерации им присваивается одно и то же значение. Для этого достаточно убедиться, что переменные , используемые в выражении из инструкции присваивания , являются инвариантными. Если , то является символьной константой, , то символьной константой, не является. Если и если инструкция присваивания значения вспомогательной ссылочной переменной, доминирует над инструкцией присваивания , то символьной константой, не является (см. Рис. 2), иначе переходим к исследованию переменной . Отметим, что в этом случае инструкция присваивания доминирует над инструкцией присваивания .
Рис. 2. Определение переменной, не являющейся символьной константой
Полученная в процессе анализа информация об переменных индукции и инвариантах циклов позволяет выполнить в автоматическом режиме ряд преобразований, устраняющих в циклах зависимости по данным, вызванные использованием переменных индукции. На Рис. 3 приведено тривиальное преобразование, на выполнении которого основаны другие преобразования, u(VarP) - символьная константа, VarP - множество переменных программы.
индуктивный переменная распараллеливание
|
1. x = u0(VarP) 2. do i = 1, r(VarP) 3. x = x + u(VarP) 4. enddo |
1. x = u0(VarP) 2. do i = 1, r(VarP) 3. x = u0(VarP) + (i-1) * u(VarP) 4. enddo 5. x = u0(VarP) + r(VarP) * u(VarP) |
Рис. 3. Тривиальное преобразование цикла.
Рассмотрим гнездо циклов на Рис. 4.
|
1. x = u0(VarP) 2. do j = 1, rj(VarP) 3. do j = 1, ri(VarP) 4. x = x + u(VarP) 5. enddo 6. enddo |
Рис. 4. Преобразуемое гнездо циклов
Если ri(VarP) - инвариант для цикла по переменной j, то переменная x является переменной индукции для данного цикла и можно выполнить преобразование, показанное на Рис. 5.
|
1. x = u0(VarP) 2. do j = 1, rj(VarP) 3. do j = 1, ri(VarP) 4. x = u0(VarP) + (j - 1) * ri(VarP)* u(VarP) + (i - 1) * u(VarP) 5. enddo 6. enddo 7. x = u0(VarP) + rj(VarP) * ri(VarP)* u(VarP) |
Рис. 5. Преобразование для случая, когда ri(VarP) - инвариант для цикла по переменной j
Если ri(VarP)- инвариантом для цикла по переменной j не является, то переменная x является переменной индукции только для цикла по переменной i. Если воспользоваться тривиальным преобразованием, будет потеряна тесная вложенность циклов. Это может негативно сказаться на эффективности проводимого распараллеливания. Можно ввести дополнительный массив, в котором заранее рассчитать количество итераций внутреннего цикла, выполненных до начала каждой итерации внешнего. Указанное преобразование приведено на Рис. 6. Отметим, что данное преобразование стоит выполнять лишь в том случае, если порождаемые им накладные расходы будут компенсированы полученным выигрышем от распараллеливания цикла. Соответствующие оценки должен выполнять блок распараллеливания (эксперт) системы САПФОР при построении схем распараллеливания программы.
|
1. integer ri_arr(rj(VarP)) 2. 3. rj_arr(1) = r1(VarP) 4. do j = 2, rj(VarP) 5. ri_arr(j) = ri_arr(j-1) + ri(VarP) 6. enddo 7. 8. x = u0(VarP) 9. do j = 1, rj(VarP) 10. do j = 1, ri(VarP) 11. x = u0(VarP) + ri_arr(j) * u(VarP) + (i - 1) * u(VarP) 12. enddo 13. enddo 14. x = u0(VarP) + ri_arr(rj(VarP))* u(VarP) |
Рис. 6. Преобразование для случая, когда ri(VarP) - не инвариант для цикла по переменной j
Возможно ситуация, когда при выполнении описанных преобразований количество итераций в цикле в момент начала выполнения цикла не известно, например, из-за дополнительных выходов из цикла с помощью оператора exit. В этом случае рассчитать значение индукционной переменной после выхода из цикла не возможно.
Для того, чтобы итерации цикла можно было выполнять независимо в произвольном порядке необходимо удостоверится, что значение индукционной переменной не используется после цикла. Для этого необходимо и достаточно, чтобы переменная индукции после преобразования стала приватной [4], а не приватной по выходу [4]. Для этого можно воспользоваться алгоритмом анализа приватных переменных приведенном в [4].
Рассмотрим разработанные алгоритмы на примере программы на языке программирования Фортран, представленной на Рис. 7. Значения массивов a и b после выполнения программы с параметрами N = 2 и M = 2 приведены на Рис. 8.
В циклах из строк 12 и 14 присутствуют зависимости по данным, вызванные использованием вспомогательных переменных индукции k и l, которые могут быть выявлены с помощью разработанного алгоритма анализа переменных индукции. Начальное значение переменных равно 0, шаг равен M.
|
1. program Test 2. parameter (N = 2, M = 2) 3. real a(N, N), b(N * M, N * M), s 4. 5. do j = 1, N * M 6. do i = 1, N * M 7. b(i,j) = (j-1) * N * M + i 8. enddo 9. enddo 10. 11. k = 0 12. do j = 1, N 13. l = 0 14. do i = 1, N 15. s = 0. 16. do kj = 1, M 17. do li = 1, M 18. s = s + b(l + li, k + kj) 19. enddo 20. enddo 21. a(i,j) = s / real(M * M) 22. 23. l = l + M 24. enddo 25. k = k + M 26. enddo 27. 28. s = 0. 29. do j = 1, N 30. do i = 1, N 31. s = s + a(i,j) / 1000000. 32. enddo 33. enddo 34. end |
Рис. 7. Тестовая программа на языке Фортран
Рис. 8. Значения массивов a и b после выполнения программы с параметрами N = 2 и M = 2
Разработанный алгоритм преобразования последовательных программ позволяет заменить циклы из строк 12 и 14 гнездом тесно вложенных циклов, приведенным на Рис. 9.
Воспользовавшись алгоритмом анализа приватных скалярных переменных, описанным в [4], можно доказать, что в преобразованной программе переменные k и l стали приватными и их значения после выхода из цикла не используются.
В результате программа может быть распараллелена как с помощью технологии OpenMP так и в модели DVM. Отметим, что при автоматическом распараллеливании в модели DVM является важным тесная вложенность преобразованных циклов. Результаты запусков преобразованных OpenMP и DVM версий программы приведены в Таблице 1 и Таблице 2.
|
11. do j = 1, N 12. do i = 1, N 13. k = M * (j - 1) 14. l = M * (i - 1) 15. 16. s = 0. 17. do kj = 1, M 18. do li = 1, M 19. s = s + b(l + li, k + kj) 20. enddo 21. enddo 22. a(i,j) = s / real(M * M) 23. еnddo 24. enddo |
Рис 9. Преобразованное гнездо циклов
|
OpenMP |
||||
|
Количество нитей |
Время (мсек.) |
Ускорение преобразованного участка кода относительно |
||
|
Исходной |
Последовательной |
|||
|
Исходная |
0.8978 |
1 |
_ |
|
|
Последовательная |
1.528 |
0.59 |
1 |
|
|
1 |
0.9592 |
0.94 |
1.59 |
|
|
2 |
0.4368 |
2.06 |
3.5 |
|
|
4 |
0.2996 |
3 |
5.1 |
|
|
8 |
0.2098 |
4.28 |
7.28 |
Таблица 1. Результаты запусков OpenMP версии программы с параметрами N = 500 и M = 2
|
DVM |
||||
|
Решетка процессоров |
Время (мсек.) |
Ускорение преобразованного участка кода относительно |
||
|
Исходной |
Последовательной |
|||
|
Исходная |
335.190 |
1 |
_ |
|
|
Последовательная |
335.383 |
0.99 |
1 |
|
|
1 |
335.974 |
0.998 |
0.99 |
|
|
1x2 |
199.071 |
1.68 |
1.68 |
|
|
2x2 |
112.522 |
2.98 |
2.98 |
|
|
2x4 |
43.636 |
7.68 |
7.69 |
Таблица 2. Результаты запусков DVM версии программы с параметрами N = 10000 и M = 2
Ахо А.В., Лам М.С., Сети Р., Ульман Дж.Д. Компиляторы: принципы, технологии и инструментарий, 2-е издание. : Пер. с англ.- М. : ООО "И.Д.Вильямс", 2008.-1184 с. Главы 9-12.
1. Катаев Н.А. Особенности внутреннего представления системы САПФОР. -- Параллельные вычислительные технологии (ПаВТ'2013): труды международной научной конференции (1-5 апреля 2013 г., г. Челябинск). 2013. С. 380-386
2. Алгоритмы: построение и анализ, 2-е издание. : Пер. с англ. - М.: Издательский дом «Вильямс», 2005. - 1296 с. Глава 22.
3. Катаев Н.А. Статический анализ последовательных программ в системе автоматизированного распараллеливания САПФОР // Вестник Нижегородского университета им. Н.И. Лобачевского. - Н. Новгород: Изд-во ННГУ. N5(2) , 2012.
Размещено на Allbest.ru
Подобные документы
Синтаксис языка РНР, его переменные и чувствительность их имен к регистру. Гибкость в отношении типов переменных, преобразование типов. Набор основных типов данных при работе с переменными. Методы передача переменных скрипту. Операторы цикла и выбора.
дипломная работа [27,3 K], добавлен 15.04.2009Области применения быстрых вычислений. Проблемы эффективности последовательных и параллельных программ. Отображение циклов с условными операторами на асинхронные архитектуры. Рассмотрение исследовательских университетских распараллеливающих систем.
презентация [833,3 K], добавлен 07.08.2015История развития программы Паскаль. Типы переменных. Значение переменной для прекращения вычислений. Использование операторов цикла, процедур и функций. Ввод значений М-конца цикла и произведение вычислений по расчётной формуле. Форматированный вывод.
контрольная работа [45,9 K], добавлен 13.07.2013Программирование линейных и ветвящихся процессов; циклов с предусловием, постусловием и параметром для вычисления сложных сумм и произведений рядов; таблицы значений функции двух переменных. Блок-схемы алгоритмов. Тексты программ и результаты их работы.
курсовая работа [2,4 M], добавлен 11.03.2015Возможные тематики задач ЛП: рациональное использование сырья и материалов, задачи оптимизации раскроя. Преобразование неограниченных по знаку переменных. Алгоритм симплекс-метода. Максимизация основной функции и использования искусственных переменных.
презентация [588,2 K], добавлен 28.05.2014Методы статического и динамического анализа зависимостей по данным для последовательных программ. Разработан и реализован алгоритм гибридного анализа, объединяющий достоинства обоих методов. Статическая библиотека представления базы данных САПФОР.
дипломная работа [169,6 K], добавлен 21.11.2010Отладка - процесс обнаружения, устранения синтаксических и семантических ошибок. Точки отслеживания (трассировки). Выполнение отладки в режиме останова. Мониторинг содержимого переменных. Пошаговое выполнение кода. Разработка тестов для отладки программы.
презентация [743,6 K], добавлен 09.12.2013Идентификация треугольников на плоскости, определение их положения и размера. Анализ, отсортировка и преобразование фигур в треугольники с вершинами, находящимися на серединах сторон исходных треугольников с использованием программ на языках F# и Lisp.
курсовая работа [2,0 M], добавлен 16.07.2012Предназначение цикла for - оформление циклов (набора действий) с заданным количеством повторений. Пример программы, выводящей на экран все целые числа от 0 до 99. Решение задачи с помощью двух алгоритмов, используя известные функции ввода-вывода.
лабораторная работа [35,1 K], добавлен 15.07.2009Особенности антивирусных программ (антивирусов) - компьютерных программ, предназначенных для обезвреживания вирусов и различного рода вредоносного ПО, с целью сохранности данных и оптимальной работы ПК. Классификация и примеры антивирусных программ.
реферат [22,4 K], добавлен 26.03.2010


