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


Расщепление тела цикла ( англ. loop fission ) — оптимизация компилятора , которая разбивает цикл в программе на несколько циклов, каждый из которых имеет те же индексные границы , однако содержит только часть тела исходного цикла.

Например, следующий код:

 int i, a[100], b[100];
 for (i = 0; i < 100; i++) {
   a[i] = 1; 
   b[i] = 2;
 }

в результате применения оптимизации преобразовывается в:

 int i, a[100], b[100];
 for (i = 0; i < 100; i++) {
   a[i] = 1;                     
 }
 for (i = 0; i < 100; i++) {
   b[i] = 2;
 }

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

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

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

Литература

Ссылки

Источник —

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