Отключение петли - Loop unswitching
Отключение петли это оптимизация компилятора. Он перемещает условие внутри цикла за его пределы, дублируя тело цикла и помещая его версию внутри каждого из предложений if и else условного оператора.[1] Это может улучшить распараллеливание цикла. Поскольку современные процессоры могут быстро работать с векторами, это улучшение увеличивает скорость работы программы.
Вот простой пример. Предположим, мы хотим добавить два массива Икс и у а также что-то делать в зависимости от переменной ш. У нас есть следующие C код:
int я, ш, Икс[1000], у[1000]; за (я = 0; я < 1000; я++) { Икс[я] += у[я]; если (ш) у[я] = 0; }
Условие внутри этого цикла затрудняет безопасное распараллеливать этот цикл. Когда мы отключаем цикл, это становится:
int я, ш, Икс[1000], у[1000]; если (ш) { за (я = 0; я < 1000; я++) { Икс[я] += у[я]; у[я] = 0; } } еще { за (я = 0; я < 1000; я++) { Икс[я] += у[я]; } }
Хотя отключение цикла может удвоить объем написанного кода, каждый из этих новых циклов теперь может быть оптимизирован отдельно.
Отключение петли было введено в gcc в версии 3.4.[2]