[LLVMdev] RFC - Improvements to PGO profile support

Philip Reames listmail at philipreames.com
Wed Feb 25 14:14:42 PST 2015


On 02/25/2015 12:40 PM, Xinliang David Li wrote:
> On Wed, Feb 25, 2015 at 10:52 AM, Philip Reames
> <listmail at philipreames.com> wrote:
>> On 02/24/2015 03:31 PM, Diego Novillo wrote:
>>
>> Need to faithfully represent the execution count taken from dynamic
>> profiles. Currently, MD_prof does not really represent an execution count.
>> This makes things like comparing hotness across functions hard or
>> impossible. We need a concept of global hotness.
>>
>> What does MD_prof actually represent when used from Clang?  I know I've been
>> using it for execution counters in my frontend.  Am I approaching that
>> wrong?
>>
>> As a side comment: I'm a bit leery of the notion of a consistent notion of
>> hotness based on counters across functions.  These counters are almost
>> always approximate in practice and counting problems run rampant.
> Having representative training runs is pre-requisite for using FDO/PGO.
Representativeness is not the issue I'm raising.  Profiling systems 
(particularly instrumentation based ones) have systemic biases.  Not 
accounting for that can lead to some very odd results.  As an example:
void foo() {
   if (member)
      for(int i = 0; i < 100000; i++)
        if (member2)
           bar();
}

With multiple threads in play, it's entirely possible that the sum of 
the absolute weights on the second branch are lower than the sum of the 
absolute counts on the first branch.  (i.e. due to racy updating)  While 
you can avoid this by using race free updates, I know of very few 
systems that actually do.

If your optimization is radically unstable in such scenarios, that's a 
serious problem.  Pessimization is bad enough (if tolerable), incorrect 
transforms are not.  It's very easy to write a transform that implicitly 
assumes the counts for the first branch must be less than the counts for 
the second.

>
>>   I'd
>> almost rather see a consistent count inferred from data that's assumed to be
>> questionable than
>> make the frontend try to generate consistent profiling
>> metadata.
> Frontend does not generate profile data -- it is just a messenger that
> should pass the data faithfully to the middle end. That messenger
> (profile reader) can be in middle end too.
Er, we may be arguing terminology here.  I was including the profiling 
system as part of the "frontend" - I'm working with a JIT - whereas 
you're assuming a separate collection system.  It doesn't actually 
matter which terms we use.  My point was that assuming clean profiling 
data is just not reasonable in practice.  At minimum, some type of 
normalization step is required.
>
>> Other than the inliner, can you list the passes you think are profitable to
>> teach about profiling data?  My list so far is: PRE (particularly of
>> loads!), the vectorizer (i.e. duplicate work down both a hot and cold path
>> when it can be vectorized on the hot path), LoopUnswitch, IRCE, & LoopUnroll
>> (avoiding code size explosion in cold code).  I'm much more interested in
>> sources of improved performance than I am simply code size reduction.
>> (Reducing code size can improve performance of course.)
> PGO is very effective in code size reduction. In reality, large
> percentage of functions are globally cold.
For a traditional C++ application, yes.  For a JIT which is only 
compiling warm code paths in hot methods, not so much.  It's still 
helpful, but the impact is much smaller.

Philip



More information about the llvm-dev mailing list