Как стать автором
Обновить

Оптимизация компиляции GCC на примере Gentoo

Время на прочтение 2 мин
Количество просмотров 19K
Оптимизация сборки — одна из основных прелестей Gentoo, однако все описанное применимо к любому случаю компиляции ПО из исходных кодов. Все параметры сборки в Gentoo задаются в файле make.conf.
По сути нас интересует лишь переменная CFLAGSCXXFLAGS должна быть равна CXXFLAGS="${CFLAGS}", а в MAKEOPTS лишь указывается число параллельно запускаемых процессов компиляции (обычно задают общее число ядер процессоров + 1).

Значение по умолчанию "-O2 -pipe". Параметр -O указывает на используемый уровень оптимизации. Второй уровень считается наиболее высоким безопасным, с третьим уровнем зачастую проявляется нестабильность работы. Параметр -pipe указывает gcc использовать каналы в памяти вместо временных файлов для обмена данными между разными стадиями компиляции. С значением по умолчанию бинарные файлы собираются под архитектуру generic, работают на различных моделях процессоров, но не используют преимущества той или иной модели.
Посмотреть безопасные наборы флагов оптимизаций для различных типов процессоров можно тут: http://en.gentoo-wiki.com/wiki/Safe_Cflags. Бинарники, собранные с указанными там флагами, должны без проблем работать на соответствующем процессоре и при этом использовать большую часть его преимуществ.
В gcc, начиная с версии 4.2, появился флаг -march=native. С этим флагом gcc автоматически определяет тип процессора, поддерживаемые возможности и использует их.
В общем случае для оптимизации нужно сделать следующее:
  • определить, что умеет ваш процессор: cat /proc/cpuinfo, обратить внимание на строку flags, в частности на mmx*, 3dnow*sse*, cx*;
  • посмотреть, что будет использовать gcc с -march=native: gcc -march=native -O2 -Q --help=target -fverbose-asm;
  • прописать в make.conf -march=native и, возможно, еще некоторые -m*, не включаемые автоматически;
  • если ваш процессор поддерживает sse и, если у флага -mfpmath= не указано никакого значения, то пропишите в make.conf -mfpmath=sse;
  • посмотреть, какие оптимизации использует gcc: gcc -march=native -O2 -Q --help=optimizers -fverbose-asm;
  • если gcc не использует какие-либо оптимизации, включить их в make.conf. Включение некоторых оптимизаций может привести к неработоспособности бинарников, так что здесь стоит обратить внимание только на опцию -fomit-frame-pointer, ее включение безопасно, если вы не собираетесь заниматься отладкой.

В итоге, посмотрите, какие параметры будет использовать gcc с вашими оптимизациями:
gcc <your_options> -Q --help=target -fverbose-asm

gcc <your_options> -Q --help=optimizers -fverbose-asm

Без использования флага -fverbose-asm gcc показывает неверные данные. Это обсуждается тут: http://www.gentoo.ru/node/14818.

А этот скрипт покажет, что попадет в командную строку компилятора: gcc <your_options> -E -v - </dev/null 2>&1 | sed -n 's/.* -v - //p'. Интерес представляет, пожалуй, только для разработчиков.
Теги:
Хабы:
+28
Комментарии 28
Комментарии Комментарии 28

Публикации

Истории

Ближайшие события

PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн
Weekend Offer в AliExpress
Дата 20 – 21 апреля
Время 10:00 – 20:00
Место
Онлайн