18-08-2023
Loop unswitching (размыкание цикла) состоит в вынесении условия за пределы 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]; } }
Каждый из полученных циклов может, в свою очередь, быть оптимизирован отдельно.
Данный метод оптимизации появился в [1]
Loop unswitching.