Profile-Guided Optimization (PGO) and Post-Link Optimization (PLO) usage in Vcpkg recipes #35190
zamazan4ik
started this conversation in
Ideas
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
Hi!
Now I am investigating PGO and PLO effects on different kinds of software - all my current results are available at https://github.com/zamazan4ik/awesome-pgo. According to these results, enabling PGO and PLO can help with achieving better overall performance in many cases. I think expanding PGO and PLO usage for the Vcpkg packages would be a good idea since it could help to achieve better software performance for Vcpkg users.
Profile-Guided Optimization (PGO)
PGO is already a well-known technique. All currently known PGO effects on performance can be found at https://github.com/zamazan4ik/awesome-pgo#pgo-showcases . Several OS distros already enabled PGO for packages like GCC, Clang, Rustc, Chromium, Firefox, and many others (it depends on each OS distro, of course).
I think we can start by enabling PGO at least for the following projects (these packages are already PGO-optimized in many OS distros):
Probably there are more PGO-suitable packages in the Vcpkg repository.
All found right now PGO results (with performance numbers) can be checked here - https://github.com/zamazan4ik/awesome-pgo#pgo-showcases
Post Link Optimization (PLO)
Regarding Post Link Optimization (PLO), right now there are two main tools - LLVM BOLT and Google Propeller.
According to the Facebook Research Paper (https://research.facebook.com/publications/bolt-a-practical-binary-optimizer-for-data-centers-and-beyond/), LLVM BOLT (https://github.com/llvm/llvm-project/blob/main/bolt/README.md) helps with achieving better performance for various packages like compilers and interpreters. I think it would be a good idea to enable LLVM BOLT for some packages to deliver faster binaries for users (since Propeller is less stable right now in my opinion).
Here I got some examples of how LLVM BOLT is already integrated into other projects:
So at least for the projects above LLVM BOLT effects are tested and some preparations are already done in the upstream projects. In this case, it should be easier to enable BOLT for these packages.
For some projects right now there is ongoing work on integrating LLVM BOLT into the build scripts:
More about LLVM BOLT performance results for other projects can be found in:
librustc_driver.so
with BOLT rust-lang/rust#116352Some OS already using LLVM BOLT in their build scripts - check Clang recipe in Solus.
Usually, PGO and PLO are mostly used for executable packages, not for libraries. However, PGO and PLO can be used for distributed libraries too - e.g. check
pydantic-core
case. We can think about PGO and PLO integration approaches into Vcpkg as well. Imagine the case when a user uses libraries from Vcpkg and wants to optimize them all according to their profile with PGO. How can we implement this case right now with Vcpkg? Do we need an additional integration in Vcpkg like it's done in Bazel?First, I want to discuss these optimization approaches with Vcpkg maintainers. What do you think about the ideas? If these ideas would be valuable for Vcpkg, then we can think about what to do next: create per-package corresponding PGO/PLO issues, create meta-tracking issues, etc.
Beta Was this translation helpful? Give feedback.
All reactions