Циклопедия скорбит по жертвам террористического акта в Крокус-Сити (Красногорск, МО)

Loop unswitching

Материал из Циклопедии
Перейти к навигации Перейти к поиску

Loop unswitching (размыкание цикла) состоит в вынесении условия за пределы цикла и дублирования тела цикла с помещением соответствующих вариантов в соответствующие ветви условия. Это позволяет улучшить производительность за счёт того, что современные процессоры могут выполнять векторные операции (данное оптимизирующее преобразование может быть выполнено совместно с loop unrolling, а результатом loop unrolling, в свою очередь, являются несколько операций в итерации, производимые над последовательными участками памяти, которые можно заменить одной векторной, если это позволяет архитектура; так, например, делается в ICC). Кроме того, это позволяет более эффективно выполнить цикл параллельно.

Пример преобразования[править]

<source lang="c"> for (i = 0; i < 1000; i++) {

   x[i] = x[i] + y[i];
  
   if (w)
   {
       y[i] = 0;
   }

} </source>

Условие внутри тела цикла мешает его распараллеливанию. После размыкания оно принимает следующий вид:

<source lang="c"> if (w) {

   for (i = 0; i < 1000; i++)
   {
       x[i] = x[i] + y[i];
       y[i] = 0;
   }

} else {

   for (i = 0; i < 1000; i++)
   {
       x[i] = x[i] + y[i];
   }

} </source>

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

Данный метод оптимизации появился в gcc версии 3.4. [1]

Ссылки[править]