zamazan4ik / awesome-pgo

Various materials about Profile Guided Optimization and other similar stuff like AutoFDO, Bolt, etc.
MIT License
238 stars 6 forks source link

awesome-pgo

Various materials about Profile Guided Optimization (PGO) and other similar stuff like AutoFDO, Bolt, etc.

!!!ARTICLE!!!

There is an (unfinished) article about all the details about PGO, PLO, etc. - link. With high chance, it will answer (almost) all your questions about PGO and PLO.

How to fail with PGO?

The PGO implementer

Theory (a little bit)

Also, you could find PDO (Profile Directed Optimization), FDO (Feedback Driven Optimization), FBO (Feedback Based Optimization), PDF (Profile Directed Feedback), PBO (Profile Based Optimization) - do not worry, that's just a PGO but with a different name.

Additionally, I need to mention Link-Time Optimization (LTO) since usually PGO is applied after LTO (since usually LTO is easier to enable and it brings significant performance and/or binary size improvements). PGO does not replace LTO but complements it. More information about LTO can be found in lto.md.

PGO Showcases

Here I collect links to the articles/benchmarks/etc. with PGO on multiple projects (with numbers!).

Browsers

Compilers and interpreters

Developer tooling

Operating systems

Virtual machines

Databases

Logging

Proxy

Other

Projects with already integrated PGO into their build scripts

Below you can find some examples of where and how PGO is integrated into different projects.

Project-specific documentation about PGO

Here we collect projects where PGO is described as an optimization option in the documentation:

PGO support in programming languages and compilers

Possibly other compilers support PGO too. If you know any, please let me know.

PGO support in build systems

Here we collect and track PGO integrations into build systems:

Sampling PGO (AutoFDO) support

Here we collect information about supporting PGO via sampling across different compilers.

Are we PGO yet?

Check "are_we_pgo_yet.md" file in the repo to check the PGO status in a project.

BOLT showcases

Here I collect all results by applying LLVM BOLT to the projects (with numbers).

Projects with already integrated BOLT into their build scripts

Are we BOLT yet?

Just a list of BOLT-related issues in different projects. So you can estimate the BOLT state in your favorite open-source product.

LTO, PGO, BOLT, etc and provided by someone binaries

Well, it's hard to say, is your binary already LTO/PGO optimized or not. It depends on multiple factors like upstream support for LTO/PGO, maintainers willing to enable these optimizations, etc. Usually, the most obvious way to check it - just ask the question "Is the binary LTO/PGO optimized?" from the binary author (a person who built the binary). It could be your colleague (if you build programs on your own), build scripts from CI, maintainers from your favorite OS/repository (if you use provided by repos binaries), software developers (if you use downloaded from a site "official" binaries). Do not hesitate to ask!

PGO adoption across projects

PGO usually is not enabled by the upstream developers due to a lack of support for sample load or a lack of resources for the multi-stage build. So please ask maintainers explicitly about PGO support addition.

PGO adoption across Linux distros

Even if PGO is supported by a project, it does not mean that your favorite Linux distro builds this project with PGO enabled. For this there are a lot of reasons: maintainer burden (because we are humans (yet)), build machines burden (in general you need to compile twice), reproducibility issues (like profile is an additional input to the build process and you need to make it reproducible), a maintainer just don't know about PGO, etc.

So here I will try to collect information about the PGO status across the Linux distros for the projects that support PGO in the upstream. If you didn't find your distro - don't worry! Just check it somehow (probably in some chats/distros' build systems, etc.) and report it here (e.g. via Issues) - I will add it to the list.

BOLT adoption across Linux distros

Here we track LLVM BOLT enablement across various projects in various OS-specific build scripts:

Meta-issues about PGO and LLVM BOLT usage in different OSs and package managers:

Other optimization techniques like BOLT

BOLT and others certainly are not enabled by default anywhere right now. So if you see a performance improvement from it - contact the upstream.

Beyond PGO (could be covered here later as well)

Traps

The biggest problem is "How to collect a good profile?". There are multiple ways to do this:

In my opinion, usually you should start with simple PGO via Instrumentation mode, especially if you upgrade your binaries seldomly. And only if Instrumentation starts to hurt you - start thinking about AutoFDO.

Another issue could be reproducibility. Since you are injecting some information from runtime (some execution counters based on your sample workload) you get more variables that could influence your binary. In this case, you need to store somewhere in VCS your sample workload, probably collected profiles based on this workload, etc.

Other pitfalls include the following things:

Useful links

Communities

Here is the incomplete community list where you can find PGO-related advice with higher probability:

Related projects

Where PGO did not help (according to my tests)

Contribute

If you have an example where PGO shines (and where doesn't) - please open an issue and/or PR to the repo. It's important to collect as many as possible showcases about PGO!