Разделение цикла — это метод оптимизации компилятора . Он пытается упростить цикл или устранить зависимости, разбивая его на несколько циклов, которые имеют одинаковые тела, но итерируют по разным смежным частям диапазона индекса.
Очистка цикла — это особый случай разделения цикла, при котором любые проблемные первые (или последние) несколько итераций отделяются от цикла и выполняются вне тела цикла.
Предположим, что цикл был написан следующим образом:
int p = 10 ; для ( int i = 0 ; i < 10 ; ++ i ) { y [ i ] = x [ i ] + x [ p ]; p = i ; }
Обратите внимание, что p = 10
только для первой итерации и для всех остальных итераций, p = i - 1
. Компилятор может воспользоваться этим, раскрутив (или «отчистив») первую итерацию от цикла.
После очистки первой итерации код будет выглядеть так:
y [ 0 ] = x [ 0 ] + x [ 10 ]; для ( int i = 1 ; i < 10 ; ++ i ) { y [ i ] = x [ i ] + x [ i -1 ]; }
Эта эквивалентная форма устраняет необходимость в переменной p
внутри тела цикла.
Циклическое расщепление было введено в gcc в версии 3.4. Более обобщенное циклическое расщепление было добавлено в GCC 7. [1]
По-видимому, термин «отшелушивание» впервые был использован Каннингсом, Томпсоном и Сколником [2] в их статье 1976 года о вычислительных моделях для (человеческой) наследственности. Там этот термин использовался для обозначения метода свертывания фенотипической информации на родителей. Оттуда этот термин снова использовался в их статьях, включая их основополагающую статью о вероятностных функциях в сложных родословных. [3]
В технологии компиляторов этот термин впервые появился в работах конца 1980-х годов по VLIW и суперскалярной компиляции, включая [4] и [5] .