Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

Опции оптимизации компилятора gcc

#gcc


Что делают опции компилятора GCC -O2 -O3?
    


Ответы

Ответ 1



Опции, которые начинаются с O, - это указания компилятору включать различные оптимизации. -O0 (O ноль) - это самые простые и примитивные оптимизации. -O1 - более сильные оптимизации. -O2 - оптимизировать все, что можно, но только проверенные и надежные оптимизации. -O3 - жесткая и насильная оптимизация, применяются экспериментальные методы. Каждый последующий уровень включает предыдущие. Что происходит на каждом уровне, сильно зависит от версии компилятора и нужно смотреть в документацию. (man gcc) Обычно принято, что когда компилируют для отладки, используют максимум -O1. Для кода на боевые сервера - -O2. -O3 применяют те, кому нужны дополнительные проценты в производительности и они готовы пожертвовать тем, что приложение может быть нестабильным. Также есть ещё -Os - оптимизировать по размеру.

Ответ 2



Различие опций в том, что -O2 предоставляет некоторый набор оптимизаций, не изменяющих соотношение скорость-размер, а -O3 добавляет оптимизации, которые чаще всего полагаются на подход "занять больше места, но работать быстрее". -O3 Optimize yet more. -O3 turns on all optimizations specified by -O2 and also turns on the -finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload and -ftree-vectorize options. Более подробно по некоторым опциям: -finline-functions - попытка эвристически инлайнить функции, в общем случае неслабо увеличивает размер программы, что, опять же приводит к двояким результатам - с одной стороны, мы неслабо экономим на передаче параметров, с другой, помогаем кэшу процессора больше мазать из-за возросшего размера набора инструкций. Более подробно (старое правда, но смысл все тот же) здесь. Стоит также изучить опцию -finline-limit. -funswitch-loops - ручной разворот циклов, которые копилятор посчитал пригодными для анроллинга. Ситуация схожая с инлайнингом функций, может быть лучше, может быть хуже. -fpredictive-commoning - переиспользование результатов прошлых итераций циклов, насколько я знаю, имеет больше смысла полагаться на аппаратную реализацию Predictive Commoning, однако, может быть полезно. Про векторизацию при -ftree-vectorize и fgcse-after-reload можете прочитать самостоятельно здесь.

Комментариев нет:

Отправить комментарий