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

Оптимизация

Зависимость между оптимизациями

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

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

  • Независимость. Преобразования T1 и T2 называются независимыми, если применение одного из них к программе не влияет на применимость другого.
  • Повторность. Преобразование T1 повторно по отношению к преобразованию T2 , если для произвольной программы p из применимости к ней T2 следует применимость его к T1 (p) .
  • Тупиковость. Преобразование T1 тупиково по отношению к преобразованию T2 , если для произвольной программы p T2 неприменимо к T1 (p) .

Стадии оптимизации


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

  • Фрагментация. Под фрагментацией понимается выделение некоторого участка программы, к которому может быть применено преобразование. В данном случае таким участком является последовательность операторов, один из которых - условный оператор без части else. Задачу фрагментации решает анализ потока управления. Заметим, что различные оптимизирующие преобразования требуют выделения различных фрагментов исходной программы, так что количество задач фрагментации достаточно велико. Некоторые алгоритмы фрагментации подробнее рассмотрены в лекции 12.
  • Проверка контекстных условий, то есть выяснение применимости оптимизирующего преобразования к данному фрагменту. В данном случае необходимо проверить, что значение переменной a после первого присваивания фрагмента не используется в случае ложности условия p(x) . Задачи такого рода решаются с применением анализа потоков данных. Примеры задач анализа потоков данных и описание общего подхода к их решению приведены в "Анализ потоков данных" .
  • Преобразование. Собственно применение оптимизации к выбранному фрагменту. В данном случае первое присваивание "втянуто" в then -часть условного оператора. Таким образом, в случае ложности условия p(x) программа выполняет на один оператор меньше.

Покадровая оптимизация


Одним из самых простых видов оптимизаций является так называемая покадровая оптимизация, которая обычно применяется на уровне машинно-зависимого представления программы.

Суть покадровой оптимизации - поиск сравнительно короткой последовательности инструкций, удовлетворяющей определенным контекстным условиям, и замена такой последовательности на более эффективную.

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

На слайде приведен пример работы покадрового оптимизатора. В данном случае были распознаны следующие образцы:

  • Переход на следующую инструкцию (обозначен номером 1).
  • Две одинаковые инструкции пересылки (номер 2).
  • Пересылка данных через вспомогательный регистр, значение которого далее не используется (номер 3).
  • Засылка нуля в регистр (номер 4).
  • Переход на переход (номер 5).

Результат применения покадровой оптимизации является программа, показанная на слайде справа.