План - МЦСТ

advertisement
Оптимизация участков кода
с малым количеством исполнений
А.Б. Галазин
Введение
Оптимизация по профилю выполнения (profile-guided optimizations, или PGO) [1] является
одной из самых развитых технологий оптимизации. Этот метод позволяет компилятору использовать в процессе оптимизации данные, собранные во время выполнения программы. Обладая
информацией об участках кода, выполняющихся с высокой вероятностью, компилятор может
более избирательно подходить к оптимизации и принимать более обоснованные решения.
Оптимизирующая компиляция с использованием профиля состоит из трех этапов, показанных на Рис. 1.
Используя
100000
000101
профиль000000
111110
ную
информацию,
компилятор
может
Исходные файлы
Компиляция и инструментирование
Инструментированный
принимать
исполняемый код
более
эффективные
решения
о
наложении
итераций
цикла
Исполнение
Профильная информация
[2],
прединструментированного кода
подкачке дан100000
ных [3],
векто000101
000000
ризации
[4], вы111110
носе
инвариантных
вычислений,
преобИсходные файлы и профильная
Оптимизирующая компиляция
Финальный исполняемый код
информация
разовании потока
управления в
поток
Рис. 1. Оптимизирующая компиляция с использованием профиля
данных.
Учет
профильной информации является одним из основных факторов при принятии решения об эффективности различных преобразований. Компиляторы, обычно, стараются избегать преобразований над участками кода с незначительным количеством повторений. Однако имеются оптимизации, для которых основным фактором при принятии решений является информация об
эффективности планирования преобразуемого кода. Поэтому такие оптимизации могут повлечь
перемешивание маловероятных вычислений с высоковероятными. К таким преобразованиям
относятся преобразование безусловного кода в предикатный [5], иначе if-conversion, различные
варианты глобального планирования [5], включающие, в том числе, перенос операций на спланированном коде.
58
В данной работе описана оптимизация, позволяющая не учитывать участки кода с нулевыми
или незначительно отличающимися от нуля значениями повторяемости кода и избежать, таким
образом, перемешивания высоковероятных вычислений с маловероятными. Оптимизация была
реализована в рамках проекта по созданию оптимизирующего компилятора для микропроцессора Эльбрус-3М [6-8]. Микропроцессор Эльбрус-3M относится к классу VLIW (Very Long Instruction Word) [9-13] архитектур. Экспериментальные результаты были получены на задачах
пакета Spec95 [14].
Определения
Процесс оптимизирующей компиляции непосредственно связан такими понятиями как промежуточное представление и граф управления. Опишем эти понятия.
Промежуточное представление – структура данных, фиксирующая состояние(я) программы в процессе компиляции от исходной записи на входном языке до выходного состояния –
целевого исходного кода программы, исполняемой на заданной платформе. Основные функции
промежуточного представления:
- отображение и сохранение инвариантной семантики исходной программы;
- базис для проведения анализа и оптимизирующих преобразований программы;
- интерфейс взаимодействия со всеми фазами компиляции, позволяющий фиксировать и передавать изменения программы.
Линейным участком будем называть совокупность операций с выделенными входной и выходной операциями, передача управления в который может происходить только через входную
операцию.
Граф управления [15,16] – аналитическая структура, которую логически можно представить
как управляющую надстройку над промежуточным представлением. И в реализации наиболее
распространенной схемой является представление управляющего графа как отдельного объекта, имеющего взаимно однозначное соответствие с операционной семантикой промежуточного
представления, в которой выражена вся полнота семантики передачи управления. Представляет
собой направленный связный граф, каждый узел (вершина) которого соответствует линейному
участку, а дугам - управляющие связи между ними, отображающие передачу управления. В
графе есть два выделенных узла: узел START, не имеющий входных дуг, и узел STOP, не имеющий выходных дуг.
В случае наличия профильной информации оптимизирующий компилятор добавляет ее в
граф управления. В графе управления, снабженном профильной информацией, каждая дуга
имеет некоторую вероятность, которая представляет собой вероятность передачи управления
по этой дуге относительно узла, из которого она выходит. Помимо вероятностей у каждого узла
и каждой дуги есть абсолютные счетчики. Счетчик узла START есть информация о том, сколько раз управление передается на вход данного графа управления. Счетчики – целые числа, вероятности – вещественные числа.
Использование профиля при компиляции
В рамках проекта по созданию оптимизирующего компилятора для микропроцессора Эльбрус-3М основным объектом, с которым оперируют средства анализа эффективности проведенных преобразований и коррекции профиля после применения различных оптимизаций, является значение вероятности дуги перехода.
Значения вероятностей рассчитываются при загрузке профиля на основе количества исполнений участков кода и становятся основным объектом для компонент компилятора, использующих профильную информацию. Именно на основании этих значений происходит расчет значений счетчиков узлов, а затем и показателей эффективности после различных преобразований
графа управления. Поэтому в дальнейшем мы будем оперировать в основном со значениями
вероятностей на дугах, соединяющих узлы.
Оптимизируемые задачи, в том числе и задачи, на которых проводились экспериментальные
измерения, имеют различный по равномерности распределения значений счетчиков и вероятностей профиль. В случае сильной разреженности профиля, то есть когда имеется значительное
59
количество узлов с нулевыми счетчиками, такие оптимизации как if-conversion, глобальное
планирование приводят к перемешиванию вычислений из участков с большими значениями
счетчиков с вычислениями из участков с малыми значениями счетчиков, поскольку при анализе
эффективности преобразований опираются в основном на результаты планирования. В итоге
компилятор создает код, в котором критические по количеству исполнений вычисления разрежены вычислениями, результаты которых могут и не понадобиться, что в итоге увеличивает
время работы оптимизированной программы.
Следует отметить, что компилятор пытается бороться с подобными перемешиваниями.
Например, при подготовке графа управления для глобального планирования или if-conversion
проводится дополнительное дублирование кода и разметка регионов, которые будут оптимизироваться, так, чтобы перемешивание вычислений со значительной разницей в количестве исполнений было минимальным. Такие шаги не всегда эффективны, поскольку в процессе компиляции более ранние оптимизации могут сделать профиль более ровным, тем самым, будет
утеряна информация о редких вычислениях.
Описанная в работе оптимизация находится на одной из самых ранних стадий процесса оптимизирующей компиляции и помогает избежать перемешивания разновероятных вычислений,
сокращая, таким образом, время работы оптимизированного кода.
Алгоритм работы оптимизации
Пусть имеется граф управления, снабженный профильной информацией. В графе управления имеются дуги с нулевыми значениями вероятностей, как на Рис. 2.
Node 1
p=1.0
p=0.0
Node 2
Node 3
Node 4
Node 5
Node 6
Node 7
Рис. 2. Подграф с нулевыми значениями вероятностей
Алгоритм устроен следующим образом:
1. Цикл по всем дугам графа управления
2.
Если вероятность дуги равна нулю
3.
Добавить все узлы (кроме STOP),достижимые вниз из дуги,
в множество С копируемых узлов
4.
Пометить дугу маркером
5.
Конец если
6. Конец цикла
7. Цикл по всем узлам из множества С
8.
Создать копию узла
9.
Пометить копию специальной меткой
10.
Цикл по всем дугам, входящим в узел
11.
Если дуга помечена маркером
12.
Перенаправить дугу на копию
60
13.
Конец цикла
14. Конец цикла
15. Цикл по всем узлам графа управления
16.
Если узел недостижим из узла START
17.
Удалить узел
18. Конец цикла
Следует отметить, что копирование узла сохраняет структуру последователей. Поясним на
примере. Допустим, узел N является последователем узла M. Рассмотрим следующие ситуации:
a. Узлы N и M входят в множество С;
b. Узел N входит в множество С, узел M не входит.
Результаты копирования в случаях a
и b представлены на Рис. 3, где штрихаNode M
Node M’
Node M
ми обозначены копии соответствующих
узлов.
Таким образом обеспечивается корректная структура последователей. Перенаправление дуг необходимо для
Node N
Node N’
Node N’
обеспечения наличия пути из узла
START в начальный узел копируемого
а
б
подграфа. Последний цикл алгоритма
Рис. 3. Результаты копирования
необходим для удаления излишних, недостижимых из узла START узлов, появившихся после перенаправления дуг.
Тем самым обеспечивается связность и
Node 1
корректная структура графа управления
p=1.0
p=0.0
в целом.
В результате работы алгоритма полуNode 2
Node 3’
чаем модифицированный граф, представленный на Рис. 4.
Копии узлов, получаемые в результате работы алгоритма, помечаются спеNode 4
Node 5’
Node 6'
циальным признаком, который обозначает нулевую вероятность передачи
управления в этот узел. Будем называть
эти узлы, помеченные этим признаком,
Node 7
Node 7’
узлами «черной дыры».
Следует отметить, что в результате
Рис. 4. Подграф после работы алгоритма
работы алгоритма может быть нарушена
корректность различных аналитических
структур данных. В частности, в проекте создания компилятора для микропроцессора Эльбрус3М после применения алгоритма требуется корректировать глобальный граф потока данных
[17], информацию о дереве циклов и результатах индексного анализа циклов [18].
Использование результатов оптимизации при компиляции
Рассмотрим исходную ситуацию, представленную на Рис. 2. Как видно из рисунка, управление по дуге со значением вероятности 1.0 и управление по дуге со значением вероятности 0.0
сходятся в узле Node 7. Различные оптимизации, такие как if-conversion, глобальное планирование, основываясь на профильной информации, которая содержится в узлах и дугах, охватывающих представленный подграф, могут преобразовать весь подграф в единый узел, называемый расширенным скалярным участком [5], перемешав, таким образом, вычисления,
находящиеся на ветках управления с разными вероятностями исполнения.
В результате применения алгоритма получается новый подграф, в котором эти ветки управления не пересекаются. Узлы, помеченные признаком «черной дыры», обрабатываются оптимизациями специальными способами. В частности, if-conversion и глобальное планирование не
61
преобразует такие узлы в расширенные скалярные участки. Отказываясь, таким образом, от
применения оптимизаций в области «черной дыры», мы тем самым сохраняем чистоту высоковероятных вычислений.
Подобным образом могут обрабатывать такие узлы и остальные оптимизации. Таким образом, получается, что область «черной дыры» существует отдельно от основной части программы, и вычисления, находящиеся в ней, не попадают в код с большим количеством исполнений.
Иногда полезно модифицировать алгоритм и требовать равенства значения вероятности дуги не нулю, а некоторому малому числу в окрестности нуля. Подобрав этот параметр, можно
улучшить производительность полученного кода. Такой эксперимент был поставлен на задаче
147.vortex из пакета Spec95.
Результаты экспериментов
Эффект от применения оптимизации исследовался на задачах из пакета Spec95. Результаты
представлены в Графике 1. По оси абсцисс указана задача, по оси ординат — изменение времени работы результирующего кода по сравнению с кодом без описанной оптимизации. Число
больше единицы обозначает улучшение времени работы.
Результаты экспериментов
1,37
1,40
1,30
1,20
1,10
1,00
1,00
1,12
1,04
1,04
1,00
1,03
0,95 0,99 0,99
1,01 0,98 1,00
0,90
1,00
1,00
0,83
0,80
0,67
0,70
0,62
0,60
0,50
ex
rt
vo
7. e5
v
14
wa
6. pp
p
14
fp
5. i
s
14
ap
1. l
r
14
pe
g
4.
13 jpe
i
2.
13 i
l
ss
re
0.
13 omp
c
9.
12 cc
g
3d
6.
rb
12
tu
m
5. ksi
8
12
m8
4. lu
p
12
ap
d
0.
ri
11
mg
2d
7.
ro
10
d
hy r
o
4.
10 u2c
s
3.
10 wim
s
v
2.
at
10
mc
to
1.
10 o
g
9.
09
Как видно из графика на трех задачах: 124.m88ksim, 141.apsi, 146,wave5 наблюдается значительное увеличение времени работы. Это объясняется методикой измерения производительности, опубликованной на www.spec.org. Согласно методике профильную информацию разрешено получать на тренировочных данных, меньших по объему и отличающихся от данных,
которыми измеряется производительность. На указанных трех задачах, полученный согласно
методике профиль, не соответствует работе программы на основных данных, поэтому во время
исполнения мы попадаем в область «черной дыры», то есть в практически неоптимизированный код, что влечет ухудшение производительности. На задачах 134.perl, 147.vortex наблюдается значительное уменьшение времени работы, что свидетельствует о том, что профиль на
этих задачах соответствует исполнению на основных данных. На остальных задачах изменения
времени работы не столь значительны. В целом, можно утверждать, что предложенная оптимизация будет эффективна, если мы уверены в совпадении поведения задачи на основных данных
и на данных, используемых для сбора профильной информации.
Литература
62
1. Chang P. P., Mahlke S. A., Hwu W. W. Using profile information to assist classic compiler code
optimizations // Software Practice and Experience, V. 21, No12. -1991.-P. 1301-1321
2. Дроздов А. Ю., Степаненков А. М. Технология оптимизации циклов для архитектур с аппаратной поддержкой конвейеризации. Информационные технологии и вычислительные системы №3, М. 2004.
3. Steven P. Vanderwiel, David J. Lilja. Data prefetch mechanisms // ACM Computing Surveys
(CSUR), Volume 32 Issue 2, 2000.
4. Волконский В. Ю., Ермолицкий А. В., Ровинский Е. В. Развитие метода векторизации циклов при помощи оптимизирующего компилятора // Высокопроизводительные вычислительные системы и микропроцессоры: сборник трудов ИМВС РАН, Выпуск N8, 2005.
5. Новиков С. В. Развитие методов глобального планирования для архитектур с явно выраженной параллельностью: Дис. канд. тех. наук: 05.13.11 // ЗАО «МЦСТ». М. 2005.
6. Boris Babayan. E2K Technology and Implementation. // in Proceedings of the Euro-Par 2000 Parallel Processing: 6th International. - Volume 1900 / 2000. – January, 2000. – P. 18-21.
7. М. Кузьминский. Отечественные микропроцессоры: Elbrus E2K // Открытые системы, № 0506, 1999. – С. 8-13.
8. K. Dieffendorf. The Russians Are Coming. Supercomputer Maker Elbrus Seeks to Join x86/IA-64
Melee // Microprocessor Report, V.13, №.2. – February 15, 1999. - P. 1-7.
9. R. P. Colwell, R. P. Nix, J. J. O’Donnel, D. B. Papworth, P. K. Rodman. A VLIW Architecture for
a Trace Scheduling Compiler // in Proceedings of the second International Conference on Architecture Support for Programming Languages and Operating Systems (ASPLOS II). – SIGPLAN Notices, V. 22, №10. – October, 1987.– P. 180-192.
10. Joseph A. Fisher. Very Long Instruction Word Architectures and the ELI-512 // in Proceedings of
10th International Symposium on Computer Architectures, IEEE. – June, 1983. – P. 140-150.
11. Joseph A. Fisher and John J. O'Donnel. VLIW Machines: Multiprocessors We Can Actually Program // CompCon 84'Proceedings, IEEE. – February ,1984. - P. 299-305.
12. John R. Ellis. Bulldog: A Compiler for VLIW Architectures. - Cambridge: MIT Press, 1986. – 320 p.
13. R. P. Colwell, R. P. Nix, J. J. O’Donnel, D. B. Papworth, P. K. Rodman. A VLIW Architecture for
a Trace Scheduling Compiler // in Proceedings of the second International Conference on Architecture Support for Programming Languages and Operating Systems (ASPLOS II). – SIGPLAN Notices, V. 22, №10. – October, 1987.– P. 180-192.
14. http://www.spec.org/cpu95
15. Muchnick, Steven S. Advanced Compiler Design and Implementation  Morgan Kauffman, San
Francisco, 1997, chapter 7.2.
16. Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman. Compilers: principles, techniques, and tools,
Addison-Wesley, Reading, Massachusetts, 1986
17. Дроздов А. Ю., Новиков С. В., Боханко А. С., Галазин А. Б. Глобальный граф потока данных
и его роль в проведении оптимизирующих преобразований программ // Высокопроизводительные вычислительные системы и микропроцессоры: сборник трудов ИМВС РАН, Выпуск N8, 2005, С. 78-87.
18. Дроздов А. Ю., Корнев Р. М., Боханко А. С. Индексный анализ зависимостей по данным.
Информационные технологии и вычислительные системы №3, М. 2004.
.
63
Related documents
Download