Comments 55
llvm.org/docs/LinkTimeOptimization.html
gcc.gnu.org/wiki/LinkTimeOptimization
< del >
Представьте себе, что у вас исходный код программы занимает несколько гигабайт, такой размер нередко встречается в серьезных программахНапример?
Оптимизированное дерево может быть преобразовано в машинный псевдокод понятный компилятору.Скорее всего это не псевдокод, а байткод.
Статье не хватает бенчмарков. Так же непонятен вопрос обновления — запускается ли автоматическая пересборка или нет. Так же вопрос, почему выбран бинарный дистрибутив.
Например?
alsoijw
du -sh /tmp/linux-5.12.10/
1,2G /tmp/linux-5.12.10/
Скорее всего это не псевдокод, а байткод.
Да LLVM IR. LLVM использует свой язык описания для описания многих структур поэтому псевдокод не является ошибкой. Пример github.com/llvm/llvm-project/commit/5b149c437194d10877e9e45b3d8cc9252af1944b
Статье не хватает бенчмарков. Так же непонятен вопрос обновления — запускается ли автоматическая пересборка или нет.
perf в помощь. У меня лично загрузка процессора упала при вызове API ядра. Пересборка остальных программ где-то быстрее где-то медленнее. В общем дало выигрыш хороший, упала загрузка процессора, стало меньше потребление памяти, анимации стали плавнее и производительнее. Сложно оценивать производительно современных компиляторов, в одних программах код будет быстрее в других наоборот. У меня есть бенчмарки для себя, где-то GCC выигрывает почти в 2 раза в скорости, где-то clang оказывается в раза 2 быстрее. clang в первую очередь дает более прогнозируемый код и не ломает поведение. Мне известны случаи когда GCC ломал поведение программ в случае переоптимизации, и поэтому разработчики программ отключали некоторые типы оптимизаций. Как знаю, в случае с рекурсивными вызовами их производительность будет увеличена в LLVM 13, но рекурсия в принципе является плохим тоном программирования и лучше ее избегать, переписывать алгоритм где есть возможность.
Так же непонятен вопрос обновления — запускается ли автоматическая пересборка или нет.
Не запускается, мой скрипт просто уменьшает количество действий, при установке все равно нужен sudo пароль. В принципе можно в крон или системд его прописать под рутом, и убрать проверку рута. Но сборка под рутом является плохим тоном.
Так же вопрос, почему выбран бинарный дистрибутив.
Мне не нужно собирать все. Дистрибутив выбран по принципу самое свежее ПО. Критические программы у меня собираются вручную. Arch Linux для этого хорошо создан и все делается удобно, можно автоматизировать сборку. У меня сборка всего критического автоматизирована, плюс где-то есть патчи которых нет в официальных пакетах github.com/h0tc0d3/arch-packages Плюс где-то программы даже свежее.
Пересборка остальных программ где-то быстрее где-то медленнее. В общем дало выигрыш хороший, упала загрузка процессора, стало меньше потребление памяти, анимации стали плавнее и производительнее.Вот это хочется увидеть в конкретных цифрах.
Мне не нужно собирать все.Существуют дистрибутивы с бинарным кешем, позволяющие пересобирать конкретные программы. В этом случае, пересборка будет происходить при обновлении системы автоматически, без костылей с кроном, там будет отдельный пользователь для сборки и так далее.
Мне известны случаи когда GCC ломал поведение программ в случае переоптимизации, и поэтому разработчики программ отключали некоторые типы оптимизаций.
Вот, кстати, никогда не понимал такую практику / советы. Если оптимизация ломает программу, значит в коде есть ошибка и надо её исправить. Иначе она может точно также неожиданно проявиться потом из-за какой-нибудь другой оптимизации при обновлении компилятора, причём независимо от того GCC это или Clang, а может даже и без оптимизаций на каких-нибудь других входных данных.
Если оптимизация ломает программу, значит в коде есть ошибка и надо её исправить.
Вопрос в том в коде чего ошибка - в коде компилируемой программы или в коде компилятора.
Гораздо чаще это ошибка именно в коде программы. Если это всё-таки ошибка компилятора, то конечно имеет смысл отправить баг-репорт и временно отключить оптимизацию (до выхода патча).
Понятно, что отключить оптимизацию сильно проще, чем искать ошибку, но это крайне безответственный подход (в первую очередь по отношению к качеству своего продукта). Очень сомневаюсь, что в том же Linux именно так и делают.
Вот к примеру баг llvm с которым лично столкнулся и там даже отписался bugs.llvm.org/show_bug.cgi?id=49915
Если честно, не верю, что ошибки компилятора, проявляющиеся в некорректной оптимизации корректного кода (не ломая процесс сборки), встречаются достаточно часто, чтобы сделать осмысленным совет отключать оптимизации не разбираясь в проблеме. Лично я с такими вообще ни разу не сталкивался, у вас по ссылке тоже судя по всему не тот случай.
Вот ограниченность ресурсов — очевидно корректный аргумент, но только если качеству продукта достаточно низкий приоритет отдаётся.
Не спорю ни с наличием багов в компиляторах, ни с отсутствием опыта разработки последних, спорю только с тем, что с ними легко столкнуться просто включив -O3.
Впрочем, теперь я понял, что именно вы представляете как преимущество clang.
Не раз встречал на хабре мнение, что любые агрессивные оптимизации — это некорректная работа компилятора, поэтому долго не мог понять, что вы имеете в виду под "корректностью работы -O3" и "поломкой поведения программ".
У меня были тоже подобные баги с LLVM, но у меня git версия и патчи сразу переношу в свой пакет aur.archlinux.org/packages/llvm12-git
И как, принимали патчи? А то я в своё время отправил тривиальный патч, а потом выяснил, что данная проблема уже поднималась, и присылался гораздо более полный патч, однако его так и не приняли, просив доработать. А потом, после нескольких правок с ним, как и с моим всё заглохло.
Очень странно, что Ryzen 9 3900x + AMD Radeon 5700 XT не вытягивает базовую анимацию рабочего стола без дерготни.Скорее всего, это проблемы KDE и Xorg, хотя я натыкался и на проблемы с GNOME. Порой складывается впечатление, что разработчики этих сред сами их не используют, так как в других средах, например Mate данных проблем нет.
меня к примеру в хромиум не работает hardware accelerationВ чём проблема? Vaapi не включается? Что насчёт firefox?
Canvas: Hardware accelerated
Compositing: Hardware accelerated
Multiple Raster Threads: Enabled
Out-of-process Rasterization: Disabled
OpenGL: Enabled
Rasterization: Software only. Hardware acceleration disabled
Skia Renderer: Enabled
Video Decode: Software only. Hardware acceleration disabled
Vulkan: Disabled
WebGL: Hardware accelerated
WebGL2: Hardware accelerated
На phoronix были тесты llvm и gcc: https://www.phoronix.com/scan.php?page=article&item=clang12-gcc11-icelake&num=6
Если кратко, то победил llvm clang в 63% тестов, в среднем быстрее на 9% чем gcc.
По большей части Clang победил в бесполезных тестах на нейросети, которые редко на CPU считают.
В более-менее полезных задачах преимущество, в основном, у GCC, да и то незначительное.
Что-то мне кажется, что для таких опытов лучше подойдёт Gentoo.
для таких опытов лучше подойдёт Gentoo.а в генту сейчас можно поставить вообще всю остальную систему из бинарных пакетов за несколько минут (при наличии шустрого интернета)? Арч тем и хорош, что он бинарный — но свежий, и свои пакеты собирать легко. Поэтому можно экспериментировать с чем хочешь, а с чем не хочешь — ставить из репо готовое. Много-много лет назад я именно поэтому его и выбрал.
И ни слова, собственно, о том, что эта самая LTO вообще делает. Что компилятор там может оптимизировать? Функции местами переставлять? Инлайнить функции?
en.wikipedia.org/wiki/Interprocedural_optimization
johanengelen.github.io/ldc/2016/11/10/Link-Time-Optimization-LDC.html
Следующий подводный момент заключается в DKMS, после установки ядра собранного с помощью Clang, DKMS пытается собрать модули ядра с помощью GCC. По этой причине сборка и установка DKMS модулей в новое ядро завершается ошибкой.
Интересно, почему модули собранные GCC не работают с ядром, собранным clang. Ведь, по идее, между ними только заголовки ядра (при компиляции) и бинарный интерфейс (при загрузке). Падает, я так понимаю, именно загрузка, да? Получается clang укладывает структуры или делает вызовы по-другому? Или у него другой формат .ko-файлов?
Building module:
cleaning build area…
KERNELDIR=/lib/modules/5.12.10-noname/build make driver...(bad exit status: 2)
Error! Bad return status for module build on kernel: 5.12.10-noname (x86_64)
Consult /var/lib/dkms/openrazer-driver/3.0.1/build/make.log for more information.
make.log
make -C /lib/modules/5.12.10-noname/build M=/var/lib/dkms/openrazer-driver/3.0.1/build/driver modules
make[1]: вход в каталог «/tmp/linux-5.12.10»
CC [M] /var/lib/dkms/openrazer-driver/3.0.1/build/driver/razerkbd_driver.o
gcc: ошибка: unrecognized command-line option «-Qunused-arguments»
gcc: ошибка: unrecognized command-line option «-mno-global-merge»
gcc: ошибка: unrecognized command-line option «-fsplit-lto-unit»
make[2]: *** [scripts/Makefile.build:271: /var/lib/dkms/openrazer-driver/3.0.1/build/driver/razerkbd_driver.o] Ошибка 1
make[1]: *** [Makefile:1851: /var/lib/dkms/openrazer-driver/3.0.1/build/driver] Ошибка 2
make[1]: выход из каталога «/tmp/linux-5.12.10»
make: *** [Makefile:25: driver] Ошибка 2
Вам может не нравится, но вот знаете, книжки для чайников имеют очень высокий рейтинг продаваемости, а все потому, что там пишут и объясняют самые простые вещи. И самое главное мне отписалось в личку несколько людей, которые не работают с линуксом, но заинтересовалось им благодаря статье. Если не верите могу скинуть скрины переписки. Рейтинг одобрения у статьи 85,9% и 76,8% это говорит о многом. Так что можете дальше завидовать и плеваться ядом, не зная к чему еще придраться. Еще и карму минусуете. Позорище.
CFLAGS
и CXXFLAGS
добавить -flto=thin
, и тогда автоматом всё будет собираться с тонкой оптимизацией. Возможно, ещё куда-то.В моих сборочных скриптах он добавлен, но не везде, только где я смог заставить его работать, и где смог сделать патчи, переписать сборочные скрипты или где мне разработчики сделали патчи на мой запрос. Мои сборочные скрипты сильно отличаются от тех, что в официальном репо. И не мало пакетов просто так не собирается с -flto.
Сборка ядра Linux с LTO оптимизацией