Расщепление цикла
Расщепление цикла (англ. loop splitting) — оптимизация компилятора, которая пытается упростить цикл или устранить зависимости в цикле, разбив его на несколько частей, имеющих одно и то же тело исходного цикла и различные диапазоны счётчика.
Отслаивание цикла
править кодОтслаивание цикла (разгрузка цикла, от англ. loop peeling) является частным случаем расщепления цикла, при котором из основного цикла выносятся одна или несколько зависимых итераций.
Пример
править кодНапример, следующий код на языке Си:
int p = 10;for (int i = 0; i < 10; ++i){ y[i] = x[i] + x[p]; p = i;}
в результате применения оптимизации преобразовывается в:
y[0] = x[0] + x[10];for (int i = 1; i < 10; ++i){ y[i] = x[i] + x[i-1];}
Таким образом, компилятор выносит первую итерацию, при которой p = 10
, и изменяет цикл, ведь в остальных итерациях p = i-1
.
Новый код равносилен предыдущему, однако устраняет необходимость в переменной р
внутри тела цикла.
Впервые данная оптимизация появилась в GCC версии 3.4, и улучшилась в версии 7[1].
Примечания
править кодЛитература
править код- Альфред Ахо, Моника Лам, Рави Сети, Джеффри Ульман. Компиляторы: принципы, технологии и инструментарий = Compilers: Principles, Techniques, and Tools. — 2-е издание. — М.: «Вильямс», 2008. — 1184 с. — 1500 экз. — ISBN 978-5-8459-1349-4.
- Steven S. Muchnick. Advanced Compiler Design and Implementation. — 5-е издание. — San Francisco: Morgan Kaufmann Publishers, 1997. — 856 с. — ISBN 1-55860-320-4.
- Kennedy, Ken; & Allen, Randy. Optimizing Compilers for Modern Architectures: A Dependence-based Approach (англ.). — Morgan Kaufmann, 2001. — ISBN 1-55860-286-0.