Message ID | 20130517111232.GE5162@dyad.programming.kicks-ass.net (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Peter Zijlstra <peterz@infradead.org> wrote: > On Thu, May 16, 2013 at 05:36:11PM +0200, Stephane Eranian wrote: > > On Thu, May 16, 2013 at 1:16 PM, Peter Zijlstra <peterz@infradead.org> wrote: > > > On Thu, May 16, 2013 at 08:15:17PM +1000, Michael Neuling wrote: > > >> Peter, > > >> > > >> BTW PowerPC also has the ability to filter on conditional branches. Any > > >> chance we could add something like the follow to perf also? > > >> > > > > > > I don't see an immediate problem with that except that we on x86 need to > > > implement that in the software filter. Stephane do you see any > > > fundamental issue with that? > > > > > On X86, the LBR cannot filter on conditional in HW. Thus as Peter said, it would > > have to be done in SW. I did not add that because I think those branches are > > not necessarily useful for tools. > > Wouldn't it be mostly conditional branches that are the primary control flow > and can get predicted wrong? I mean, I'm sure someone will miss-predict an > unconditional branch but its not like we care about people with such > afflictions do we? You could mispredict the target address of a computed goto. You'd know it was taken but not know target address until later in the pipeline. On this, the POWER8 branch history buffer tells us two things about the prediction status. 1) if the branch was predicted taken/not taken correctly 2) if the target address was predicted correctly or not (for computed gotos only) So we'd actually like more prediction bits too :-D > Anyway, since PPC people thought it worth baking into hardware, > presumably they have a compelling use case. Mikey could you see if you > can retrieve that from someone in the know? It might be interesting. I don't think we can mispredict a non-conditional non-computed but I'll have to check with the HW folks. Mikey > > Also, it looks like its trivial to add to x86, you seem to have already done > all the hard work by having X86_BR_JCC. > > The only missing piece would be: > > --- a/arch/x86/kernel/cpu/perf_event_intel_lbr.c > +++ b/arch/x86/kernel/cpu/perf_event_intel_lbr.c > @@ -337,6 +337,10 @@ static int intel_pmu_setup_sw_lbr_filter > > if (br_type & PERF_SAMPLE_BRANCH_IND_CALL) > mask |= X86_BR_IND_CALL; > + > + if (br_type & PERF_SAMPLE_BRANCH_CONDITIONAL) > + mask |= X86_BR_JCC; > + > /* > * stash actual user request into reg, it may > * be used by fixup code for some CPU >
On Fri, May 17, 2013 at 09:32:08PM +1000, Michael Neuling wrote: > Peter Zijlstra <peterz@infradead.org> wrote: > > Wouldn't it be mostly conditional branches that are the primary control flow > > and can get predicted wrong? I mean, I'm sure someone will miss-predict an > > unconditional branch but its not like we care about people with such > > afflictions do we? > > You could mispredict the target address of a computed goto. You'd know > it was taken but not know target address until later in the pipeline. Oh right, computed targets could indeed be mis predicted. I was more thinking about jumps with immediate values. > On this, the POWER8 branch history buffer tells us two things about the > prediction status. > 1) if the branch was predicted taken/not taken correctly > 2) if the target address was predicted correctly or not (for computed > gotos only) > So we'd actually like more prediction bits too :-D So if I understand this right, 1) maps to the predicted flags we have; 2) would be new stuff? We don't really have anything like that on x86, but I suppose if you make the thing optional and present a 'useful' use-case implemented in userspace code we could take it :-) > > Anyway, since PPC people thought it worth baking into hardware, > > presumably they have a compelling use case. Mikey could you see if you > > can retrieve that from someone in the know? It might be interesting. > > I don't think we can mispredict a non-conditional non-computed but I'll > have to check with the HW folks. I was mostly wondering about the use-case for the conditional filter. Stephane didn't think it useful, clearly your hardware guys thought different :-)
On Fri, May 17, 2013 at 1:39 PM, Peter Zijlstra <peterz@infradead.org> wrote: > On Fri, May 17, 2013 at 09:32:08PM +1000, Michael Neuling wrote: >> Peter Zijlstra <peterz@infradead.org> wrote: > >> > Wouldn't it be mostly conditional branches that are the primary control flow >> > and can get predicted wrong? I mean, I'm sure someone will miss-predict an >> > unconditional branch but its not like we care about people with such >> > afflictions do we? >> >> You could mispredict the target address of a computed goto. You'd know >> it was taken but not know target address until later in the pipeline. > > Oh right, computed targets could indeed be mis predicted. I was more thinking > about jumps with immediate values. > >> On this, the POWER8 branch history buffer tells us two things about the >> prediction status. >> 1) if the branch was predicted taken/not taken correctly >> 2) if the target address was predicted correctly or not (for computed >> gotos only) >> So we'd actually like more prediction bits too :-D > > So if I understand this right, 1) maps to the predicted flags we have; 2) > would be new stuff? > > We don't really have anything like that on x86, but I suppose if you make the > thing optional and present a 'useful' use-case implemented in userspace code > we could take it :-) > >> > Anyway, since PPC people thought it worth baking into hardware, >> > presumably they have a compelling use case. Mikey could you see if you >> > can retrieve that from someone in the know? It might be interesting. >> >> I don't think we can mispredict a non-conditional non-computed but I'll >> have to check with the HW folks. > > I was mostly wondering about the use-case for the conditional filter. Stephane > didn't think it useful, clearly your hardware guys thought different :-) From my experience talking with compiler people, they care about ALL the branches and not the conditional so much. They use LBR to do basic block profiling.
Stephane Eranian <eranian@google.com> wrote: > On Fri, May 17, 2013 at 1:39 PM, Peter Zijlstra <peterz@infradead.org> wrote: > > On Fri, May 17, 2013 at 09:32:08PM +1000, Michael Neuling wrote: > >> Peter Zijlstra <peterz@infradead.org> wrote: > > > >> > Wouldn't it be mostly conditional branches that are the primary control flow > >> > and can get predicted wrong? I mean, I'm sure someone will miss-predict an > >> > unconditional branch but its not like we care about people with such > >> > afflictions do we? > >> > >> You could mispredict the target address of a computed goto. You'd know > >> it was taken but not know target address until later in the pipeline. > > > > Oh right, computed targets could indeed be mis predicted. I was more thinking > > about jumps with immediate values. > > > >> On this, the POWER8 branch history buffer tells us two things about the > >> prediction status. > >> 1) if the branch was predicted taken/not taken correctly > >> 2) if the target address was predicted correctly or not (for computed > >> gotos only) > >> So we'd actually like more prediction bits too :-D > > > > So if I understand this right, 1) maps to the predicted flags we have; 2) > > would be new stuff? > > > > We don't really have anything like that on x86, but I suppose if you make the > > thing optional and present a 'useful' use-case implemented in userspace code > > we could take it :-) > > > >> > Anyway, since PPC people thought it worth baking into hardware, > >> > presumably they have a compelling use case. Mikey could you see if you > >> > can retrieve that from someone in the know? It might be interesting. > >> > >> I don't think we can mispredict a non-conditional non-computed but I'll > >> have to check with the HW folks. > > > > I was mostly wondering about the use-case for the conditional filter. Stephane > > didn't think it useful, clearly your hardware guys thought different :-) > > From my experience talking with compiler people, they care about ALL > the branches and not the conditional so much. They use LBR to do basic > block profiling. OK. I don't have a good handle on what's useful for compilers or JITs right now. I'm just plumbing through what's possible. Mikey
On Sat, May 18, 2013 at 12:14 AM, Michael Neuling <mikey@neuling.org> wrote: > Stephane Eranian <eranian@google.com> wrote: > >> On Fri, May 17, 2013 at 1:39 PM, Peter Zijlstra <peterz@infradead.org> wrote: >> > On Fri, May 17, 2013 at 09:32:08PM +1000, Michael Neuling wrote: >> >> Peter Zijlstra <peterz@infradead.org> wrote: >> > >> >> > Wouldn't it be mostly conditional branches that are the primary control flow >> >> > and can get predicted wrong? I mean, I'm sure someone will miss-predict an >> >> > unconditional branch but its not like we care about people with such >> >> > afflictions do we? >> >> >> >> You could mispredict the target address of a computed goto. You'd know >> >> it was taken but not know target address until later in the pipeline. >> > >> > Oh right, computed targets could indeed be mis predicted. I was more thinking >> > about jumps with immediate values. >> > >> >> On this, the POWER8 branch history buffer tells us two things about the >> >> prediction status. >> >> 1) if the branch was predicted taken/not taken correctly >> >> 2) if the target address was predicted correctly or not (for computed >> >> gotos only) >> >> So we'd actually like more prediction bits too :-D >> > >> > So if I understand this right, 1) maps to the predicted flags we have; 2) >> > would be new stuff? >> > >> > We don't really have anything like that on x86, but I suppose if you make the >> > thing optional and present a 'useful' use-case implemented in userspace code >> > we could take it :-) >> > >> >> > Anyway, since PPC people thought it worth baking into hardware, >> >> > presumably they have a compelling use case. Mikey could you see if you >> >> > can retrieve that from someone in the know? It might be interesting. >> >> >> >> I don't think we can mispredict a non-conditional non-computed but I'll >> >> have to check with the HW folks. >> > >> > I was mostly wondering about the use-case for the conditional filter. Stephane >> > didn't think it useful, clearly your hardware guys thought different :-) >> >> From my experience talking with compiler people, they care about ALL >> the branches and not the conditional so much. They use LBR to do basic >> block profiling. > > OK. I don't have a good handle on what's useful for compilers or JITs > right now. I'm just plumbing through what's possible. > I understand. It is okay to extend the interface.
Peter Zijlstra <peterz@infradead.org> wrote: > On Thu, May 16, 2013 at 05:36:11PM +0200, Stephane Eranian wrote: > > On Thu, May 16, 2013 at 1:16 PM, Peter Zijlstra <peterz@infradead.org> wrote: > > > On Thu, May 16, 2013 at 08:15:17PM +1000, Michael Neuling wrote: > > >> Peter, > > >> > > >> BTW PowerPC also has the ability to filter on conditional branches. Any > > >> chance we could add something like the follow to perf also? > > >> > > > > > > I don't see an immediate problem with that except that we on x86 need to > > > implement that in the software filter. Stephane do you see any > > > fundamental issue with that? > > > > > On X86, the LBR cannot filter on conditional in HW. Thus as Peter said, it would > > have to be done in SW. I did not add that because I think those branches are > > not necessarily useful for tools. > > Wouldn't it be mostly conditional branches that are the primary control flow > and can get predicted wrong? I mean, I'm sure someone will miss-predict an > unconditional branch but its not like we care about people with such > afflictions do we? > > Anyway, since PPC people thought it worth baking into hardware, presumably they > have a compelling use case. Mikey could you see if you can retrieve that from > someone in the know? It might be interesting. > > Also, it looks like its trivial to add to x86, you seem to have already done > all the hard work by having X86_BR_JCC. > > The only missing piece would be: Peter, Can we add your signed-off-by on this? We are cleaning up our series for conditional branches and would like to add this as part of the post. Mikey > > --- a/arch/x86/kernel/cpu/perf_event_intel_lbr.c > +++ b/arch/x86/kernel/cpu/perf_event_intel_lbr.c > @@ -337,6 +337,10 @@ static int intel_pmu_setup_sw_lbr_filter > > if (br_type & PERF_SAMPLE_BRANCH_IND_CALL) > mask |= X86_BR_IND_CALL; > + > + if (br_type & PERF_SAMPLE_BRANCH_CONDITIONAL) > + mask |= X86_BR_JCC; > + > /* > * stash actual user request into reg, it may > * be used by fixup code for some CPU >
On Tue, May 21, 2013 at 03:41:35PM +1000, Michael Neuling wrote: > Peter Zijlstra <peterz@infradead.org> wrote: > > Can we add your signed-off-by on this? > > We are cleaning up our series for conditional branches and would like to > add this as part of the post. Sure, but its completely untested.. I was hoping Stephane would say somnething about it since he wrote all that magic ;-) But yeah, feel free to add my SoB.
On Tue, May 21, 2013 at 10:50 AM, Peter Zijlstra <peterz@infradead.org> wrote: > On Tue, May 21, 2013 at 03:41:35PM +1000, Michael Neuling wrote: >> Peter Zijlstra <peterz@infradead.org> wrote: >> >> Can we add your signed-off-by on this? >> >> We are cleaning up our series for conditional branches and would like to >> add this as part of the post. > > Sure, but its completely untested.. I was hoping Stephane would say > somnething about it since he wrote all that magic ;-) > Let me take a look at it. > But yeah, feel free to add my SoB.
--- a/arch/x86/kernel/cpu/perf_event_intel_lbr.c +++ b/arch/x86/kernel/cpu/perf_event_intel_lbr.c @@ -337,6 +337,10 @@ static int intel_pmu_setup_sw_lbr_filter if (br_type & PERF_SAMPLE_BRANCH_IND_CALL) mask |= X86_BR_IND_CALL; + + if (br_type & PERF_SAMPLE_BRANCH_CONDITIONAL) + mask |= X86_BR_JCC; + /* * stash actual user request into reg, it may * be used by fixup code for some CPU