Опубликован: 23.07.2006 | Доступ: свободный | Студентов: 2215 / 889 | Оценка: 4.28 / 4.17 | Длительность: 21:37:00
Специальности: Системный архитектор
Лекция 11:

Оптимизация

Понижение силы операций


Данное преобразование особенно эффективно при применении к вычислениям внутри тел циклов, хотя это не является его необходимым контекстным условием.

Основная идея понижения силы операций - это замена (в частных случаях) использования более дорогих операций более дешевыми (умножения - сложением или сдвигом, возведения в степень - умножением и т.д.) Обычно используются следующие тождества:

  • x*2^k \equiv x << k
  • x^2 \equiv x * x
  • 2*x \equiv x+x
  • n*x \equiv (n -1)*x + x
  • x^n \equiv x^{n-1} * x

Два последних тождества и дают возможность применения преобразования к циклам. На иллюстрации приведен пример такого преобразования. В данном случае умножение внутри тела цикла было заменено сложением.

Упрощение выражений


Упрощение выражений представляет собой целый класс оптимизирующих преобразований. Наиболее часто встречающимися среди них являются константные вычисления и упрощения с использованием алгебраических тождеств. Понижение силы операций также может быть рассмотрено как преобразование из серии упрощения выражений.

Пример константных вычислений показан на иллюстрации.

Экономия общих подвыражений


Экономия общих подвыражений заключается в том, что среди всех вычисляемых на участке экономии выражений выделяются эквивалентные, и затем их вхождения заменяются на вхождение новой переменной, хранящей заранее вычисленное значение этого общего выражения.

Поскольку выделение одних подвыражений закрывает возможность выделить другие, данное преобразование является неоднозначным.

На иллюстрации показаны примеры применения этого преобразования. Во втором случае видна неоднозначность при выделении подвыражений: выражения b+c и c+d не могут быть выделены одновременно. Поскольку подвыражение b+c используется чаще, именно оно и было выделено.

Зависимость качества оптимизации от размера участка экономии


Продемонстрируем теперь на примере зависимость качества оптимизации от размера участка экономии.

Фрагмент исходной программы показан в левой части иллюстрации. В правой части изображены возможные остаточные программы при локальной, квазилокальной и глобальной оптимизациях.

При локальной оптимизации произведено только понижение силы операций (умножение заменено на сдвиг).

При квазилокальной оптимизации помимо этого может быть упрощено выражение в then -части условного оператора. Для этого, однако, участок экономии должен включать в себя конструкцию ветвления.

Наконец, при глобальной оптимизации и при соответствующих свойствах функции f (ее значение должно полностью определяться значениями параметров и она не должна иметь побочных эффектов) исходный фрагмент может быть сокращен до вида, указанного на иллюстрации.

Литература к лекции

  • А. Ахо, Р. Сети, Дж. Ульман "Компиляторы: принципы, технологии и инструменты", М.: "Вильямс", 2001. 768 с.
  • Steven S. Muchnik "Advanced Compiler Design And Implementation", Morgan Kaufmann Publishers, July 1997. 880 pp.
  • В.Н. Касьянов "Оптимизирующие преобразования программ", М., "Наука", 1988. 336 с.