LTO: различия между версиями
(Новая страница: «В Сизифе включена LTO (link-time optimization). LTO — это уже широко распространённая оптимизация, её…») |
Vt (обсуждение | вклад) (Отмена правки 62168, сделанной ArsenyMaslennikov (обсуждение)) Метка: отмена |
||
(не показано 18 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
C 24 августа 2021 года в Сизифе включена<ref>[https://lists.altlinux.org/pipermail/devel/2021-August/215165.html I: LTO in %optflags by default]</ref> LTO (''link-time optimization'')<ref>[https://gcc.gnu.org/onlinedocs/gccint/LTO.html https://gcc.gnu.org/onlinedocs/gccint/LTO.html]</ref>. | |||
LTO | * LTO - это безусловно полезная оптимизация, об этом много написано, см. напр. <ref>[https://documentation.suse.com/sbp/all/html/SBP-GCC-10/index.html Advanced Optimization and New Capabilities of GCC 10] (имеется статистика результатов включения LTO)</ref>, поэтому ею хорошо было бы воспользоваться; | ||
LTO — это уже | * LTO — это уже широко распространённая оптимизация, её уже включили в openSUSE<ref>[https://en.opensuse.org/openSUSE:LTO openSUSE:LTO]</ref>, Fedora<ref>[https://fedoraproject.org/wiki/LTOByDefault LTOByDefault in Fedora Project]</ref>, Ubuntu<ref>[https://wiki.ubuntu.com/ToolChain/LTO https://wiki.ubuntu.com/ToolChain/LTO]</ref>, ClearLinux, скоро Debian, там уже вытоптали основные грабли, большинство фиксов пакетов заапстримлено, поэтому ею уже можно пользоваться; | ||
уже | |||
LTO | * LTO — это уже настолько распространённая оптимизация, что скоро без LTO уже мало кто будет собирать, поэтому не пользоваться ею скоро будет себе дороже; | ||
LTO поддерживается на всех архитектурах, кроме некоторых вторичных, где не GCC тулчейн. | |||
== | = Возникающие ошибки и их исправление = | ||
=== /usr/ | == Упаковка статических библиотек (.a) == | ||
Статическое библиотеки собранные с <tt>-flto</tt> содержат [https://gcc.gnu.org/wiki/GIMPLE GIMPLE] байткод, который зависим от версии GCC, поэтому он удаляется из библиотек и производится проверка, что остались другие символы. В результате этой проверки пакеты, запаковывающие статические библиотеки, могут получить ошибку вида | |||
process-lto: ERROR: ./usr/lib64/libtcb.a: contains __gnu_lto_slim | |||
С такими пакетами можно поступить одним из двух способов: | |||
* перестать паковать статические библиотеки; | |||
* включить <tt>-ffat-lto-objects</tt>, добавив в спек-файл | |||
%{?optflags_lto:%global optflags_lto %optflags_lto -ffat-lto-objects} | |||
=== Статические библиотеки и объекты (.o) от других архитектур === | |||
Для ошибок вида | Для ошибок вида | ||
/usr/bin/strip: Unable to recognise the format of the input file `./usr/libexec/arm-none-eabi/lib/libm.a(lib_a-wrf_lgamma.o)' | /usr/bin/strip: Unable to recognise the format of the input file `./usr/libexec/arm-none-eabi/lib/libm.a(lib_a-wrf_lgamma.o)' | ||
сборку можно исправить, добавив такие библиотеки в %brp_strip_none. | сборку можно исправить, добавив такие библиотеки в <tt>%brp_strip_none</tt>. | ||
== | == Сборка с использованием Clang == | ||
Clang поддерживает LTO, но не поддерживает ''auto'' в <tt>-flto=auto</tt> и опцию <tt>-ffat-lto-objects</tt>, | |||
поэтому для пакетов собираемых Clang нужно переопределить <tt>optflags_lto</tt> или отключить LTO, например: | |||
%define optflags_lto -flto=thin | |||
== Top-level asm == | |||
Наиболее актуально для криптографических и математических библиотек, кодеков. | |||
Из-за бага в GCC ([https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57703 PR57703]) <tt>configure</tt> | |||
скрипты содержащие тесты с <tt>asm()</tt> дадут не правильный результат, что может сломать | |||
сборку. Для обхода можно включить <tt>-ffat-lto-objects</tt>. То же самое происходит у | |||
Clang, но там обход применить нельзя и придется LTO отключить. | |||
== Нестандартная линковка == | |||
Во вручную написанных <tt>Makefile</tt> могут потеряться флаги линковки. Для исправления их нужно туда добавить — [http://git.altlinux.org/gears/j/..git?p=john.git;a=commitdiff;h=696698e например]. | |||
== Сокрытие ошибок сборки == | |||
Включение LTO может скрывать некоторые ошибки компиляции дающие в итоге [http://git.altlinux.org/beehive/logs/Sisyphus/x86_64/archive/2022/0702/error/liboqs-0.7.1-alt2 ошибочный код] (в примере релевантно для SIMD оптимизации), поэтому я бы рекомендовал сначала собрать пакет без LTO, чтоб проверить его собираемость, посмотреть compile errors/warnings, включить тесты, а затем собрать пакет с LTO. | |||
== Прочие проблемы == | |||
При сборке некоторых пакетов могут встречаться и другие проблемы, связанные с включением LTO. С такими пакетами можно поступить одним из | |||
нескольких способов: | нескольких способов: | ||
* обновить пакеты, весьма вероятно, что они уже исправлены в новых версиях; | * обновить пакеты, весьма вероятно, что они уже исправлены в новых версиях; | ||
* исправить LTO самостоятельно; | * исправить LTO самостоятельно; | ||
* выключить LTO, переопределив макрос optflags_lto: | * послать баг-репорт в апстрим и/или в GCC; | ||
* выключить LTO, переопределив макрос <tt>optflags_lto</tt>: | |||
%define optflags_lto %nil | %define optflags_lto %nil | ||
= Ссылки = | |||
<references /> | |||
[[Категория:Packaging]] | [[Категория:Packaging]] |
Текущая версия от 12:17, 19 августа 2022
C 24 августа 2021 года в Сизифе включена[1] LTO (link-time optimization)[2].
- LTO - это безусловно полезная оптимизация, об этом много написано, см. напр. [3], поэтому ею хорошо было бы воспользоваться;
- LTO — это уже широко распространённая оптимизация, её уже включили в openSUSE[4], Fedora[5], Ubuntu[6], ClearLinux, скоро Debian, там уже вытоптали основные грабли, большинство фиксов пакетов заапстримлено, поэтому ею уже можно пользоваться;
- LTO — это уже настолько распространённая оптимизация, что скоро без LTO уже мало кто будет собирать, поэтому не пользоваться ею скоро будет себе дороже;
LTO поддерживается на всех архитектурах, кроме некоторых вторичных, где не GCC тулчейн.
Возникающие ошибки и их исправление
Упаковка статических библиотек (.a)
Статическое библиотеки собранные с -flto содержат GIMPLE байткод, который зависим от версии GCC, поэтому он удаляется из библиотек и производится проверка, что остались другие символы. В результате этой проверки пакеты, запаковывающие статические библиотеки, могут получить ошибку вида
process-lto: ERROR: ./usr/lib64/libtcb.a: contains __gnu_lto_slim
С такими пакетами можно поступить одним из двух способов:
- перестать паковать статические библиотеки;
- включить -ffat-lto-objects, добавив в спек-файл
%{?optflags_lto:%global optflags_lto %optflags_lto -ffat-lto-objects}
Статические библиотеки и объекты (.o) от других архитектур
Для ошибок вида
/usr/bin/strip: Unable to recognise the format of the input file `./usr/libexec/arm-none-eabi/lib/libm.a(lib_a-wrf_lgamma.o)'
сборку можно исправить, добавив такие библиотеки в %brp_strip_none.
Сборка с использованием Clang
Clang поддерживает LTO, но не поддерживает auto в -flto=auto и опцию -ffat-lto-objects, поэтому для пакетов собираемых Clang нужно переопределить optflags_lto или отключить LTO, например:
%define optflags_lto -flto=thin
Top-level asm
Наиболее актуально для криптографических и математических библиотек, кодеков. Из-за бага в GCC (PR57703) configure скрипты содержащие тесты с asm() дадут не правильный результат, что может сломать сборку. Для обхода можно включить -ffat-lto-objects. То же самое происходит у Clang, но там обход применить нельзя и придется LTO отключить.
Нестандартная линковка
Во вручную написанных Makefile могут потеряться флаги линковки. Для исправления их нужно туда добавить — например.
Сокрытие ошибок сборки
Включение LTO может скрывать некоторые ошибки компиляции дающие в итоге ошибочный код (в примере релевантно для SIMD оптимизации), поэтому я бы рекомендовал сначала собрать пакет без LTO, чтоб проверить его собираемость, посмотреть compile errors/warnings, включить тесты, а затем собрать пакет с LTO.
Прочие проблемы
При сборке некоторых пакетов могут встречаться и другие проблемы, связанные с включением LTO. С такими пакетами можно поступить одним из нескольких способов:
- обновить пакеты, весьма вероятно, что они уже исправлены в новых версиях;
- исправить LTO самостоятельно;
- послать баг-репорт в апстрим и/или в GCC;
- выключить LTO, переопределив макрос optflags_lto:
%define optflags_lto %nil
Ссылки
- ↑ I: LTO in %optflags by default
- ↑ https://gcc.gnu.org/onlinedocs/gccint/LTO.html
- ↑ Advanced Optimization and New Capabilities of GCC 10 (имеется статистика результатов включения LTO)
- ↑ openSUSE:LTO
- ↑ LTOByDefault in Fedora Project
- ↑ https://wiki.ubuntu.com/ToolChain/LTO