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

Комментарии 29

А итоги то какие, есть адекватные замеры где можно увидеть результат? А то тут недавно писали про студентов которые оптимизировали, оптимизировали, а что соптимизировали сказать не смогли: https://habr.com/ru/post/698988/

По ядру Linux нет, все зависит от правильно собранного PGO профиля и нагрузки. Но в интернете есть бенчмарки очень большого количества программного обеспечения, так же бенчмарки есть в исходниках языков программирования где используется PGO оптимизация при сборке. Не говоря о том, что большая часть сложного софта сейчас собирают с PGO оптимизацией. Думаю создатели PGO оптимизации и компании производители программного обеспечения не дураки. Ну а если ..., то ждем от вас доказательств и пруфы. Ваша же статья по ссылке касается больше вас самих. Поэтому применять или нет, это вопрос только к вам. Мое дело только рассказать и открыть новые горизонты читателям.

www.phoronix.com/news/GCC-12-PGO-TR-3990X-AMD
Потерялась, но благодаря вашей помощи, успешно нашлась)

Почему программа не может сама себя постоянно анализировать и адаптироваться под ситуацию, т.е. подправлять себя?
Слишком сложно? Постоянный анализ бьёт по производительности? Или современные ОС и антивирусы будут активно мешать самомодификации?

Самомодификация это полиморфный код, антивирусы на него будут реагировать. Анализ ресурсоемкая задача, поэтому выигрыш от производительности будет съедать ее деградация от анализа. Плюс самомодификация тоже тяжеловесная задача, возьмите к примеру LTO оптимизацию и сравните насколько она увеличивает время линковки. Да банально возьмите упаковщик PE и сравните насколько медленее стала программа. И как вы можете заметить сами время компиляции на порядок дольше чем запуск самой программы. Что вы написали уже есть, и называет JIT-компиляция, правда она не везде применима. У любого метода есть плюсы и свои ограничения, нет ничего идеального в этом мире, везде используют компромиссы.

Это называется JIT-компиляция и она есть, например, в JVM и .NET

Но ведь виртуальная машина не изменяет себя, только запускаемый код?

Вам в принципе никто не мешает вместе с программой тащить обёртку (и вроде как её даже не очень сложно написать), которая будет снимать профиль, запускать анализ, пересобирать программу из исходников с полученным профилем и далее перезапускать.

Кстати, заметил на страничке LLVM тулзу bolt. Кажется, появилась не очень давно. Судя по описанию, это почти то, что вы ищете, только не автоматизированное.

Буквально - снимаете профиль нагрузки (например, с помощью perf), а потом с помощью этого профиля и bolt обрабатываете бинарь. Получается другой бинарь, перелинкованный так, чтобы работать быстрее при данном профиле. Магия в том, что для этого не нужен ни компилятор, ни исходники. И даже бинарь может быть не прямо тот же самый, а какой-нибудь близкой версии.

Этот подход - "self-driven" - имеет место быть, например, в СУБД. https://noise.page/

Всё же какие-то замеры были бы кстати. А то вдруг у Вас как раз и вышло, что стало медленнее.

Что будет у меня не факт, что будет у вас. Что именно вы предлагаете замерить?
Замеры должны делать вы сами, все экспериментальные методы так и помечены в ядре, как экспериментальные. Т.е. вы их используете на свой страх и риск, и сами решаете нужно это вам или нет.
Вы делаете замеры на своей нагрузке и смотрите дает это вам выигрыш с вашей нагрузкой или нет.

Я эти утверждения уже видел в статье.

Вы же говорите, что, мол, наслаждайтесь оптимизированным(!) ядром, но как Вы это без замеров (на Ваших же задачах) можете утверждать? В этом и вопрос.

Могу задать встречный вопрос. Как вы можете утверждать обратное, если не привели доказательств и опровержений?

Эмм, Вы же написали статью про оптимизацию.

В математике тоже много чего написано, но пока это не опровергнуто принимается всеми за истину. Вся математика построена на этом.

Я не автор заданного вам вопроса, но всё-таки вмешаюсь. Вы сказали, что есть некая pgo-оптимизация по умолчанию (текущая реализация), а вы её якобы ещё ускорили и предложили какой-то патч. Вот вас и спросили, а в чем конкретно ваше ускорение состоит?

>Скачайте патч по ссылке Патч PGO Оптимизация.

Вот в этом патче что конкретно ?

Я там ничего не ускорял, перечитайте внимательно статью, там все изменения написаны в последнем абзаце.
Если в кратце я добавил поддержку профиля llvm 13-14, оригинальная версия патча работала с профилем 12 версии, она собирала профиль, но при конвертации сырого профиля выскакивала ошибка т.к. формат профиля отличался.

После того как компания Google выпустила набор патчей для PGO оптимизации, мною была добавлена поддержка LLVM 13 и LLVM 14, т.к. в них менялся формат профиля и с оригинальными патчами clang его не понимает. Также файл профиля и сброса были перенесены из debugfs в proc для устранения проблем с включённым kernel_lockdown (man kernel_lockdown) в ядре Linux, который не даёт прочесть профиль. Данное изменение позволять профилировать ядро с включёнными системами безопасности ядра, без их отключения на этапе загрузки. Дополнительную информацию вы можете найти в файле Documentation/dev-tools/pgo.rst после применения патча ядра.
Спасибо за разъяснения, я примерно так и думал, но решил уточнить.
насчет
>> добавил поддержку профиля llvm 13-14
а в мейнстрим эти изменения никто не хочет добавить?
Нет, Линус Торвальдс не принял патчи по причине того, что якобы можно для этого еще использовать написанный им perf, но я нигде не видел как это сделать. Теоретически можно использовать AutoFDO, но когда я с ним игрался и с ядром ничего хорошего из этого не вышло, профиль нормально не собирался. Чистой воды политика.
Что будет у меня не факт, что будет у вас.
Так у вас никто не просит гарантий что у всех всё станет быстрее. Но писать статью об оптимизациях без цифр — это что-то крайне странное. Откуда вы знаете, что там что-то соптимизирорвалось? Может наоборот медленнее стало (примеров замедляющих «оптимизаций» навалом). Апелляция к авторитетам («Думаю создатели PGO оптимизации и компании производители программного обеспечения не дураки») тут не работает
Откройте ссылку, там есть все результаты github.com/h0tc0d3/linux_pgo
Для удобства сравнения результатов можете использовать KDiff3 или Kompare.

Приложите, плиз, данную ссылку в конце статьи, она будет выглядеть хотя бы законченной.

arch/x86/tools/insn_decoder_test: warning: Found an x86 instruction decoder bug, please report this.
arch/x86/tools/insn_decoder_test: warning: ffffffff81d68bb2: f2 0f 78 c0 08 08 insertq $0x8,$0x8,%xmm0,%xmm0
arch/x86/tools/insn_decoder_test: warning: objdump says 6 bytes, but insn_get_length() says 0

А что это значит? Компиляция с профилем привела к ошибочным оптимизациям, из-за которых сломался встроенный в ядро декодер длин инструкций? Выглядит опасно, тогда ведь могло сломаться и другое место, но не покрытое такой проверкой.

Я думаю это произошло из-за линковки стаба rt llvm необходимого для профилирования, и в начале каждой функции встраивался ассемблерный код, который вызывал этот стаб, в коде могли быть ассемблерные вставки, или слишком большой код и inline вставки, которые компилятор чудным образом оптимизировал, как помню это была очень тяжелая функция со сложным ветвлением, и происходил сбой. Потом эта проблема исчезла из ядра. Но я запечатлил ее, чтобы потом показать. В переписке к патчу ядра это тоже упоминалось, что не каждую функцию можно просто так профилировать. Ядро обычно все ошибки сразу сообщает, на край ядро обкатывается на qemu. Я пока ловил баг с AMD Secure Memory Encryption (SME) support, ядро успешно запускалось в qemu, долго не мог понять в чем причина, ни кернел паник, ни дампов ядра, просто ядро зависало на самом раннем этапе загрузки.

Оптимизация это (почти) всегда хорошо, особенно если прирост в производительности ощутимый. А какой у Вас он в итоге получился и как производились измерения? Какой метод оптимизации сколько выжал? Просто самое основное не совсем очевидно из статьи.

Спасибо. Где то 10% в среднем, неплохо в общем-то.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий