PMC.SANDYBRIDGEXEON(3)
๐ PMC.SANDYBRIDGEXEON(3) ๐
okay so bestie, welcome to the pmc.sandybridgexeon page โ this is the manual for the Intel Sandy Bridge Xeon family of CPUs and their measurement events. it lives in the Library Functions Manual section, and ngl, it's a whole vibe. grab a snack, we're getting into hardware counters ๐
๐ LIBRARY
Performance Counters Library โ aka <code>libpmc</code>, link it with <code>-lpmc</code> ๐ซถ
โจ SYNOPSIS
#include <pmc.h>
that's literally it, she's low-maintenance ๐
๐ธ DESCRIPTION
so Intel Sandy Bridge Xeon CPUs contain PMCs that conform to version 2 of the Intel performance measurement architecture. and these CPUs may contain up to two classes of PMCs, bestie:
PMC_CLASS_IAFโ fixed-function counters that count only one hardware event per counter. one job, one event, she's focused ๐PMC_CLASS_IAPโ programmable counters that may be configured to count one of a defined set of hardware events. choose your fighter โจ
heads up! the number of PMCs available in each class and their widths need to be determined at run time by calling pmc_cpuinfo(3). you can't just assume, okay? do the vibe check first ๐
the Intel Sandy Bridge Xeon PMCs are documented in โVolume 3B: System Programming Guide, Part 2โ, Intel(R) 64 and IA-32 Architectures Software Developer's Manual, Order Number: 253669-043US, Intel Corporation, August 2012. that's the source of truth, iykyk ๐
๐ SANDYBRIDGE XEON FIXED FUNCTION PMCS
these PMCs and their supported events are documented over in pmc.iaf(3). go read that one, she's got the lore ๐
๐ฅ SANDYBRIDGE XEON PROGRAMMABLE PMCS
the programmable PMCs support the following capabilities, and honestly the way some of these are a straight-up No... rude but okay:
PMC_CAP_CASCADEโ No ๐PMC_CAP_EDGEโ Yes โจPMC_CAP_INTERRUPTโ Yes ๐PMC_CAP_INVERTโ Yes ๐PMC_CAP_READโ Yes ๐PMC_CAP_PRECISEโ No ๐PMC_CAP_SYSTEMโ Yes ๐ฅ๏ธPMC_CAP_TAGGINGโ No ๐ท๏ธPMC_CAP_THRESHOLDโ Yes ๐PMC_CAP_USERโ Yes ๐PMC_CAP_WRITEโ Yes โ๏ธ
๐ Event Qualifiers
event specifiers for these PMCs support the following common qualifiers โ these are your little customisation knobs, love them:
rsp=value
configure the Off-core Response bits. and ooooh she has options:
REQ_DMND_DATA_RDโ counts the number of demand and DCU prefetch data reads of full and partial cachelines as well as demand data page table entry cacheline reads. does not count L2 data read prefetches or instruction fetches ๐REQ_DMND_RFOโ counts the number of demand and DCU prefetch reads for ownership (RFO) requests generated by a write to data cacheline. does not count L2 RFO prefetches.REQ_DMND_IFETCHโ counts the number of demand and DCU prefetch instruction cacheline reads. does not count L2 code read prefetches.REQ_WBโ counts the number of writeback (modified to exclusive) transactions.REQ_PF_DATA_RDโ counts the number of data cacheline reads generated by L2 prefetchers.REQ_PF_RFOโ counts the number of RFO requests generated by L2 prefetchers.REQ_PF_IFETCHโ counts the number of code reads generated by L2 prefetchers.REQ_PF_LLC_DATA_RDโ L2 prefetcher to L3 for loads.REQ_PF_LLC_RFOโ RFO requests generated by L2 prefetcher.REQ_PF_LLC_IFETCHโ L2 prefetcher to L3 for instruction fetches.REQ_BUS_LOCKSโ bus lock and split lock requests.REQ_STRM_STโ streaming store requests.REQ_OTHERโ any other request that crosses IDI, including I/O.RES_ANYโ catch all value for any response types.RES_SUPPLIER_NO_SUPPโ no Supplier Information available.RES_SUPPLIER_LLC_HITMโ M-state initial lookup stat in L3.RES_SUPPLIER_LLC_HITEโ E-state.RES_SUPPLIER_LLC_HITSโ S-state.RES_SUPPLIER_LLC_HITFโ F-state.RES_SUPPLIER_LOCALโ local DRAM Controller.RES_SNOOP_SNP_NONEโ no details on snoop-related information.RES_SNOOP_SNP_NO_NEEDEDโ no snoop was needed to satisfy the request.RES_SNOOP_SNP_MISSโ a snoop was needed and it missed all snooped caches: -For LLC Hit, ReslHitl was returned by all cores -For LLC Miss, Rspl was returned by all sockets and data was returned from DRAM.RES_SNOOP_HIT_NO_FWDโ a snoop was needed and it hits in at least one snooped cache. Hit denotes a cache-line was valid before snoop effect. This includes: -Snoop Hit w/ Invalidation (LLC Hit, RFO) -Snoop Hit, Left Shared (LLC Hit/Miss, IFetch/Data_RD) -Snoop Hit w/ Invalidation and No Forward (LLC Miss, RFO Hit S) In the LLC Miss case, data is returned from DRAM.RES_SNOOP_HIT_FWDโ a snoop was needed and data was forwarded from a remote socket. This includes: -Snoop Forward Clean, Left Shared (LLC Hit/Miss, IFetch/Data_RD/RFT).RES_SNOOP_HITMโ a snoop was needed and it HitM-ed in local or remote cache. HitM denotes a cache-line was in modified state before effect as a results of snoop. This includes: -Snoop HitM w/ WB (LLC miss, IFetch/Data_RD) -Snoop Forward Modified w/ Invalidation (LLC Hit/Miss, RFO) -Snoop MtoS (LLC Hit, IFetch/Data_RD).RES_NON_DRAMโ target was non-DRAM system address. This includes MMIO transactions.
cmask=value
configure the PMC to increment only if the number of configured events measured in a cycle is greater than or equal to value. it's giving "only count it when it's actually a lot" โจ
edge
configure the PMC to count the number of de-asserted to asserted transitions of the conditions expressed by the other qualifiers. if specified, the counter will increment only once whenever a condition becomes true, irrespective of the number of clocks during which the condition remains true. she doesn't double-count, she's classy ๐
inv
invert the sense of comparison when the cmask qualifier is present, making the counter increment when the number of events per cycle is less than the value specified by the cmask qualifier. plot twist ๐
os
configure the PMC to count events happening at processor privilege level 0. kernel queen behaviour ๐
usr
configure the PMC to count events occurring at privilege levels 1, 2 or 3. userland besties rise ๐
if neither of theosorusrqualifiers are specified, the default is to enable both. yes, both. she's generous like that ๐ซถ
๐ Event Specifiers (Programmable PMCs)
Sandy Bridge Xeon programmable PMCs support the following events. every single one, we're not skipping a single icon:
LD_BLOCKS.DATA_UNKNOWNโ (Event03H, Umask01H) blocked loads due to store buffer blocks with unknown data.LD_BLOCKS.STORE_FORWARDโ (Event03H, Umask02H) loads blocked by overlapping with store buffer that cannot be forwarded .LD_BLOCKS.NO_SRโ (Event03H, Umask08H) # of Split loads blocked due to resource not available.LD_BLOCKS.ALL_BLOCKโ (Event03H, Umask10H) Number of cases where any load is blocked but has no DCU miss.MISALIGN_MEM_REF.LOADSโ (Event05H, Umask01H) Speculative cache-line split load uops dispatched to L1D.MISALIGN_MEM_REF.STORESโ (Event05H, Umask02H) Speculative cache-line split Store-address uops dispatched to L1D.LD_BLOCKS_PARTIAL.ADDRESS_ALIASโ (Event07H, Umask01H) False dependencies in MOB due to partial compare on address.LD_BLOCKS_PARTIAL.ALL_STALL_BLOCKโ (Event07H, Umask08H) The number of times that load operations are temporarily blocked because of older stores, with addresses that are not yet known. A load operation may incur more than one block of this type.TLB_LOAD_MISSES.MISS_CAUSES_A_WALKโ (Event08H, Umask01H) Misses in all TLB levels that cause a page walk of any page size.TLB_LOAD_MISSES.WALK_COMPLETEDโ (Event08H, Umask02H) Misses in all TLB levels that caused page walk completed of any size.DTLB_LOAD_MISSES.WALK_DURATIONโ (Event08H, Umask04H) Cycle PMH is busy with a walk.DTLB_LOAD_MISSES.STLB_HITโ (Event08H, Umask10H) Number of cache load STLB hits. No page walk.INT_MISC.RECOVERY_CYCLESโ (Event0DH, Umask03H) Cycles waiting to recover after Machine Clears or EClear. Set Cmask= 1.INT_MISC.RAT_STALL_CYCLESโ (Event0DH, Umask40H) Cycles RAT external stall is sent to IDQ for this thread.UOPS_ISSUED.ANYโ (Event0EH, Umask01H) Increments each cycle the # of Uops issued by the RAT to RS. Set Cmask = 1, Inv = 1, Any= 1to count stalled cycles of this core.FP_COMP_OPS_EXE.X87โ (Event10H, Umask01H) Counts number of X87 uops executed.FP_COMP_OPS_EXE.SSE_FP_PACKED_DOUBLEโ (Event10H, Umask10H) Counts number of SSE* double precision FP packed uops executed.FP_COMP_OPS_EXE.SSE_FP_SCALAR_SINGLEโ (Event10H, Umask20H) Counts number of SSE* single precision FP scalar uops executed.FP_COMP_OPS_EXE.SSE_PACKED_SINGLEโ (Event10H, Umask40H) Counts number of SSE* single precision FP packed uops executed.FP_COMP_OPS_EXE.SSE_SCALAR_DOUBLEโ (Event10H, Umask80H) Counts number of SSE* double precision FP scalar uops executed.SIMD_FP_256.PACKED_SINGLEโ (Event11H, Umask01H) Counts 256-bit packed single-precision floating- point instructions.SIMD_FP_256.PACKED_DOUBLEโ (Event11H, Umask02H) Counts 256-bit packed double-precision floating- point instructions.ARITH.FPU_DIV_ACTIVEโ (Event14H, Umask01H) Cycles that the divider is active, includes INT and FP. Set 'edge =1, cmask=1' to count the number of divides.INSTS_WRITTEN_TO_IQ.INSTSโ (Event17H, Umask01H) Counts the number of instructions written into the IQ every cycle.L2_RQSTS.DEMAND_DATA_RD_HITโ (Event24H, Umask01H) Demand Data Read requests that hit L2 cache.L2_RQSTS.ALL_DEMAND_DATA_RDโ (Event24H, Umask03H) Counts any demand and L1 HW prefetch data load requests to L2.L2_RQSTS.RFO_HITSโ (Event24H, Umask04H) Counts the number of store RFO requests that hit the L2 cache.L2_RQSTS.RFO_MISSโ (Event24H, Umask08H) Counts the number of store RFO requests that miss the L2 cache.
that's part one bestie, there's more coming so don't go anywhere ๐ธ๐ฆ
okay so back to the event buffet ๐
grab a snack, this next stretch is long but honestly iconic โ every single one of these is a real counter with a real Event/Umask so you can summon it onto your PMU and vibe-check your core's whole life. Here we go, no skips, no cap:
L2_RQSTS.ALL_RFOโ (Event24H, Umask0CH) Counts all L2 store RFO requests. ๐๏ธL2_RQSTS.CODE_RD_HITโ (Event24H, Umask10H) Number of instruction fetches that hit the L2 cache. slay.L2_RQSTS.CODE_RD_MISSโ (Event24H, Umask20H) Number of instruction fetches that missed the L2 cache. ๐ญL2_RQSTS.ALL_CODE_RDโ (Event24H, Umask30H) Counts all L2 code requests.L2_RQSTS.PF_HITโ (Event24H, Umask40H) Requests from L2 Hardware prefetcher that hit L2. the prefetcher ate, fr.L2_RQSTS.PF_MISSโ (Event24H, Umask80H) Requests from L2 Hardware prefetcher that missed L2.L2_RQSTS.ALL_PFโ (Event24H, UmaskC0H) Any requests from L2 Hardware prefetchers.L2_STORE_LOCK_RQSTS.MISSโ (Event27H, Umask01H) ROs that miss cache lines.L2_STORE_LOCK_RQSTS.HIT_Eโ (Event27H, Umask04H) RFOs that hit cache lines in E state.L2_STORE_LOCK_RQSTS.HIT_Mโ (Event27H, Umask08H) RFOs that hit cache lines in M state.L2_STORE_LOCK_RQSTS.ALLโ (Event27H, Umask0FH) RFOs that access cache lines in any state.L2_L1D_WB_RQSTS.MISSโ (Event28H, Umask01H) Not rejected writebacks from L1D to L2 cache lines that missed L2.L2_L1D_WB_RQSTS.HIT_Sโ (Event28H, Umask02H) Not rejected writebacks from L1D to L2 cache lines in S state.L2_L1D_WB_RQSTS.HIT_Eโ (Event28H, Umask04H) Not rejected writebacks from L1D to L2 cache lines in E state.L2_L1D_WB_RQSTS.HIT_Mโ (Event28H, Umask08H) Not rejected writebacks from L1D to L2 cache lines in M state.L2_L1D_WB_RQSTS.ALLโ (Event28H, Umask0FH) Not rejected writebacks from L1D to L2 cache.LONGEST_LAT_CACHE.REFERENCEโ (Event2EH, Umask4FH) This event counts requests originating from the core that reference a cache line in the last level cache. LLC said hi ๐ซถLONGEST_LAT_CACHE.MISSโ (Event2EH, Umask41H) This event counts each cache miss condition for references to the last level cache. oof.CPU_CLK_UNHALTED.THREAD_Pโ (Event3CH, Umask00H) Counts the number of thread cycles while the thread is not in a halt state. The thread enters the halt state when it is running theHLTinstruction. The core frequency may change from time to time due to power or thermal throttling. โก (yes, it can shift under you โ thermal drama is real)CPU_CLK_THREAD_UNHALTED.REF_XCLKโ (Event3CH, Umask01H) Increments at the frequency of XCLK (100MHz) when not halted.L1D_PEND_MISS.PENDINGโ (Event48H, Umask01H) Increments the number of outstanding L1D misses every cycle. SetCmaks = 1andEdge =1to count occurrences. ๐ (that spelling is the doc's, not mine, iykyk)DTLB_STORE_MISSES.MISS_CAUSES_A_WALKโ (Event49H, Umask01H) Miss in all TLB levels causes an page walk of any page size (4K/2M/4M/1G). ๐ page walk eraDTLB_STORE_MISSES.WALK_COMPLETEDโ (Event49H, Umask02H) Miss in all TLB levels causes a page walk that completes of any page size (4K/2M/4M/1G).DTLB_STORE_MISSES.WALK_DURATIONโ (Event49H, Umask04H) Cycles PMH is busy with this walk.DTLB_STORE_MISSES.STLB_HITโ (Event49H, Umask10H) Store operations that miss the first TLB level but hit the second and do not cause page walks. bestie pulled through โจLOAD_HIT_PRE.SW_PFโ (Event4CH, Umask01H) Not SW-prefetch load dispatches that hit fill buffer allocated for S/W prefetch.LOAD_HIT_PER.HW_PFโ (Event4CH, Umask02H) Not SW-prefetch load dispatches that hit fill buffer allocated for H/W prefetch.HW_PRE_REQ.DL1_MISSโ (Event4EH, Umask02H) Hardware Prefetch requests that miss the L1D cache. A request is being counted each time it access the cache & miss it, including if a block is applicable or if hit the Fill Buffer for example. ๐L1D.REPLACEMENTโ (Event51H, Umask01H) Counts the number of lines brought into the L1 data cache.L1D.ALLOCATED_IN_Mโ (Event51H, Umask02H) Counts the number of allocations of modified L1D cache lines.L1D.EVICTIONโ (Event51H, Umask04H) Counts the number of modified lines evicted from the L1 data cache due to replacement. bye girl ๐L1D.ALL_M_REPLACEMENTโ (Event51H, Umask08H) Cache lines in M state evicted out of L1D due to Snoop HitM or dirty line replacement.PARTIAL_RAT_STALLS.FLAGS_MERGE_UOPโ (Event59H, Umask0CH) Increments the number of flags-merge uops in flight each cycle. SetCmask = 1to count cycles. ๐ฅPARTIAL_RAT_STALLS.SLOW_LEA_WINDOWโ (Event59H, Umask0FH) Cycles with at least one slow LEA uop allocated.PARTIAL_RAT_STALLS.MUL_SINGLE_UOPโ (Event59H, Umask40H) Number of Multiply packed/scalar single precision uops allocated. math era ๐RESOURCE_STALLS2.ALL_FL_EMPTYโ (Event5BH, Umask0CH) Cycles stalled due to free list empty.RESOURCE_STALLS2.ALL_PRF_CONTROLโ (Event5BH, Umask0FH) Cycles stalled due to control structures full for physical registers.RESOURCE_STALLS2.BOB_FULLโ (Event5BH, Umask40H) Cycles Allocator is stalled due Branch Order Buffer.RESOURCE_STALLS2.OOO_RSRCโ (Event5BH, Umask4FH) Cycles stalled due to out of order resources full.CPL_CYCLES.RING0โ (Event5CH, Umask01H) Unhalted core cycles when the thread is in ring 0. kernel main character energy ๐CPL_CYCLES.RING123โ (Event5CH, Umask02H) Unhalted core cycles when the thread is not in ring 0.RS_EVENTS.EMPTY_CYCLESโ (Event5EH, Umask01H) Cycles the RS is empty for the thread.OFFCORE_REQUESTS_OUTSTANDING.DEMAND_DATA_RDโ (Event60H, Umask01H) Offcore outstanding Demand Data Read transactions in SQ to uncore. SetCmask=1to count cycles.OFFCORE_REQUESTS_OUTSTANDING.DEMAND_RFOโ (Event60H, Umask04H) Offcore outstanding RFO store transactions in SQ to uncore. SetCmask=1to count cycles.OFFCORE_REQUESTS_OUTSTANDING.ALL_DATA_RDโ (Event60H, Umask08H) Offcore outstanding cacheable data read transactions in SQ to uncore. SetCmask=1to count cycles.LOCK_CYCLES.SPLIT_LOCK_UC_LOCK_DURATIONโ (Event63H, Umask01H) Cycles in which the L1D and L2 are locked, due to a UC lock or split lock. ๐ everybody frozen, not cuteLOCK_CYCLES.CACHE_LOCK_DURATIONโ (Event63H, Umask02H) Cycles in which the L1D is locked.IDQ.EMPTYโ (Event79H, Umask02H) Counts cycles the IDQ is empty.IDQ.MITE_UOPSโ (Event79H, Umask04H) Increment each cycle # of uops delivered to IDQ from MITE path. SetCmask = 1to count cycles.IDQ.DSB_UOPSโ (Event79H, Umask08H) Increment each cycle. # of uops delivered to IDQ from DSB path. SetCmask = 1to count cycles.IDQ.MS_DSB_UOPSโ (Event79H, Umask10H) Increment each cycle # of uops delivered to IDQ when MS busy by DSB. SetCmask = 1to count cycles MS is busy. SetCmask=1andEdge =1to count MS activations. ๐ฆIDQ.MS_MITE_UOPSโ (Event79H, Umask20H) Increment each cycle # of uops delivered to IDQ when MS is busy by MITE. SetCmask = 1to count cycles.IDQ.MS_UOPSโ (Event79H, Umask30H) Increment each cycle # of uops delivered to IDQ from MS by either DSB or MITE. SetCmask = 1to count cycles.ICACHE.MISSESโ (Event80H, Umask02H) Number of Instruction Cache, Streaming Buffer and Victim Cache Misses. Includes UC accesses.ITLB_MISSES.MISS_CAUSES_A_WALKโ (Event85H, Umask01H) Misses in all ITLB levels that cause page walks.ITLB_MISSES.WALK_COMPLETEDโ (Event85H, Umask02H) Misses in all ITLB levels that cause completed page walks.ITLB_MISSES.WALK_DURATIONโ (Event85H, Umask04H) Cycle PMH is busy with a walk.ITLB_MISSES.STLB_HITโ (Event85H, Umask10H) Number of cache load STLB hits. No page walk. ๐ILD_STALL.LCPโ (Event87H, Umask01H) Stalls caused by changing prefix length of the instruction.ILD_STALL.IQ_FULLโ (Event87H, Umask04H) Stall cycles due to IQ is full. packed house, no room ๐ญBR_INST_EXEC.NONTAKEN_CONDโ (Event88H, Umask41H) Count conditional near branch instructions that were executed (but not necessarily retired) and not taken.BR_INST_EXEC.TAKEN_CONDโ (Event88H, Umask81H) Count conditional near branch instructions that were executed (but not necessarily retired) and taken.BR_INST_EXEC.DIRECT_JMPโ (Event88H, Umask82H) Count all unconditional near branch instructions excluding calls and indirect branches.BR_INST_EXEC.INDIRECT_JMP_NON_CALL_RETโ (Event88H, Umask84H) Count executed indirect near branch instructions that are not calls nor returns.BR_INST_EXEC.RETURN_NEARโ (Event88H, Umask88H) Count indirect near branches that have a return mnemonic.BR_INST_EXEC.DIRECT_NEAR_CALLโ (Event88H, Umask90H) Count unconditional near call branch instructions, excluding non call branch, executed.BR_INST_EXEC.INDIRECT_NEAR_CALLโ (Event88H, UmaskA0H) Count indirect near calls, including both register and memory indirect, executed.BR_INST_EXEC.ALL_BRANCHESโ (Event88H, UmaskFFH) Counts all near executed branches (not necessarily retired).BR_MISP_EXEC.NONTAKEN_CONDโ (Event89H, Umask41H) Count conditional near branch instructions mispredicted as nontaken. wrong guess bestie ๐BR_MISP_EXEC.TAKEN_CONDโ (Event89H, Umask81H) Count conditional near branch instructions mispredicted as taken.BR_MISP_EXEC.INDIRECT_JMP_NON_CALL_RETโ (Event89H, Umask84H) Count mispredicted indirect near branch instructions that are not calls nor returns.BR_MISP_EXEC.RETURN_NEARโ (Event89H, Umask88H) Count mispredicted indirect near branches that have a return mnemonic.BR_MISP_EXEC.DIRECT_NEAR_CALLโ (Event89H, Umask90H) Count mispredicted unconditional near call branch instructions, excluding non call branch, executed.BR_MISP_EXEC.INDIRECT_NEAR_CALLโ (Event89H, UmaskA0H) Count mispredicted indirect near calls, including both register and memory indirect, executed.BR_MISP_EXEC.ALL_BRANCHESโ (Event89H, UmaskFFH) Counts all mispredicted near executed branches (not necessarily retired).
okay that's the branch-drama chunk done and honestly the predictor is going through it ๐ฎโ๐จ keep scrolling, we're not done yet โ
IDQ_UOPS_NOT_DELIVERED.COREโ (Event9CH, Umask01H) counts how many uops did not get delivered to the RAT, per thread. ๐ญUOPS_DISPATCHED_PORT.PORT_0โ (EventA1H, Umask01H) cycles when a uop is dispatched on port0. โจUOPS_DISPATCHED_PORT.PORT_1โ (EventA1H, Umask02H) cycles when a uop is dispatched on port1. ๐UOPS_DISPATCHED_PORT.PORT_2_LDโ (EventA1H, Umask04H) cycles when a load uop is dispatched on port2. ๐ซถUOPS_DISPATCHED_PORT.PORT_2_STAโ (EventA1H, Umask08H) cycles when a store address uop is dispatched on port2. ๐UOPS_DISPATCHED_PORT.PORT_2โ (EventA1H, Umask0CH) cycles when a uop is dispatched on port2. ๐UOPS_DISPATCHED_PORT.PORT_3_LDโ (EventA1H, Umask10H) cycles when a load uop is dispatched on port3. ๐ธUOPS_DISPATCHED_PORT.PORT_3_STAโ (EventA1H, Umask20H) cycles when a store address uop is dispatched on port3. ๐ฆUOPS_DISPATCHED_PORT.PORT_3โ (EventA1H, Umask30H) cycles when a uop is dispatched on port3. โญUOPS_DISPATCHED_PORT.PORT_4โ (EventA1H, Umask40H) cycles when a uop is dispatched on port4. ๐ฅUOPS_DISPATCHED_PORT.PORT_5โ (EventA1H, Umask80H) cycles when a uop is dispatched on port5. ๐RESOURCE_STALLS.ANYโ (EventA2H, Umask01H) cycles where allocation is stalled for a Resource Related reason. ๐RESOURCE_STALLS.LBโ (EventA2H, Umask01H) counts the cycles of stall because there arenโt enough load buffers. ๐ญRESOURCE_STALLS.RSโ (EventA2H, Umask04H) cycles stalled because no eligible RS entry is available. ๐RESOURCE_STALLS.SBโ (EventA2H, Umask08H) cycles stalled because no store buffers are available. (not including draining form sync). ๐RESOURCE_STALLS.ROBโ (EventA2H, Umask10H) cycles stalled because the re-order buffer is full. ๐RESOURCE_STALLS.FCSWโ (EventA2H, Umask20H) cycles stalled because the FPU control word is being written. ๐งRESOURCE_STALLS.MXCSRโ (EventA2H, Umask40H) cycles stalled because the MXCSR register rename is occurring to close to a previous MXCSR rename. ๐ตโ๐ซRESOURCE_STALLS.OTHERโ (EventA2H, Umask80H) cycles stalled while execution was stalled due to other resource issues. ๐CYCLE_ACTIVITY.CYCLES_L2_PENDINGโ (EventA3H, Umask01H) cycles with pending L2 miss loads. SetAnyThreadto count per core. ๐CYCLE_ACTIVITY.CYCLES_L1D_PENDINGโ (EventA3H, Umask02H) cycles with pending L1 cache miss loads. SetAnyThreadto count per core. ๐CYCLE_ACTIVITY.CYCLES_NO_DISPATCHโ (EventA3H, Umask04H) cycles of dispatch stalls. SetAnyThreadto count per core. ๐ซDSB2MITE_SWITCHES.COUNTโ (EventABH, Umask01H) number of DSB to MITE switches. ๐DSB2MITE_SWITCHES.PENALTY_CYCLESโ (EventABH, Umask02H) cycles that DSB to MITE switches caused delay. โณDSB_FILL.OTHER_CANCELโ (EventACH, Umask02H) cases of cancelling a valid DSB fill not because of exceeding the way limit. ๐ โโ๏ธDSB_FILL.EXCEED_DSB_LINESโ (EventACH, Umask08H) DSB Fill encountered> 3DSB lines. ๐ณDSB_FILL.ALL_CANCELโ (EventACH, Umask0AH) cases of cancelling a valid Decode Stream Buffer (DSB) fill not because of exceeding the way limit. ๐ITLB.ITLB_FLUSHโ (EventAEH, Umask01H) counts the number of ITLB flushes, includes4k/2M/4Mpages. ๐ธOFFCORE_REQUESTS.DEMAND_DATA_RDโ (EventB0H, Umask01H) demand data read requests sent to uncore. ๐OFFCORE_REQUESTS.DEMAND_RFOโ (EventB0H, Umask04H) demand RFO read requests sent to uncore, including regular RFOs, locks, ItoM. ๐OFFCORE_REQUESTS.ALL_DATA_RDโ (EventB0H, Umask08H) data read requests sent to uncore (demand and prefetch). ๐จUOPS_DISPATCHED.THREADโ (EventB1H, Umask01H) counts the total number of uops to be dispatched per-thread each cycle. SetCmask = 1,INV =1to count stall cycles. ๐งฎUOPS_DISPATCHED.COREโ (EventB1H, Umask02H) counts the total number of uops to be dispatched per-core each cycle. ๐OFFCORE_REQUESTS_BUFFER.SQ_FULLโ (EventB2H, Umask01H) the offcore requests buffer cannot take more entries for this thread core. ๐ตAGU_BYPASS_CANCEL.COUNTโ (EventB6H, Umask01H) counts executed load operations with all the following traits: 1. addressing of the format[base + offset], 2. the offset is between1and2047, 3. the address specified in the base register is in one page and the address[base+offset]is in another page. ๐งOFF_CORE_RESPONSE_0โ (EventB7H, Umask01H) (EventB7H, Umask01H) Off-core Response Performance Monitoring;PMC0only. Requires programming MSR01A6H. ๐ฏโโ๏ธOFF_CORE_RESPONSE_1โ (EventBBH, Umask01H) (EventBBH, Umask01H) Off-core Response Performance Monitoring;PMC3only. Requires programming MSR01A7H. ๐ฏโโ๏ธTLB_FLUSH.DTLB_THREADโ (EventBDH, Umask01H) DTLB flush attempts of the thread-specific entries. ๐งนTLB_FLUSH.STLB_ANYโ (EventBDH, Umask20H) count number of STLB flush attempts. ๐ช๏ธL1D_BLOCKS.BANK_CONFLICT_CYCLESโ (EventBFH, Umask05H) cycles when dispatched loads are cancelled due to L1D bank conflicts with other load ports. ๐ฅINST_RETIRED.ANY_Pโ (EventC0H, Umask00H) number of instructions at retirement. ๐INST_RETIRED.ALLโ (EventC0H, Umask01H) precise instruction retired event withHWto reduce effect of PEBS shadow in IP distribution. ๐ซถOTHER_ASSISTS.ITLB_MISS_RETIREDโ (EventC1H, Umask02H) instructions that experienced an ITLB miss. ๐ญOTHER_ASSISTS.AVX_STOREโ (EventC1H, Umask08H) number of assists associated with 256-bit AVX store operations. ๐ฆOTHER_ASSISTS.AVX_TO_SSEโ (EventC1H, Umask10H) number of transitions from AVX-256 to legacy SSE when penalty applicable. ๐OTHER_ASSISTS.SSE_TO_AVXโ (EventC1H, Umask20H) number of transitions from SSE to AVX-256 when penalty applicable. ๐UOPS_RETIRED.ALLโ (EventC2H, Umask01H) counts the number of micro-ops retired, Usecmask=1and invert to count active cycles or stalled cycles. ๐งฎUOPS_RETIRED.RETIRE_SLOTSโ (EventC2H, Umask02H) counts the number of retirement slots used each cycle. ๐ฐMACHINE_CLEARS.MEMORY_ORDERINGโ (EventC3H, Umask02H) counts the number of machine clears due to memory order conflicts. ๐MACHINE_CLEARS.SMCโ (EventC3H, Umask04H) counts the number of times that a program writes to a code section. โ๏ธMACHINE_CLEARS.MASKMOVโ (EventC3H, Umask20H) counts the number of executed AVX masked load operations that refer to an illegal address range with the mask bits set to0. ๐จBR_INST_RETIRED.ALL_BRANCHโ (EventC4H, Umask00H) branch instructions at retirement. ๐ฟBR_INST_RETIRED.CONDITIONALโ (EventC4H, Umask01H) counts the number of conditional branch instructions retired. ๐BR_INST_RETIRED.NEAR_CALLโ (EventC4H, Umask02H) direct and indirect near call instructions retired. ๐BR_INST_RETIRED.ALL_BRANCHESโ (EventC4H, Umask04H) counts the number of branch instructions retired. ๐BR_INST_RETIRED.NEAR_RETURNโ (EventC4H, Umask08H) counts the number of near return instructions retired. โฉ๏ธBR_INST_RETIRED.NOT_TAKENโ (EventC4H, Umask10H) counts the number of not taken branch instructions retired. ๐ โโ๏ธBR_INST_RETIRED.NEAR_TAKENโ (EventC4H, Umask20H) number of near taken branches retired. โBR_INST_RETIRED.FAR_BRANCHโ (EventC4H, Umask40H) number of far branches retired. ๐ซBR_MISP_RETIRED.ALL_BRANCHESโ (EventC5H, Umask00H) mispredicted branch instructions at retirement. ๐ตBR_MISP_RETIRED.CONDITIONALโ (EventC5H, Umask01H) mispredicted conditional branch instructions retired. ๐ขBR_MISP_RETIRED.NEAR_CALLโ (EventC5H, Umask02H) direct and indirect mispredicted near call instructions retired. ๐๐ฅBR_MISP_RETIRED.ALL_BRANCHESโ (EventC5H, Umask04H) mispredicted macro branch instructions retired. ๐ง ๐BR_MISP_RETIRED.NOT_TAKENโ (EventC5H, Umask10H) mispredicted not taken branch instructions retired. ๐BR_MISP_RETIRED.TAKENโ (EventC5H, Umask20H) mispredicted taken branch instructions retired. ๐โโ๏ธFP_ASSIST.X87_OUTPUTโ (EventCAH, Umask02H) number of X87 assists due to output value. ๐งฎFP_ASSIST.X87_INPUTโ (EventCAH, Umask04H) number of X87 assists due to input value. ๐ฅFP_ASSIST.SIMD_OUTPUTโ (EventCAH, Umask08H) number of SIMD FP assists due to output values. ๐คFP_ASSIST.SIMD_INPUTโ (EventCAH, Umask10H) number of SIMD FP assists due to input values. ๐ฅFP_ASSIST.ANY 1EHโ (EventCAH, Umask) cycles with any input/outputSSE*or FP assists. ๐ซถROB_MISC_EVENTS.LBR_INSERTSโ (EventCCH, Umask20H) counts cases of saving new LBR records by hardware. ๐พMEM_TRANS_RETIRED.LOAD_LATENCYโ (EventCDH, Umask01H) sample loads with specified latency threshold.PMC3only. โฑ๏ธMEM_TRANS_RETIRED.PRECISE_STOREโ (EventCDH, Umask02H) sample stores and collect precise store operation via PEBS record.PMC3only. ๐๏ธMEM_UOP_RETIRED.LOADSโ (EventD0H, Umask10H) qualify retired memory uops that are loads. Combine with umask10H,20H,40H,80H. ๐ฅMEM_UOP_RETIRED.STORESโ (EventD0H, Umask02H) qualify retired memory uops that are stores. Combine with umask10H,20H,40H,80H. ๐คMEM_UOP_RETIRED.STLB_MISSโ (EventD0H, Umask) qualify retired memory uops with STLB miss. Must combine with umask01H,02H, to produce counts. ๐ญMEM_UOP_RETIRED.LOCKโ (EventD0H, Umask) qualify retired memory uops with lock. Must combine with umask01H,02H, to produce counts. ๐MEM_UOP_RETIRED.SPLITโ (EventD0H, Umask) qualify retired memory uops with line split. Must combine with umask01H,02H, to produce counts. ๐ชMEM_UOP_RETIRED_ALLโ (EventD0H, Umask) qualify any retired memory uops. Must combine with umask01H,02H, to produce counts. ๐MEM_LOAD_UOPS_RETIRED.L1_HITโ (EventD1H, Umask01H) retired load uops where the data came from an L1 cache hit ๐MEM_LOAD_UOPS_RETIRED.L2_HITโ (EventD1H, Umask02H) retired load uops where the data came from an L2 cache hit โจMEM_LOAD_UOPS_RETIRED.LLC_HITโ (EventD1H, Umask04H) retired load uops whose data sources were data hits in LLC with no snoops required ๐MEM_LOAD_UOPS_RETIRED.LLC_MISSโ (EventD1H, Umask20H) retired load uops whose data sources were data that missed LLC (unknown data source not included, bestie) ๐ฆMEM_LOAD_UOPS_RETIRED.HIT_LFBโ (EventD1H, Umask40H) retired load uops whose data sources were load uops that missed L1 but hit the FB because of a preceding miss to the same cache line with data not ready yet ๐ธMEM_LOAD_UOPS_MISC_RETIRED.LLC_MISSโ (EventD4H, Umask02H) retired load uops with unknown information as the data source in the cache that serviced the load ๐
BACLEARS.ANYโ (EventE6H, Umask01H) counts how many times the front end gets re-steered ๐ mostly when the BPU can't provide a correct prediction and other branch handling mechanisms at the front end have to come in and fix it ๐
L2_TRANS.DEMAND_DATA_RDโ (EventF0H, Umask01H) demand Data Read requests that access the L2 cache ๐L2_TRANS.RFOโ (EventF0H, Umask02H) RFO requests that access the L2 cache ๐ฅL2_TRANS.CODE_RDโ (EventF0H, Umask04H) L2 cache accesses that happen when fetching instructions ๐L2_TRANS.ALL_PFโ (EventF0H, Umask08H) L2 or LLC HW prefetches that access the L2 cache ๐L2_TRANS.L1D_WBโ (EventF0H, Umask10H) L1D writebacks that access the L2 cache โญL2_TRANS.L2_FILLโ (EventF0H, Umask20H) L2 fill requests that access the L2 cache ๐L2_TRANS.L2_WBโ (EventF0H, Umask40H) L2 writebacks that access the L2 cache ๐งL2_TRANS.ALL_REQUESTSโ (EventF0H, Umask80H) transactions accessing the L2 pipe ๐
L2_LINES_IN.Iโ (EventF1H, Umask01H) L2 cache lines in I state that are filling L2 ๐L2_LINES_IN.Sโ (EventF1H, Umask02H) L2 cache lines in S state that are filling L2 โจL2_LINES_IN.Eโ (EventF1H, Umask04H) L2 cache lines in E state that are filling L2 ๐L2_LINES-IN.ALLโ (EventF1H, Umask07H) L2 cache lines filling L2 ๐ฆ (and yes, that hyphen is exactly how it's spelled here โ not a typo on my end, iykyk ๐)
L2_LINES_OUT.DEMAND_CLEANโ (EventF2H, Umask01H) clean L2 cache lines evicted by demand ๐ธL2_LINES_OUT.DEMAND_DIRTYโ (EventF2H, Umask02H) dirty L2 cache lines evicted by demand ๐L2_LINES_OUT.PF_CLEANโ (EventF2H, Umask04H) clean L2 cache lines evicted by L2 prefetch ๐L2_LINES_OUT.PF_DIRTYโ (EventF2H, Umask08H) dirty L2 cache lines evicted by L2 prefetch ๐ฅL2_LINES_OUT.DIRTY_ALLโ (EventF2H, Umask0AH) dirty L2 cache lines filling the L2 ๐
SQ_MISC.SPLIT_LOCKโ (EventF4H, Umask10H) split locks in the SQ ๐
๐ฏ SEE ALSO
pmc(3), pmc.amd(3), pmc.atom(3), pmc.core(3), pmc.corei7(3), pmc.corei7uc(3), pmc.haswelluc(3), pmc.iaf(3), pmc.ivybridge(3), pmc.ivybridgexeon(3), pmc.sandybridge(3), pmc.sandybridgeuc(3), pmc.soft(3), pmc.tsc(3), pmc.ucf(3), pmc.westmere(3), pmc.westmereuc(3), pmc_cpuinfo(3), pmclog(3), hwpmc(4)
like, the whole friend group is here fr fr ๐ซถ
๐ HISTORY
The pmc library first appeared in FreeBSD 6.0. a certified icon since day one, no cap ๐
๐ AUTHORS
The Performance Counters Library (libpmc, -lpmc) library was written by Joseph Koshy <jkoshy@FreeBSD.org>.
The support for the Sandy Bridge Xeon microarchitecture was written by Hiren Panchasara <hiren.panchasara@gmail.com>.
absolute legends, both of them ๐ซก
okay that's the whole page bestie, you made it to the end!! ๐ go forth and count those performance counters, you're literally the main character of this CPU now ๐ โจ
this edition came to you from Debian, dated October 18, 2012 โ vintage but still serving, periodt ๐
๐ฆ where this page comes from
- freebsd 15.1: base 15.1
- Copyright (c) 2012 Hiren Panchasara <hiren.panchasara@gmail.com>
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms