Производительность GCC 13 "-O2" ускорена за счет возможности разворачивания небольшого цикла

Для тех, кто компилирует свои программы с использованием общего уровня оптимизации «-O2», который используется для производственных сборок многими дистрибутивами Linux и другими поставщиками программного обеспечения, на этом уровне для GCC 13 включается развертывание малых циклов. Включение развертывания малых циклов с помощью -O2 должно помочь производительности в некоторых областях современных процессоров Intel и AMD.

Инженер Intel Хонгю Ван возглавил изменение, которое сегодня было объединено с GCC 13. Развертывание небольших циклов включено для уровня оптимизации -O2 благодаря его преимуществам с современными процессорами AMD и Intel. В одном конкретном тестовом примере SPEC развертывание небольшого цикла на -O2 улучшило производительность сервера Ice Lake на 9%, а также помогло системе Zen 3 на 7,4%. Это также привело к уменьшению размера кода на 0,9%. Но для других контрольных случаев влияние было меньше или вообще не было измеримым. Конечно, будет интересно протестировать GCC 13 с более разнообразным набором тестов, чтобы увидеть, как все работает.

Hongyu Wang объяснил в коммите:
Современные процессоры имеют многоканальные декодеры инструкций. Для x86 icelake/zen3 имеет 5 мопов, поэтому для небольшого цикла с <= 4 инструкциями (обычно имеет 3 мопов с парой cmp/jmp, которые могут быть объединены в макрос) декодер будет иметь 2 uops для каждой итерации, и конвейер не может быть полностью использован.

Таким образом, этот патч позволяет разворачивать петлю небольшого размера в точке O2, чтобы максимально заполнить декодер. Он включает разворачивание цикла rtl, когда существует targetm.loop_unroll_adjust и только O2 плюс скорость. В серверной части x86 поведение по умолчанию заключается в развертывании небольших циклов с менее чем 4 инсами за 1 раз.

Это улучшает 548.exchange2 на 9% на icelake и на 7,4% на zen3 с увеличением размера кода на 0,9%. Для других тестов варианты незначительны, а общий размер кода увеличился на 0,2%.

Размер образа ядра увеличился на 0,06%, и это не повлияло на eembc.

Это изменение объединено для GCC 13 с -O2. Стабильная версия GCC 13.1 должна выйти в обычное время — март-апрель. По мере приближения этого релиза я буду запускать свои обычные тесты сравнения компиляторов GCC.
Поделиться:

Похожие публикации

Тут ничего нет

Нет комментариев