On Tue, 2017-12-05 at 10:00 -0500, William Cohen wrote: > On 12/05/2017 01:42 AM, Stephane Eranian wrote: > > Will, > > > > There is something I am missing here. You are creating _ALT version of > > events with the same event code. > > What's the point of that?
The event codes should be unique. The recent changes are mostly to add _ALTx to the names to ensure they are unique enough. More clarification below. > > There should not be duplicate event names in any event tables. The > > validation checks verify this. > > On PPC, I understand that the event code is manually crafted and contains > > more than an event code. > > So are you saying that sometimes, you want to specify an evnet multiple > > times, but to do so, you need > > to use different event codes? > > Please clarify. > > Thanks. > > Hi Stephane, > > I don't have the Power9 documentation (Will Schmidt, is there a public > version of power 9 docs available now?), so I don't know the > details of the contraints on how different event can (and cannot) be > concurrently used. There was some earlier discussion on the papi > mailing list about papi preset PAPI_L1_DCM being unusable on power9 > because the PM_LD_MISS_L1 and PM_ST_MISS_L1 could not be used > concurrently on power9. Power has some alternative codings for some > of the events that can be used instead to allow these metrics to be > gathered concurrently. Those alternative encodings were added to > libpfm by: > At a high-ish level, for ppc64*, there are 4 counters on which events can be measured. Events are usually only valid on one of the four counters. The leading 0x1.... through 0x4.... in the pme_code field tend to indicate which counter the event is valid on. If two events are both defined for the same counter, they won't work concurrently. So to make things better, a few of the often used events have alternates that utilize one or more of the other counters. So as example, looking at the LD and ST events (which is where we recently noticed this problem), after the _ALT naming fix went in: We were trying to run both the LD and ST event concurrently, and were failing, because both were defined for and trying to use counter #3. [ POWER9_PME_PM_LD_MISS_L1 ] = { .pme_name = "PM_LD_MISS_L1", .pme_code = 0x000003E054, ^ counter #3 [ POWER9_PME_PM_ST_MISS_L1 ] = { .pme_name = "PM_ST_MISS_L1", .pme_code = 0x00000300F0, ^ counter #3 So that 'fix' was to add the alternate event for the LD, which happens to be defined for counter #4. And then to use that PM_LD_MISS_L1_ALT reference in place of PM_LD_MISS_L1 where we needed to. [ POWER9_PME_PM_LD_MISS_L1_ALT ] = { .pme_name = "PM_LD_MISS_L1_ALT", .pme_code = 0x00000400F0, ^ counter #4 There are a few recent changes flying around, which consist of: 1 - adding the alternate event to the table. 2 - making sure the pme_name reflects the _ALT name. I'll add, just to be clear, that the 'fixes' were mostly to fill in content that I had fumbled when initially building the table. (We can't just swap out 3's for 4's, etc). They should have been in place initially, it's simply something I missed when I did the initial generation of the tables. Thanks -Will (Schmidt) > commit ed3f51c4690685675cf2766edb90acbc0c1cdb67 (upstream/master, master) > Author: Will Schmidt <will_schm...@vnet.ibm.com> > Date: Sun Dec 3 09:42:44 2017 -0800 > > Add alternate event numbers for power9. > > I had previously missed adding the _ALT entries, which allow some > events to be specified on different counters. This patch fills > those in. > > This patch also adds a few validation tests for the ALT events. > > Signed-off-by: Will Schmidt <will_schm...@vnet.ibm.com> > > However, the above mentioned patch uses the same names multiple times once > for the orginal event and another time for the alternative encoding. This > made it impossible to select select the alternative events by name. The > follow on patch makes the names unique. I took a look through the > power9_events.h and this patch. The event pme_codes are different between > the normal and alt version of the events. > > -Will Cohen > > > > > On Mon, Dec 4, 2017 at 10:35 AM, William Cohen <wco...@redhat.com > > <mailto:wco...@redhat.com>> wrote: > > > > Older versions of PAPI use the event name to look up the libpfm event > > number when doing the enumeration of the available events. If there > > were multiple events with the same name in libpfm, the earliest one > > would be selected. This selection would cause the enumeration of > > events in papi_native_avail to get stuck looping on the first > > duplicated named event in a pmu. In the case of IBM Power 9 the > > enumeration would get stuck on PM_CO0_BUSY. Gave each event a unique > > name to avoid this unfortunate behavior. > > --- > > lib/events/power9_events.h | 48 > > +++++++++++++++++++++++----------------------- > > 1 file changed, 24 insertions(+), 24 deletions(-) > > > > diff --git a/lib/events/power9_events.h b/lib/events/power9_events.h > > index d77bab3..f352ace 100644 > > --- a/lib/events/power9_events.h > > +++ b/lib/events/power9_events.h > > @@ -1550,7 +1550,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "CO mach 0 Busy. Used by PMU to sample ave CO > > lifetime (mach0 used as sample point)", > > }, > > [ POWER9_PME_PM_CO0_BUSY_ALT ] = { > > - .pme_name = "PM_CO0_BUSY", > > + .pme_name = "PM_CO0_BUSY_ALT", > > .pme_code = 0x000004608C, > > .pme_short_desc = "CO mach 0 Busy.", > > .pme_long_desc = "CO mach 0 Busy. Used by PMU to sample ave CO > > lifetime (mach0 used as sample point)", > > @@ -2277,7 +2277,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "Data SLB Miss - Total of all segment sizes", > > }, > > [ POWER9_PME_PM_DSLB_MISS_ALT ] = { > > - .pme_name = "PM_DSLB_MISS", > > + .pme_name = "PM_DSLB_MISS_ALT", > > .pme_code = 0x0000010016, > > .pme_short_desc = "gate_and(sd_pc_c0_comp_valid AND > > sd_pc_c0_comp_thread(0:1)=tid,sd_pc_c0_comp_ppc_count(0:3)) + > > gate_and(sd_pc_c1_comp_valid AND > > sd_pc_c1_comp_thread(0:1)=tid,sd_pc_c1_comp_ppc_count(0:3))", > > .pme_long_desc = "gate_and(sd_pc_c0_comp_valid AND > > sd_pc_c0_comp_thread(0:1)=tid,sd_pc_c0_comp_ppc_count(0:3)) + > > gate_and(sd_pc_c1_comp_valid AND > > sd_pc_c1_comp_thread(0:1)=tid,sd_pc_c1_comp_ppc_count(0:3))", > > @@ -3155,7 +3155,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "Instruction SLB Miss - Total of all segment > > sizes", > > }, > > [ POWER9_PME_PM_ISLB_MISS_ALT ] = { > > - .pme_name = "PM_ISLB_MISS", > > + .pme_name = "PM_ISLB_MISS_ALT", > > .pme_code = 0x0000040006, > > .pme_short_desc = "Number of ISLB misses for this thread", > > .pme_long_desc = "Number of ISLB misses for this thread", > > @@ -3323,7 +3323,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "All successful I-side dispatches that were an > > L2 miss for this thread (excludes i_l2mru_tch reqs)", > > }, > > [ POWER9_PME_PM_L2_INST_MISS_ALT ] = { > > - .pme_name = "PM_L2_INST_MISS", > > + .pme_name = "PM_L2_INST_MISS_ALT", > > .pme_code = 0x000004609E, > > .pme_short_desc = "All successful I-side dispatches that were > > an L2 miss for this thread (excludes i_l2mru_tch reqs)", > > .pme_long_desc = "All successful I-side dispatches that were an > > L2 miss for this thread (excludes i_l2mru_tch reqs)", > > @@ -3335,7 +3335,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "All successful I-side dispatches for this > > thread (excludes i_l2mru_tch reqs)", > > }, > > [ POWER9_PME_PM_L2_INST_ALT ] = { > > - .pme_name = "PM_L2_INST", > > + .pme_name = "PM_L2_INST_ALT", > > .pme_code = 0x000003609E, > > .pme_short_desc = "All successful I-side dispatches for this > > thread (excludes i_l2mru_tch reqs)", > > .pme_long_desc = "All successful I-side dispatches for this > > thread (excludes i_l2mru_tch reqs)", > > @@ -3347,7 +3347,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "All successful D-side load dispatches for > > this thread (L2 miss + L2 hits)", > > }, > > [ POWER9_PME_PM_L2_LD_DISP_ALT ] = { > > - .pme_name = "PM_L2_LD_DISP", > > + .pme_name = "PM_L2_LD_DISP_ALT", > > .pme_code = 0x0000036082, > > .pme_short_desc = "All successful I-or-D side load dispatches > > for this thread (excludes i_l2mru_tch_reqs)", > > .pme_long_desc = "All successful I-or-D side load dispatches > > for this thread (excludes i_l2mru_tch_reqs)", > > @@ -3359,7 +3359,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "All successful D-side load dispatches that > > were L2 hits for this thread", > > }, > > [ POWER9_PME_PM_L2_LD_HIT_ALT ] = { > > - .pme_name = "PM_L2_LD_HIT", > > + .pme_name = "PM_L2_LD_HIT_ALT", > > .pme_code = 0x0000036882, > > .pme_short_desc = "All successful I-or-D side load dispatches > > for this thread that were L2 hits (excludes i_l2mru_tch_reqs)", > > .pme_long_desc = "All successful I-or-D side load dispatches > > for this thread that were L2 hits (excludes i_l2mru_tch_reqs)", > > @@ -3449,7 +3449,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "RC retries on PB for any load from core > > (excludes DCBFs)", > > }, > > [ POWER9_PME_PM_L2_RTY_LD_ALT ] = { > > - .pme_name = "PM_L2_RTY_LD", > > + .pme_name = "PM_L2_RTY_LD_ALT", > > .pme_code = 0x000003689E, > > .pme_short_desc = "RC retries on PB for any load from core > > (excludes DCBFs)", > > .pme_long_desc = "RC retries on PB for any load from core > > (excludes DCBFs)", > > @@ -3461,7 +3461,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "RC retries on PB for any store from core > > (excludes DCBFs)", > > }, > > [ POWER9_PME_PM_L2_RTY_ST_ALT ] = { > > - .pme_name = "PM_L2_RTY_ST", > > + .pme_name = "PM_L2_RTY_ST_ALT", > > .pme_code = 0x000004689E, > > .pme_short_desc = "RC retries on PB for any store from core > > (excludes DCBFs)", > > .pme_long_desc = "RC retries on PB for any store from core > > (excludes DCBFs)", > > @@ -3479,7 +3479,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "SNP dispatched for a write and was M (true > > M); for DMA cacheinj this will pulse if rty/push is required (won't pulse > > if cacheinj is accepted)", > > }, > > [ POWER9_PME_PM_L2_SN_M_WR_DONE_ALT ] = { > > - .pme_name = "PM_L2_SN_M_WR_DONE", > > + .pme_name = "PM_L2_SN_M_WR_DONE_ALT", > > .pme_code = 0x0000046886, > > .pme_short_desc = "SNP dispatched for a write and was M (true > > M); for DMA cacheinj this will pulse if rty/push is required (won't pulse > > if cacheinj is accepted)", > > .pme_long_desc = "SNP dispatched for a write and was M (true > > M); for DMA cacheinj this will pulse if rty/push is required (won't pulse > > if cacheinj is accepted)", > > @@ -3497,7 +3497,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "All successful D-side store dispatches for > > this thread", > > }, > > [ POWER9_PME_PM_L2_ST_DISP_ALT ] = { > > - .pme_name = "PM_L2_ST_DISP", > > + .pme_name = "PM_L2_ST_DISP_ALT", > > .pme_code = 0x000001689E, > > .pme_short_desc = "All successful D-side store dispatches for > > this thread (L2 miss + L2 hits)", > > .pme_long_desc = "All successful D-side store dispatches for > > this thread (L2 miss + L2 hits)", > > @@ -3509,7 +3509,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "All successful D-side store dispatches for > > this thread that were L2 hits", > > }, > > [ POWER9_PME_PM_L2_ST_HIT_ALT ] = { > > - .pme_name = "PM_L2_ST_HIT", > > + .pme_name = "PM_L2_ST_HIT_ALT", > > .pme_code = 0x000002689E, > > .pme_short_desc = "All successful D-side store dispatches that > > were L2 hits for this thread", > > .pme_long_desc = "All successful D-side store dispatches that > > were L2 hits for this thread", > > @@ -3587,7 +3587,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "Lifetime, sample of CO machine 0 valid", > > }, > > [ POWER9_PME_PM_L3_CO0_BUSY_ALT ] = { > > - .pme_name = "PM_L3_CO0_BUSY", > > + .pme_name = "PM_L3_CO0_BUSY_ALT", > > .pme_code = 0x00000468AC, > > .pme_short_desc = "Lifetime, sample of CO machine 0 valid", > > .pme_long_desc = "Lifetime, sample of CO machine 0 valid", > > @@ -3617,7 +3617,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "L3 castouts in Mepf state for this thread", > > }, > > [ POWER9_PME_PM_L3_CO_MEPF_ALT ] = { > > - .pme_name = "PM_L3_CO_MEPF", > > + .pme_name = "PM_L3_CO_MEPF_ALT", > > .pme_code = 0x00000168A0, > > .pme_short_desc = "L3 CO of line in Mep state (includes > > casthrough to memory).", > > .pme_long_desc = "L3 CO of line in Mep state (includes > > casthrough to memory). The Mepf state indicates that a line was brought in > > to satisfy an L3 prefetch request", > > @@ -3731,7 +3731,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "L3 CO received retry port 0 (memory only), > > every retry counted", > > }, > > [ POWER9_PME_PM_L3_P0_CO_RTY_ALT ] = { > > - .pme_name = "PM_L3_P0_CO_RTY", > > + .pme_name = "PM_L3_P0_CO_RTY_ALT", > > .pme_code = 0x00000460AE, > > .pme_short_desc = "L3 CO received retry port 2 (memory only), > > every retry counted", > > .pme_long_desc = "L3 CO received retry port 2 (memory only), > > every retry counted", > > @@ -3773,7 +3773,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "L3 PF received retry port 0, every retry > > counted", > > }, > > [ POWER9_PME_PM_L3_P0_PF_RTY_ALT ] = { > > - .pme_name = "PM_L3_P0_PF_RTY", > > + .pme_name = "PM_L3_P0_PF_RTY_ALT", > > .pme_code = 0x00000260AE, > > .pme_short_desc = "L3 PF received retry port 2, every retry > > counted", > > .pme_long_desc = "L3 PF received retry port 2, every retry > > counted", > > @@ -3803,7 +3803,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "L3 CO received retry port 1 (memory only), > > every retry counted", > > }, > > [ POWER9_PME_PM_L3_P1_CO_RTY_ALT ] = { > > - .pme_name = "PM_L3_P1_CO_RTY", > > + .pme_name = "PM_L3_P1_CO_RTY_ALT", > > .pme_code = 0x00000468AE, > > .pme_short_desc = "L3 CO received retry port 3 (memory only), > > every retry counted", > > .pme_long_desc = "L3 CO received retry port 3 (memory only), > > every retry counted", > > @@ -3845,7 +3845,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "L3 PF received retry port 1, every retry > > counted", > > }, > > [ POWER9_PME_PM_L3_P1_PF_RTY_ALT ] = { > > - .pme_name = "PM_L3_P1_PF_RTY", > > + .pme_name = "PM_L3_P1_PF_RTY_ALT", > > .pme_code = 0x00000268AE, > > .pme_short_desc = "L3 PF received retry port 3, every retry > > counted", > > .pme_long_desc = "L3 PF received retry port 3, every retry > > counted", > > @@ -3875,7 +3875,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "Lifetime, sample of PF machine 0 valid", > > }, > > [ POWER9_PME_PM_L3_PF0_BUSY_ALT ] = { > > - .pme_name = "PM_L3_PF0_BUSY", > > + .pme_name = "PM_L3_PF0_BUSY_ALT", > > .pme_code = 0x00000460B4, > > .pme_short_desc = "Lifetime, sample of PF machine 0 valid", > > .pme_long_desc = "Lifetime, sample of PF machine 0 valid", > > @@ -3929,7 +3929,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "Lifetime, sample of RD machine 0 valid", > > }, > > [ POWER9_PME_PM_L3_RD0_BUSY_ALT ] = { > > - .pme_name = "PM_L3_RD0_BUSY", > > + .pme_name = "PM_L3_RD0_BUSY_ALT", > > .pme_code = 0x00000468B4, > > .pme_short_desc = "Lifetime, sample of RD machine 0 valid", > > .pme_long_desc = "Lifetime, sample of RD machine 0 valid", > > @@ -3947,7 +3947,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "Lifetime, sample of snooper machine 0 valid", > > }, > > [ POWER9_PME_PM_L3_SN0_BUSY_ALT ] = { > > - .pme_name = "PM_L3_SN0_BUSY", > > + .pme_name = "PM_L3_SN0_BUSY_ALT", > > .pme_code = 0x00000460AC, > > .pme_short_desc = "Lifetime, sample of snooper machine 0 valid", > > .pme_long_desc = "Lifetime, sample of snooper machine 0 valid", > > @@ -3989,7 +3989,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "Rotating sample of 8 WI valid", > > }, > > [ POWER9_PME_PM_L3_WI0_BUSY_ALT ] = { > > - .pme_name = "PM_L3_WI0_BUSY", > > + .pme_name = "PM_L3_WI0_BUSY_ALT", > > .pme_code = 0x00000260B6, > > .pme_short_desc = "Rotating sample of 8 WI valid (duplicate)", > > .pme_long_desc = "Rotating sample of 8 WI valid (duplicate)", > > @@ -5928,7 +5928,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "RC mach 0 Busy. Used by PMU to sample ave RC > > lifetime (mach0 used as sample point)", > > }, > > [ POWER9_PME_PM_RC0_BUSY_ALT ] = { > > - .pme_name = "PM_RC0_BUSY", > > + .pme_name = "PM_RC0_BUSY_ALT", > > .pme_code = 0x000002608C, > > .pme_short_desc = "RC mach 0 Busy.", > > .pme_long_desc = "RC mach 0 Busy. Used by PMU to sample ave RC > > lifetime (mach0 used as sample point)", > > @@ -6042,7 +6042,7 @@ static const pme_power_entry_t power9_pe[] = { > > .pme_long_desc = "SN mach 0 Busy. Used by PMU to sample ave SN > > lifetime (mach0 used as sample point)", > > }, > > [ POWER9_PME_PM_SN0_BUSY_ALT ] = { > > - .pme_name = "PM_SN0_BUSY", > > + .pme_name = "PM_SN0_BUSY_ALT", > > .pme_code = 0x0000026090, > > .pme_short_desc = "SN mach 0 Busy.", > > .pme_long_desc = "SN mach 0 Busy. Used by PMU to sample ave SN > > lifetime (mach0 used as sample point)", > > -- > > 2.13.6 > > > > > ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ perfmon2-devel mailing list perfmon2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/perfmon2-devel