Россия, Челябинск, Южно-Уральский Государственный Университет (НИУ) |
Оптимизация
Обозначения
Для описания способов решения задач оптимизации, нам потребуются следующие обозначения.
Ориентированным графом назовем пару конечных множеств (V, E) , называемых соответственно множествами вершин и дуг, при этом множество дуг представляет собой совокупность пар вершин.
Для произвольной дуги e=(v, w) вершину v назовем началом дуги e (обозначение beg(e) ), вершину w - концом дуги e (обозначение end(e) ).
Для произвольной вершины v обозначим через in(v) множество входящих дуг, через out(v) - множество выходящих дуг.
Представление программы
Программу для оптимизации удобно представлять в виде размеченного графа потока управления.
Граф потока управления - это ориентированный граф, в котором выделены две вершины start и stop, и удовлетворяющий следующим требованиям:
- В start не входит ни одна дуга.
- Из stop не выходит ни одна дуга.
- Любая вершина достижима из start .
- Из любой вершины достижима вершина stop .
Введем далее в рассмотрение некоторое конечное множество, которое мы будем называть алфавитом операторов и назовем разметкой графа потока управления произвольное отображение
множества вершин графа в множество операторов.
Пара , где G - граф потока управления, а
- его разметка, и является представлением программы для оптимизации. От дополнительных свойств элементов множества операторов зависит характер оптимизаций, которые можно выразить, используя данное представление.
Заметим, что построение такого представления программы уже включает в себя широко известное оптимизирующее преобразование - удаление недостижимого кода, то есть той части программы, на которую никогда не передается управление.
Пример
На слайде приведен пример программы (слева) и ее представления в виде размеченного графа управления (справа). В качестве алфавита операторов выступает множество, состоящее из изображений элементарных операторов данной программы, то есть множество
{'g=a', 'm=b', 'a<b', 'm', 's=g', 'g=m', 'g=b', 'm=a', 'm=s%m'}
Далее мы рассмотрим несколько полезных вариантов определения множества операторов, применимых для формализации основных оптимизирующих преобразований.
Поток управления
Данный способ описания программы применяется тогда, когда необходимо описать преобразования потока управления, которые не требуют анализа потоков данных.
Алфавит операторов в этом случае содержит выделенный пустой оператор ( ). Будем требовать, чтобы разметка графа потока управления сопоставляла пустой оператор только тем вершинам, для которых число исходящих дуг не превосходит единицы. Два слова в алфавите операторов объявляются эквивалентными в том и только том случае, когда они равны с точностью до вхождения пустых операторов.
Для определения эквивалентности программ, записанных в данном формализме, введем понятие слова, соответствующего пути в графе потока управления, а именно, для произвольного пути p слово w(p) в алфавите операторов получается последовательным выписыванием символов, которыми помечены вершины p .
Будем говорить, что две программы и
эквивалентны, тогда и только тогда, когда существует такое отображение m между вершинами G1 и G2, что для произвольной вершины v графа G1 и произвольного пути p , начинающегося в ней, найдется путь p' в графе G2, начинающийся в вершине m(v) , для которого слова w(p) и w(p') эквивалентны.
Пример
На слайде приведен пример преобразования потока управления к форме, эквивалентной в описанном выше смысле (а именно, преобразование цикла с постусловием в цикл с предусловием). Пунктирными стрелками указаны образы вершин при отображении m .
Нетрудно заметить, что данное отображение необратимо, и, следовательно, определяемое им отношение несимметрично. Таким образом, введенное нами отношение, строго говоря, не является отношением эквивалентности. Это несоответствие может быть устранено, однако для наших целей этого не потребуется.