- Loop unswitching
-
Loop unswitching (размыкание цикла) состоит в вынесении условия за пределы цикла и дублирования тела цикла с помещением соответствующих вариантов в соответствующие ветви условия. Это позволяет улучшить производительность за счёт того, что современные процессоры могут выполнять векторные операции (данное оптимизирующее преобразование может быть выполнено совместно с loop unrolling, а результатом loop unrolling, в свою очередь, являются несколько операций в итерации, производимые над последовательными участками памяти, которые можно заменить одной векторной, если это позволяет архитектура; так, например, делается в ICC). Кроме того, это позволяет более эффективно выполнить цикл параллельно.
Пример преобразования
for (i = 0; i < 1000; i++) { x[i] = x[i] + y[i]; if (w) { y[i] = 0; } }
Условие внутри тела цикла мешает его распараллеливанию. После размыкания оно принимает следующий вид:
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]; } }
Каждый из полученных циклов может, в свою очередь, быть оптимизирован отдельно.
Данный метод оптимизации появился в gcc версии 3.4. [1]
См. также
Категории:- Оптимизации
- Оптимизирующие преобразования
Wikimedia Foundation. 2010.