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

Оптимизация

Чистка циклов вверх

Данное преобразование применяется к сильно связным подграфам графа управления (т.е. подграфам, состоящим из взаимно достижимых вершин). Таким образом, для его проведения необходима фрагментация программы на уровне сильно связных подграфов. Алгоритм выделения сильно связных подграфов будет рассмотрен в "Анализ потока управления" .

Если такой подграф выделен, то для него определяется множество входных вершин, то есть таких его вершин, в которые существует путь из вершины start, лежащий целиком за пределами этого подграфа. На иллюстрации входные вершины подграфа S обозначены темными кружками и символами e1, …, ek .

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

Легко видеть, что данное преобразование также повторно по отношению к самому себе.

Чистка циклов вниз

Данное преобразование также легко реализуется в представлении с использованием def-use chains и в каком-то смысле является симметричным предыдущему.

Теперь вершина изнутри сильно связного подграфа заменяется на несколько копий, каждая из которых является непосредственным преемником выходных вершин подграфа. Выходной вершиной называется такая вершина, среди непосредственных преемников которой есть вершина, не принадлежащая данному подграфу.

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

Данное преобразование также повторно по отношению к самому себе.

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

Объединение циклов


Объединение циклов производится с целью сокращения накладных расходов на организацию цикла.

Контекстные условия корректности этого преобразования следующие:

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

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

Раскрутка циклов


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

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

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