Interested Article - Расщепление цикла

Расщепление цикла ( англ. 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. . gcc.gnu.org . Дата обращения: 4 августа 2023. 2 сентября 2020 года.

Литература

Источник —

Same as Расщепление цикла