Re: [PATCH] pgo: add clang's Profile Guided Optimization infrastructure
From: Bill Wendling <morbo@google.com>
Date: 2021-01-11 20:24:08
Also in:
linux-doc, lkml
On Mon, Jan 11, 2021 at 12:12 PM Fangrui Song [off-list ref] wrote:
On 2021-01-11, 'Bill Wendling' via Clang Built Linux wrote:quoted
From: Sami Tolvanen <samitolvanen@google.com> Enable the use of clang's Profile-Guided Optimization[1]. To generate a profile, the kernel is instrumented with PGO counters, a representative workload is run, and the raw profile data is collected from /sys/kernel/debug/pgo/profraw. The raw profile data must be processed by clang's "llvm-profdata" tool before it can be used during recompilation: $ cp /sys/kernel/debug/pgo/profraw vmlinux.profraw $ llvm-profdata merge --output=vmlinux.profdata vmlinux.profraw Multiple raw profiles may be merged during this step. The data can be used either by the compiler if LTO isn't enabled: ... -fprofile-use=vmlinux.profdata ... or by LLD if LTO is enabled: ... -lto-cs-profile-file=vmlinux.profdata ...This LLD option does not exist. LLD does have some `--lto-*` options but the `-lto-*` form is not supported (it clashes with -l) https://reviews.llvm.org/D79371
That's strange. I've been using that option for years now. :-) Is this a recent change?
(There is an earlier -fprofile-instr-generate which does instrumentation in Clang, but the option does not have broad usage. It is used more for code coverage, not for optimization. Noticeably, it does not even implement the Kirchhoff's current law optimization)
Right. I've been told outside of this email that -fprofile-generate is the prefered flag to use.
-fprofile-use= is used by both regular PGO and context-sensitive PGO (CSPGO). clang -flto=thin -fprofile-use= passes -plugin-opt=cs-profile-path= to the linker. For regular PGO, this option is effectively a no-op (confirmed with CSPGO main developer). So I think the "or by LLD if LTO is enabled:" part should be removed.
But what if you specify the linking step explicitly? Linux doesn't call "clang" when linking, but "ld.lld". -bw