WikiDer > Отключение петли

Loop unswitching

Отключение петли это оптимизация компилятора. Он перемещает условие внутри цикла за его пределы, дублируя тело цикла и помещая его версию внутри каждого из предложений if и else условного оператора.[1] Это может улучшить распараллеливание цикла. Поскольку современные процессоры могут быстро работать с векторами, это улучшение увеличивает скорость работы программы.

Вот простой пример. Предположим, мы хотим добавить два массива Икс и у а также что-то делать в зависимости от переменной ш. У нас есть следующие C код:

  int я, ш, Икс[1000], у[1000];  за (я = 0; я < 1000; я++) {    Икс[я] += у[я];    если (ш)      у[я] = 0;  }

Условие внутри этого цикла затрудняет безопасное распараллеливать этот цикл. Когда мы отключаем цикл, это становится:

  int я, ш, Икс[1000], у[1000];  если (ш) {    за (я = 0; я < 1000; я++) {      Икс[я] += у[я];      у[я] = 0;    }  } еще {    за (я = 0; я < 1000; я++) {      Икс[я] += у[я];    }  }

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

Отключение петли было введено в gcc в версии 3.4.[2]

Рекомендации