суббота, 9 февраля 2013 г.

gentoo и lto

Итак, на этот раз попытаемся собрать Gentoo с поддержкой lto.
Для начала - что такое lto. LTO - Link Time Optimisation (оптимизация времени связывания). Это межмодульная оптимизация, которая позволяет в одном модуле использовать информацию из другого. Она кладёт в получающийся объектный файл модуля дополнительную информацию о функциях, находящихся в нём и использует её при связывании с другим модулем. Это может быть полезно, например, для встраивания функций.
Теперь про целевую систему: это gentoo, состоящая из 1436 пакетов, gcc-4.7.2. Процессор - Intel Core2 Dou, 2.00 ГГц, 2 Гб оперативной памяти.

Чтобы включить поддержку lto, в /etc/make.conf достаточно прописать следующее:

CFLAGS="-flto"
CXXFLAGS="${CFLAGS}"
LDFLAGS="-flto"


Теперь понадобится быстро отключать поддержку lto. Для этого создадим файл с окружением /etc/portage/env/no-lto.conf и внесём в него следующие строки:

CFLAGS="${CFLAGS} -fno-lto"
CXXFLAGS="${CXXFLAGS} -fno-lto"
LDFLAGS="${LDFLAGS} -fno-lto"


Я по старой привычке предварительно сделал

# emerge gcc && emerge binutils glibc -1

Тепеть можно начать пересобирать систему:

# emerge world -e

Периодически пересборка будет прерываться несобравшимися с lto пакетами. У меня таких было 27. Такие помещаются в файл /etc/portage/package.use/package.use примерно так:

# echo "kde-base/kdelibs no-lto.conf" >> /etc/portage/package.env/package.env

В итоге содержимое этого файла приняло следующий вид:

media-sound/wavpack no-lto.conf
dev-lang/perl no-lto.conf
kde-base/kdelibs no-lto.conf
www-client/firefox no-lto.conf
dev-libs/elfutils no-lto.conf
dev-lang/erlang no-lto.conf
media-libs/alsa-lib no-lto.conf
dev-db/firebird no-lto.conf
app-text/rarian no-lto.conf
dev-lang/spidermonkey no-lto.conf
dev-util/valgrind no-lto.conf
app-text/aspell no-lto.conf
dev-libs/beecrypt no-lto.conf
dev-lang/ruby no-lto.conf
kde-base/akregator no-lto.conf
net-analyzer/openvas-libraries no-lto.conf
net-analyzer/greenbone-security-desktop no-lto.conf
media-gfx/inkscape no-lto.conf
app-text/texlive-core no-lto.conf
kde-base/okular no-lto.conf
games-emulation/dosbox no-lto.conf
media-video/mplayer no-lto.conf
sys-devel/llvm no-lto.conf
media-libs/mesa no-lto.conf
sys-devel/clang no-lto.conf
x11-base/xorg-server no-lto.conf
net-libs/webkit-gtk no-lto.conf


К сожалению, здесь есть довольно тяжёлые пакеты, которые хотелось бы соптимизировать как можно больше. Например, kdelibs, firefox, xorg-server и т.п.

Можно попытаться пересобрать ядро с поддержкой lto. Для этого в Malefile нужно дополнить значением -flto переменные HOSTCFLAGS и KBUILD_CFLAGS.У меня нет уверенности, что ядро полностью пересобралось с поддержкой lto, но wifi после этого у меня отвалился.

Теперь что это дало на практике. Изменений по памяти или скорости работы программ я не заметил. Замеров на старой/новой системе я не производил, поэтому более или менее точно можно сказать одно. Самым важным эффектом с точки зрения пользователя является ужасно возросшее время компиляции пакетов. Всю систему я пересобирал более трёх суток! При том что обычно на это уходит сутки-полтора.

В общем, особых плюшек я не получил, но хотя бы ничего не отвалилось. И на том спасибо.

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

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