PMC.COREI7UC(3)
๐ธ pmc.corei7uc โ uncore measurement events for Intel Core i7 and Xeon 5500 family CPUs
okay so this is a page from the Performance Counters Library, aka libpmc โ you link against it with -lpmc and it's documented here as PMC.COREI7UC(3) in the Library Functions Manual. bestie, we are going deep into uncore today. ๐
โจ LIBRARY
libpmc โ the Performance Counters Library. Link with -lpmc and you're in. ๐ซถ
โจ SYNOPSIS
#include <pmc.h>
that's it. that's the whole synopsis. iconic behavior honestly. ๐
โจ DESCRIPTION
so. Intel Core i7 CPUs contain PMCs conforming to version 2 of the Intel performance measurement architecture. and these CPUs have 2 classes of PMCs:
PMC_CLASS_UCFโ fixed-function counters, and the way these work is they count only one hardware event per counter. one counter, one job. focused. ๐PMC_CLASS_UCPโ programmable counters, which you can point at one event out of a defined set of hardware events. pick your fighter. โจ
โ ๏ธ real talk: the number of PMCs available in each class and their widths need to be determined at run time by calling pmc_cpuinfo(3). you cannot just assume, bestie. do the vibe check first.
Intel Core i7 and Xeon 5500 PMCs are documented in โVolume 3B: System Programming Guide, Part 2โ, Intel(R) 64 and IA-32 Architectures Software Developes Manual, Order Number: 253669-033US, Intel Corporation, December 2009. yes that's the exact citation, go read it, it's giving ancient scrolls ๐
๐ฆ COREI7 AND XEON 5500 UNCORE FIXED FUNCTION PMCS
These PMCs and their supported events are documented in pmc.ucf(3). short and sweet, love that for us.
๐ฆ COREI7 AND XEON 5500 UNCORE PROGRAMMABLE PMCS
The programmable PMCs support the following capabilities โ this is the yes/no list, no cap:
PMC_CAP_CASCADEโ NoPMC_CAP_EDGEโ YesPMC_CAP_INTERRUPTโ NoPMC_CAP_INVERTโ YesPMC_CAP_READโ YesPMC_CAP_PRECISEโ NoPMC_CAP_SYSTEMโ NoPMC_CAP_TAGGINGโ NoPMC_CAP_THRESHOLDโ YesPMC_CAP_USERโ NoPMC_CAP_WRITEโ Yes
๐ฆ Event Qualifiers
Event specifiers for these PMCs support the following common qualifiers, and these are the little add-ons that change how the counting goes down. so good. ๐ฅ
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.edgeโ configure the PMC to count the number of de-asserted โ asserted transitions of the conditions expressed by the other qualifiers. if you specify this, the counter will increment only once whenever a condition becomes true, no matter how many clocks the condition stays true for. it's like "noted, moving on" ๐invโ invert the sense of comparison when thecmaskqualifier is present, making the counter increment when the number of events per cycle is less than the value specified by thecmaskqualifier. flip it and reverse it. ๐
๐ฆ Event Specifiers (Programmable PMCs)
Core i7 and Xeon 5500 uncore programmable PMCs support the following events. buckle up buttercup, this list is long and every single one is here ๐
GQ_CYCLES_FULL.READ_TRACKERโ (Event 00H, Umask 01H) Uncore cycles Global Queue read tracker is full.GQ_CYCLES_FULL.WRITE_TRACKERโ (Event 00H, Umask 02H) Uncore cycles Global Queue write tracker is full.GQ_CYCLES_FULL.PEER_PROBE_TRACKERโ (Event 00H, Umask 04H) Uncore cycles Global Queue peer probe tracker is full. the peer probe tracker queue tracks snoops from the IOH and remote sockets. ๐GQ_CYCLES_NOT_EMPTY.READ_TRACKERโ (Event 01H, Umask 01H) Uncore cycles were Global Queue read tracker has at least one valid entry.GQ_CYCLES_NOT_EMPTY.WRITE_TRACKERโ (Event 01H, Umask 02H) Uncore cycles were Global Queue write tracker has at least one valid entry.GQ_CYCLES_NOT_EMPTY.PEER_PROBE_TRACKERโ (Event 01H, Umask 04H) Uncore cycles were Global Queue peer probe tracker has at least one valid entry. the peer probe tracker queue tracks IOH and remote socket snoops.GQ_ALLOC.READ_TRACKERโ (Event 03H, Umask 01H) Counts the number of tread tracker allocate to deallocate entries. the GQ read tracker allocate-to-deallocate occupancy count is divided by the count to obtain the average read tracker latency. math girlies rise ๐GQ_ALLOC.RT_L3_MISSโ (Event 03H, Umask 02H) Counts the number GQ read tracker entries for which a full cache line read has missed the L3. the GQ read tracker L3 miss-to-fill occupancy count is divided by this count to obtain the average cache line read L3 miss latency. the latency represents the time after which the L3 has determined that the cache line has missed. the time between a GQ read tracker allocation and the L3 determining that the cache line has missed is the average L3 hit latency. the total L3 cache line read miss latency is the hit latency + L3 miss latency. โจ (yes, there's a+in there, that's canon)GQ_ALLOC.RT_TO_L3_RESPโ (Event 03H, Umask 04H) Counts the number of GQ read tracker entries that are allocated in the read tracker queue that hit or miss the L3. the GQ read tracker L3 hit occupancy count is divided by this count to obtain the average L3 hit latency.GQ_ALLOC.RT_TO_RTID_ACQUIREDโ (Event 03H, Umask 08H) Counts the number of GQ read tracker entries that are allocated in the read tracker, have missed in the L3 and have not acquired a Request Transaction ID. the GQ read tracker L3 miss-to-RTID-acquired occupancy count is divided by this count to obtain the average latency for a read L3 miss to acquire an RTID.GQ_ALLOC.WT_TO_RTID_ACQUIREDโ (Event 03H, Umask 10H) Counts the number of GQ write tracker entries that are allocated in the write tracker, have missed in the L3 and have not acquired a Request Transaction ID. the GQ write tracker L3 miss-to-RTID occupancy count is divided by this count to obtain the average latency for a write L3 miss to acquire an RTID.GQ_ALLOC.WRITE_TRACKERโ (Event 03H, Umask 20H) Counts the number of GQ write tracker entries that are allocated in the write tracker queue that miss the L3. the GQ write tracker occupancy count is divided by the this count to obtain the average L3 write miss latency.GQ_ALLOC.PEER_PROBE_TRACKERโ (Event 03H, Umask 40H) Counts the number of GQ peer probe tracker (snoop) entries that are allocated in the peer probe tracker queue that miss the L3. the GQ peer probe occupancy count is divided by this count to obtain the average L3 peer probe miss latency.GQ_DATA.FROM_QPIโ (Event 04H, Umask 01H) Cycles Global Queue Quickpath Interface input data port is busy importing data from the Quickpath Interface. each cycle the input port can transfer 8 or 16 bytes of data. ๐GQ_DATA.FROM_QMCโ (Event 04H, Umask 02H) Cycles Global Queue Quickpath Memory Interface input data port is busy importing data from the Quickpath Memory Interface. each cycle the input port can transfer 8 or 16 bytes of data.GQ_DATA.FROM_L3โ (Event 04H, Umask 04H) Cycles GQ L3 input data port is busy importing data from the Last Level Cache. each cycle the input port can transfer 32 bytes of data.GQ_DATA.FROM_CORES_02โ (Event 04H, Umask 08H) Cycles GQ Core 0 and 2 input data port is busy importing data from processor cores 0 and 2. each cycle the input port can transfer 32 bytes of data.GQ_DATA.FROM_CORES_13โ (Event 04H, Umask 10H) Cycles GQ Core 1 and 3 input data port is busy importing data from processor cores 1 and 3. each cycle the input port can transfer 32 bytes of data.GQ_DATA.TO_QPI_QMCโ (Event 05H, Umask 01H) Cycles GQ QPI and QMC output data port is busy sending data to the Quickpath Interface or Quickpath Memory Interface. each cycle the output port can transfer 32 bytes of data.GQ_DATA.TO_L3โ (Event 05H, Umask 02H) Cycles GQ L3 output data port is busy sending data to the Last Level Cache. each cycle the output port can transfer 32 bytes of data.GQ_DATA.TO_CORESโ (Event 05H, Umask 04H) Cycles GQ Core output data port is busy sending data to the Cores. each cycle the output port can transfer 32 bytes of data.SNP_RESP_TO_LOCAL_HOME.I_STATEโ (Event 06H, Umask 01H) Number of snoop responses to the local home that L3 does not have the referenced cache line.SNP_RESP_TO_LOCAL_HOME.S_STATEโ (Event 06H, Umask 02H) Number of snoop responses to the local home that L3 has the referenced line cached in the S state.SNP_RESP_TO_LOCAL_HOME.FWD_S_STATEโ (Event 06H, Umask 04H) Number of responses to code or data read snoops to the local home that the L3 has the referenced cache line in the E state. the L3 cache line state is changed to the S state and the line is forwarded to the local home in the S state. ๐SNP_RESP_TO_LOCAL_HOME.FWD_I_STATEโ (Event 06H, Umask 08H) Number of responses to read invalidate snoops to the local home that the L3 has the referenced cache line in the M state. the L3 cache line state is invalidated and the line is forwarded to the local home in the M state. ๐SNP_RESP_TO_LOCAL_HOME.CONFLICTโ (Event 06H, Umask 10H) Number of conflict snoop responses sent to the local home.SNP_RESP_TO_LOCAL_HOME.WBโ (Event 06H, Umask 20H) Number of responses to code or data read snoops to the local home that the L3 has the referenced line cached in the M state.SNP_RESP_TO_REMOTE_HOME.I_STATEโ (Event 07H, Umask 01H) Number of snoop responses to a remote home that L3 does not have the referenced cache line.SNP_RESP_TO_REMOTE_HOME.S_STATEโ (Event 07H, Umask 02H) Number of snoop responses to a remote home that L3 has the referenced line cached in the S state.SNP_RESP_TO_REMOTE_HOME.FWD_S_STATEโ (Event 07H, Umask 04H) Number of responses to code or data read snoops to a remote home that the L3 has the referenced cache line in the E state. the L3 cache line state is changed to the S state and the line is forwarded to the remote home in the S state.SNP_RESP_TO_REMOTE_HOME.FWD_I_STATEโ (Event 07H, Umask 08H) Number of responses to read invalidate snoops to a remote home that the L3 has the referenced cache line in the M state. the L3 cache line state is invalidated and the line is forwarded to the remote home in the M state.SNP_RESP_TO_REMOTE_HOME.CONFLICTโ (Event 07H, Umask 10H) Number of conflict snoop responses sent to the local home.SNP_RESP_TO_REMOTE_HOME.WBโ (Event 07H, Umask 20H) Number of responses to code or data read snoops to a remote home that the L3 has the referenced line cached in the M state.SNP_RESP_TO_REMOTE_HOME.HITMโ (Event07H, Umask24H) the number of HITM snoop responses that got sent to a remote home ๐ซถL3_HITS.READโ (Event08H, Umask01H) how many code read, data read, and RFO requests hit in the L3 ๐ฅL3_HITS.WRITEโ (Event08H, Umask02H) how many writeback requests hit in the L3 โ and ngl, writebacks from the cores always result in L3 hits, because the L3 is inclusive bestie, that's just how she is ๐L3_HITS.PROBEโ (Event08H, Umask04H) how many snoops from IOH or remote sockets hit in the L3 ๐ธL3_HITS.ANYโ (Event08H, Umask03H) reads and writes that hit the L3, all together, one big happy number โจL3_MISS.READโ (Event09H, Umask01H) how many code read, data read, and RFO requests missed the L3 ๐ญL3_MISS.WRITEโ (Event09H, Umask02H) how many writeback requests missed the L3 โ which should always be zero, fr fr, because writebacks from the cores always result in L3 hits (inclusive property of the L3, remember? ๐)L3_MISS.PROBEโ (Event09H, Umask04H) how many snoops from IOH or remote sockets missed the L3 ๐L3_MISS.ANYโ (Event09H, Umask03H) reads and writes that missed the L3 ๐
L3_LINES_IN.M_STATEโ (Event0AH, Umask01H) counts the L3 lines allocated in M state โ and the only time a line gets allocated in M state is when it was forwarded in M state due to a Snoop Read Invalidate Own request, so yeah, it's giving very specific โจL3_LINES_IN.E_STATEโ (Event0AH, Umask02H) counts the L3 lines allocated in E state ๐L3_LINES_IN.S_STATEโ (Event0AH, Umask04H) counts the L3 lines allocated in S state ๐ฆL3_LINES_IN.F_STATEโ (Event0AH, Umask08H) counts the L3 lines allocated in F state ๐L3_LINES_IN.ANYโ (Event0AH, Umask0FH) counts the L3 lines allocated in any state โ the catch-all queen ๐L3_LINES_OUT.M_STATEโ (Event0BH, Umask01H) counts the L3 lines that got victimized while in M state โ and when a victim line is in M state, it gets written to its home cache agent, which can be local or remote, iykyk ๐L3_LINES_OUT.E_STATEโ (Event0BH, Umask02H) counts the L3 lines victimized while in E state ๐L3_LINES_OUT.S_STATEโ (Event0BH, Umask04H) counts the L3 lines victimized while in S state ๐ธL3_LINES_OUT.I_STATEโ (Event0BH, Umask08H) counts the L3 lines victimized while in I state ๐ซL3_LINES_OUT.F_STATEโ (Event0BH, Umask10H) counts the L3 lines victimized while in F state ๐งL3_LINES_OUT.ANYโ (Event0BH, Umask1FH) counts the L3 lines victimized in any state, periodt ๐
QHL_REQUESTS.IOH_READSโ (Event20H, Umask01H) counts the Quickpath Home Logic read requests coming from the IOH ๐ฅQHL_REQUESTS.IOH_WRITESโ (Event20H, Umask02H) counts the Quickpath Home Logic write requests coming from the IOH โจQHL_REQUESTS.REMOTE_READSโ (Event20H, Umask04H) counts the Quickpath Home Logic read requests coming from a remote socket ๐ธQHL_REQUESTS.REMOTE_WRITESโ (Event20H, Umask08H) counts the Quickpath Home Logic write requests coming from a remote socket ๐ฆQHL_REQUESTS.LOCAL_READSโ (Event20H, Umask10H) counts the Quickpath Home Logic read requests coming from the local socket ๐QHL_REQUESTS.LOCAL_WRITESโ (Event20H, Umask20H) counts the Quickpath Home Logic write requests coming from the local socket ๐QHL_CYCLES_FULL.IOHโ (Event21H, Umask01H) counts uclk cycles where all the entries in the Quickpath Home Logic IOH are full ๐ญQHL_CYCLES_FULL.REMOTEโ (Event21H, Umask02H) counts uclk cycles where all the entries in the Quickpath Home Logic remote tracker are full ๐QHL_CYCLES_FULL.LOCALโ (Event21H, Umask04H) counts uclk cycles where all the entries in the Quickpath Home Logic local tracker are full ๐QHL_CYCLES_NOT_EMPTY.IOHโ (Event22H, Umask01H) counts uclk cycles where all the entries in the Quickpath Home Logic IOH are busy ๐ซถQHL_CYCLES_NOT_EMPTY.REMOTEโ (Event22H, Umask02H) counts uclk cycles where all the entries in the Quickpath Home Logic remote tracker are busy ๐QHL_CYCLES_NOT_EMPTY.LOCALโ (Event22H, Umask04H) counts uclk cycles where all the entries in the Quickpath Home Logic local tracker are busy โญQHL_OCCUPANCY.IOHโ (Event23H, Umask01H) QHL IOH tracker allocate-to-deallocate read occupancy ๐QHL_OCCUPANCY.REMOTEโ (Event23H, Umask02H) QHL remote tracker allocate-to-deallocate read occupancy ๐งQHL_OCCUPANCY.LOCALโ (Event23H, Umask04H) QHL local tracker allocate-to-deallocate read occupancy ๐QHL_ADDRESS_CONFLICTS.2WAYโ (Event24H, Umask02H) counts the QHL Active Address Table (AAT) entries that saw a max of 2 conflicts โ so the AAT is this structure that tracks requests that are in conflict, and the requests themselves live in the home tracker entries, and the count gets reported when an AAT entry deallocates, got it? ๐QHL_ADDRESS_CONFLICTS.3WAYโ (Event24H, Umask04H) counts the QHL Active Address Table (AAT) entries that saw a max of 3 conflicts โ same deal, AAT tracks the conflicting requests, the requests are in the home tracker entries, count reported on dealloc โจQHL_CONFLICT_CYCLES.IOHโ (Event25H, Umask01H) counts cycles where the Quickpath Home Logic IOH Tracker is holding two or more requests with an address conflict โ a max of 3 requests can be in conflict, fyi ๐ฅQHL_CONFLICT_CYCLES.REMOTEโ (Event25H, Umask02H) counts cycles where the Quickpath Home Logic Remote Tracker has two or more requests with an address conflict โ again, max 3 in conflict ๐ธQHL_CONFLICT_CYCLES.LOCALโ (Event25H, Umask04H) counts cycles where the Quickpath Home Logic Local Tracker has two or more requests with an address conflict โ max 3, you know the vibe ๐ฆQHL_TO_QMC_BYPASSโ (Event26H, Umask01H) counts the requests to the Quickpath Memory Controller that bypass the Quickpath Home Logic โ all local accesses can be bypassed, but for remote requests, only read requests can be bypassed, no cap ๐ค
QMC_NORMAL_FULL.READ.CH0โ (Event27H, Umask01H) uncore cycles where all the entries in the DRAM channel 0 medium or low priority queue are occupied with read requests ๐QMC_NORMAL_FULL.READ.CH1โ (Event27H, Umask02H) uncore cycles where all the entries in the DRAM channel 1 medium or low priority queue are occupied with read requests ๐QMC_NORMAL_FULL.READ.CH2โ (Event27H, Umask04H) uncore cycles where all the entries in the DRAM channel 2 medium or low priority queue are occupied with read requests ๐QMC_NORMAL_FULL.WRITE.CH0โ (Event27H, Umask08H) uncore cycles where all the entries in the DRAM channel 0 medium or low priority queue are occupied with write requests ๐QMC_NORMAL_FULL.WRITE.CH1โ (Event27H, Umask10H) counts cycles where all the entries in the DRAM channel 1 medium or low priority queue are occupied with write requests ๐งQMC_NORMAL_FULL.WRITE.CH2โ (Event27H, Umask20H) uncore cycles where all the entries in the DRAM channel 2 medium or low priority queue are occupied with write requests โญQMC_ISOC_FULL.READ.CH0โ (Event28H, Umask01H) counts cycles where all the entries in the DRAM channel 0 high priority queue are occupied with isochronous read requests ๐QMC_ISOC_FULL.READ.CH1โ (Event28H, Umask02H) counts cycles where all the entries in the DRAM channel 1 high priority queue are occupied with isochronous read requests ๐ซQMC_ISOC_FULL.READ.CH2โ (Event28H, Umask04H) counts cycles where all the entries in the DRAM channel 2 high priority queue are occupied with isochronous read requests ๐ญQMC_ISOC_FULL.WRITE.CH0โ (Event28H, Umask08H) counts cycles where all the entries in the DRAM channel 0 high priority queue are occupied with isochronous write requests ๐ฅQMC_ISOC_FULL.WRITE.CH1โ (Event28H, Umask10H) counts cycles where all the entries in the DRAM channel 1 high priority queue are occupied with isochronous write requests ๐ธQMC_ISOC_FULL.WRITE.CH2โ (Event28H, Umask20H) counts cycles where all the entries in the DRAM channel 2 high priority queue are occupied with isochronous write requests ๐ฆQMC_BUSY.READ.CH0โ (Event29H, Umask01H) counts cycles where the Quickpath Memory Controller has at least 1 outstanding read request to DRAM channel 0 ๐QMC_BUSY.READ.CH1โ (Event29H, Umask02H) counts cycles where the Quickpath Memory Controller has at least 1 outstanding read request to DRAM channel 1 ๐QMC_BUSY.READ.CH2โ (Event29H, Umask04H) counts cycles where the Quickpath Memory Controller has at least 1 outstanding read request to DRAM channel 2 ๐QMC_BUSY.WRITE.CH0โ (Event29H, Umask08H) counts cycles where the Quickpath Memory Controller has at least 1 outstanding write request to DRAM channel 0 ๐QMC_BUSY.WRITE.CH1โ (Event29H, Umask10H) counts cycles where the Quickpath Memory Controller has at least 1 outstanding write request to DRAM channel 1 ๐งQMC_BUSY.WRITE.CH2โ (Event29H, Umask20H) counts cycles where the Quickpath Memory Controller has at least 1 outstanding write request to DRAM channel 2 โญQMC_OCCUPANCY.CH0โ (Event2AH, Umask01H) IMC channel 0 normal read request occupancy ๐QMC_OCCUPANCY.CH1โ (Event2AH, Umask02H) IMC channel 1 normal read request occupancy ๐ซQMC_OCCUPANCY.CH2โ (Event2AH, Umask04H) IMC channel 2 normal read request occupancy ๐ญQMC_ISSOC_OCCUPANCY.CH0โ (Event2BH, Umask01H) IMC channel 0 issoc read request occupancy ๐ฅQMC_ISSOC_OCCUPANCY.CH1โ (Event2BH, Umask02H) IMC channel 1 issoc read request occupancy ๐ธQMC_ISSOC_OCCUPANCY.CH2โ (Event2BH, Umask04H) the IMC channel 2 issoc read request occupancy โจQMC_ISSOC_READS.ANYโ (Event2BH, Umask07H) the IMC issoc read request occupancy, like, across the board ๐ซQMC_NORMAL_READS.CH0โ (Event2CH, Umask01H) counts the number of Quickpath Memory Controller channel 0 medium and low priority read requests. bestie, here's the tea: the QMC channel 0 normal read occupancy divided by this count gives you the average QMC channel 0 read latency ๐QMC_NORMAL_READS.CH1โ (Event2CH, Umask02H) counts the number of Quickpath Memory Controller channel 1 medium and low priority read requests. and the QMC channel 1 normal read occupancy divided by this count hands you the average QMC channel 1 read latency ๐QMC_NORMAL_READS.CH2โ (Event2CH, Umask04H) counts the number of Quickpath Memory Controller channel 2 medium and low priority read requests. QMC channel 2 normal read occupancy รท this count = average QMC channel 2 read latency, no cap ๐ธQMC_NORMAL_READS.ANYโ (Event2CH, Umask07H) counts the number of Quickpath Memory Controller medium and low priority read requests. divide the QMC normal read occupancy by this count and boom, you've got the average QMC read latency โญQMC_HIGH_PRIORITY_READS.CH0โ (Event2DH, Umask01H) counts the number of Quickpath Memory Controller channel 0 high priority isochronous read requests ๐ฅQMC_HIGH_PRIORITY_READS.CH1โ (Event2DH, Umask02H) counts the number of Quickpath Memory Controller channel 1 high priority isochronous read requests ๐ฅQMC_HIGH_PRIORITY_READS.CH2โ (Event2DH, Umask04H) counts the number of Quickpath Memory Controller channel 2 high priority isochronous read requests ๐ฅQMC_HIGH_PRIORITY_READS.ANYโ (Event2DH, Umask07H) counts the number of Quickpath Memory Controller high priority isochronous read requests ๐ฅQMC_CRITICAL_PRIORITY_READS.CH0โ (Event2EH, Umask01H) counts the number of Quickpath Memory Controller channel 0 critical priority isochronous read requests ๐QMC_CRITICAL_PRIORITY_READS.CH1โ (Event2EH, Umask02H) counts the number of Quickpath Memory Controller channel 1 critical priority isochronous read requests ๐QMC_CRITICAL_PRIORITY_READS.CH2โ (Event2EH, Umask04H) counts the number of Quickpath Memory Controller channel 2 critical priority isochronous read requests ๐QMC_CRITICAL_PRIORITY_READS.ANYโ (Event2EH, Umask07H) counts the number of Quickpath Memory Controller critical priority isochronous read requests ๐
QMC_WRITES.FULL.CH0โ (Event2FH, Umask01H) counts number of full cache line writes to DRAM channel 0 ๐ฆQMC_WRITES.FULL.CH1โ (Event2FH, Umask02H) counts number of full cache line writes to DRAM channel 1 ๐ฆQMC_WRITES.FULL.CH2โ (Event2FH, Umask04H) counts number of full cache line writes to DRAM channel 2 ๐ฆQMC_WRITES.FULL.ANYโ (Event2FH, Umask07H) counts number of full cache line writes to DRAM ๐ฆQMC_WRITES.PARTIAL.CH0โ (Event2FH, Umask08H) counts number of partial cache line writes to DRAM channel 0 ๐QMC_WRITES.PARTIAL.CH1โ (Event2FH, Umask10H) counts number of partial cache line writes to DRAM channel 1 ๐QMC_WRITES.PARTIAL.CH2โ (Event2FH, Umask20H) counts number of partial cache line writes to DRAM channel 2 ๐QMC_WRITES.PARTIAL.ANYโ (Event2FH, Umask38H) counts number of partial cache line writes to DRAM ๐
QMC_CANCEL.CH0โ (Event30H, Umask01H) counts number of DRAM channel 0 cancel requests ๐QMC_CANCEL.CH1โ (Event30H, Umask02H) counts number of DRAM channel 1 cancel requests ๐QMC_CANCEL.CH2โ (Event30H, Umask04H) counts number of DRAM channel 2 cancel requests ๐QMC_CANCEL.ANYโ (Event30H, Umask07H) counts number of DRAM cancel requests ๐
QMC_PRIORITY_UPDATES.CH0โ (Event31H, Umask01H) counts number of DRAM channel 0 priority updates. so like, a priority update happens when an ISOC high or critical request gets received by the QHL and there's a matching request with normal priority that has already been issued to the QMC. in that instance, the QHL will send a priority update to QMC to expedite the request ๐งQMC_PRIORITY_UPDATES.CH1โ (Event31H, Umask02H) counts number of DRAM channel 1 priority updates. a priority update occurs when an ISOC high or critical request is received by the QHL and there is a matching request with normal priority that has already been issued to the QMC. in this instance, the QHL will send a priority update to QMC to expedite the request ๐งQMC_PRIORITY_UPDATES.CH2โ (Event31H, Umask04H) counts number of DRAM channel 2 priority updates. a priority update occurs when an ISOC high or critical request is received by the QHL and there's a matching request with normal priority that has already been issued to the QMC โ in this instance, the QHL will send a priority update to QMC to expedite the request ๐งQMC_PRIORITY_UPDATES.ANYโ (Event31H, Umask07H) counts number of DRAM priority updates. a priority update occurs when an ISOC high or critical request is received by the QHL and there is a matching request with normal priority that has already been issued to the QMC. in this instance, the QHL will send a priority update to QMC to expedite the request ๐ง
QHL_FRC_ACK_CNFLTS.LOCALโ (Event33H, Umask04H) counts number of Force Acknowledge Conflict messages sent by the Quickpath Home Logic to the local home ๐
QPI_TX_STALLED_SINGLE_FLIT.HOME.LINK_0โ (Event40H, Umask01H) counts cycles the Quickpath outbound link 0 HOME virtual channel is stalled due to lack of a VNA and VN0 credit. lowkey important note: this event does not filter out when a flit would not have been selected for arbitration because another virtual channel is getting arbitrated ๐QPI_TX_STALLED_SINGLE_FLIT.SNOOP.LINK_0โ (Event40H, Umask02H) counts cycles the Quickpath outbound link 0 SNOOP virtual channel is stalled due to lack of a VNA and VN0 credit. note that this event does not filter out when a flit would not have been selected for arbitration because another virtual channel is getting arbitrated ๐QPI_TX_STALLED_SINGLE_FLIT.NDR.LINK_0โ (Event40H, Umask04H) counts cycles the Quickpath outbound link 0 non-data response virtual channel is stalled due to lack of a VNA and VN0 credit. note that this event does not filter out when a flit would not have been selected for arbitration because another virtual channel is getting arbitrated ๐QPI_TX_STALLED_SINGLE_FLIT.HOME.LINK_1โ (Event40H, Umask08H) counts cycles the Quickpath outbound link 1 HOME virtual channel is stalled due to lack of a VNA and VN0 credit. note that this event does not filter out when a flit would not have been selected for arbitration because another virtual channel is getting arbitrated ๐ธQPI_TX_STALLED_SINGLE_FLIT.SNOOP.LINK_1โ (Event40H, Umask10H) counts cycles the Quickpath outbound link 1 SNOOP virtual channel is stalled due to lack of a VNA and VN0 credit. note that this event does not filter out when a flit would not have been selected for arbitration because another virtual channel is getting arbitrated ๐ธQPI_TX_STALLED_SINGLE_FLIT.NDR.LINK_1โ (Event40H, Umask20H) counts cycles the Quickpath outbound link 1 non-data response virtual channel is stalled due to lack of a VNA and VN0 credit. note that this event does not filter out when a flit would not have been selected for arbitration because another virtual channel is getting arbitrated ๐ธQPI_TX_STALLED_SINGLE_FLIT.LINK_0โ (Event40H, Umask07H) counts cycles the Quickpath outbound link 0 virtual channels are stalled due to lack of a VNA and VN0 credit. note that this event does not filter out when a flit would not have been selected for arbitration because another virtual channel is getting arbitrated ๐QPI_TX_STALLED_SINGLE_FLIT.LINK_1โ (Event40H, Umask38H) counts cycles the Quickpath outbound link 1 virtual channels are stalled due to lack of a VNA and VN0 credit. note that this event does not filter out when a flit would not have been selected for arbitration because another virtual channel is getting arbitrated ๐
QPI_TX_STALLED_MULTI_FLIT.DRS.LINK_0โ (Event41H, Umask01H) counts cycles the Quickpath outbound link 0 Data ResponSe virtual channel is stalled due to lack of VNA and VN0 credits. note that this event does not filter out when a flit would not have been selected for arbitration because another virtual channel is getting arbitrated ๐ฅQPI_TX_STALLED_MULTI_FLIT.NCB.LINK_0โ (Event41H, Umask02H) counts cycles the Quickpath outbound link 0 Non-Coherent Bypass virtual channel is stalled due to lack of VNA and VN0 credits. note that this event does not filter out when a flit would not have been selected for arbitration because another virtual channel is getting arbitrated ๐ฅQPI_TX_STALLED_MULTI_FLIT.NCS.LINK_0โ (Event41H, Umask04H) counts cycles the Quickpath outbound link 0 Non-Coherent Standard virtual channel is stalled due to lack of VNA and VN0 credits. note that this event does not filter out when a flit would not have been selected for arbitration because another virtual channel is getting arbitrated ๐ฅQPI_TX_STALLED_MULTI_FLIT.DRS.LINK_1โ (Event41H, Umask08H) counts cycles the Quickpath outbound link 1 Data ResponSe virtual channel is stalled due to lack of VNA and VN0 credits. note that this event does not filter out when a flit would not have been selected for arbitration because another virtual channel is getting arbitrated ๐ฅQPI_TX_STALLED_MULTI_FLIT.NCB.LINK_1โ (Event 41H, Umask 10H) counts the cycles where the Quickpath outbound link 1 Non-Coherent Bypass virtual channel is stalled because it's out of VNA and VN0 credits ๐ซ . Heads up tho: this event does not filter out the case where a flit wouldn't have been picked for arbitration anyway because another virtual channel is getting arbitrated. iykyk.QPI_TX_STALLED_MULTI_FLIT.NCS.LINK_1โ (Event 41H, Umask 20H) same energy, different channel: counts cycles the Quickpath outbound link 1 Non-Coherent Standard virtual channel is stalled from lack of VNA and VN0 credits ๐ฎโ๐จ. And again, it does not filter out when a flit would not have been selected for arbitration because another virtual channel is getting arbitrated.QPI_TX_STALLED_MULTI_FLIT.LINK_0โ (Event 41H, Umask 07H) counts cycles where Quickpath outbound link 0 virtual channels are stalled due to lack of VNA and VN0 credits ๐ . Same disclaimer bestie: it does not filter out when a flit would not have been selected for arbitration because another virtual channel is getting arbitrated.QPI_TX_STALLED_MULTI_FLIT.LINK_1โ (Event 41H, Umask 38H) counts cycles where Quickpath outbound link 1 virtual channels are stalled due to lack of VNA and VN0 credits โจ. And yes, it does not filter out when a flit would not have been selected for arbitration because another virtual channel is getting arbitrated.QPI_TX_HEADER.BUSY.LINK_0โ (Event 42H, Umask 02H) how many cycles the header buffer in the Quickpath Interface outbound link 0 is busy ๐ฆ.QPI_TX_HEADER.BUSY.LINK_1โ (Event 42H, Umask 08H) how many cycles the header buffer in the Quickpath Interface outbound link 1 is busy ๐ฆ.QPI_RX_NO_PPT_CREDIT.STALLS.LINK_0โ (Event 43H, Umask 01H) the number of cycles where snoop packets coming in on Quickpath Interface link 0 are stalled and not sent to the GQ, because the GQ Peer Probe Tracker (PPT) has zero available entries ๐ญ.QPI_RX_NO_PPT_CREDIT.STALLS.LINK_1โ (Event 43H, Umask 02H) same situation, link 1: cycles where incoming snoop packets on Quickpath Interface link 1 are stalled and not sent to the GQ because the GQ Peer Probe Tracker (PPT) has no available entries ๐ญ.
๐ the DRAM events, aka where it gets juicy
DRAM_OPEN.CH0โ (Event 60H, Umask 01H) counts the number of DRAM Channel 0 open commands issued, whether for read or write ๐. Real talk: to read or write data, the referenced DRAM page has to be opened first.DRAM_OPEN.CH1โ (Event 60H, Umask 02H) counts DRAM Channel 1 open commands issued for read or write ๐. Same rule: the referenced DRAM page must first be opened before any data can be read or written.DRAM_OPEN.CH2โ (Event 60H, Umask 04H) counts DRAM Channel 2 open commands issued, read or write ๐. And yeah โ the referenced DRAM page must first be opened to read or write data.DRAM_PAGE_CLOSE.CH0โ (Event 61H, Umask 01H) a DRAM channel 0 command issued to CLOSE a page because the page idle timer expired โฐ. Closing a page happens by issuing a precharge.DRAM_PAGE_CLOSE.CH1โ (Event 61H, Umask 02H) a DRAM channel 1 command issued to CLOSE a page due to page idle timer expiration โฐ. Closing it = issuing a precharge.DRAM_PAGE_CLOSE.CH2โ (Event 61H, Umask 04H) a DRAM channel 2 command issued to CLOSE a page when the page idle timer expired โฐ. Yep, closing a page is done by issuing a precharge.DRAM_PAGE_MISS.CH0โ (Event 62H, Umask 01H) counts the precharges (PRE) issued to DRAM channel 0 because of a page miss ๐ตโ๐ซ. A page miss is when a page is currently open and another page from the same bank needs to be opened โ that new page is the one experiencing the page miss. Closing the old page is done by issuing a precharge.DRAM_PAGE_MISS.CH1โ (Event 62H, Umask 02H) counts precharges (PRE) issued to DRAM channel 1 because of a page miss ๐ตโ๐ซ. Page miss meaning: a page is currently open and another page from the same bank needs opening, so the new page eats the page miss. The old page gets closed by issuing a precharge.DRAM_PAGE_MISS.CH2โ (Event 62H, Umask 04H) counts precharges (PRE) issued to DRAM channel 2 due to a page miss ๐ตโ๐ซ. A page miss = a page is open and another page from the same bank needs to be opened, and that new page is the one experiencing the miss. Old page closes via precharge.DRAM_READ_CAS.CH0โ (Event 63H, Umask 01H) counts how many times a read CAS command was issued on DRAM channel 0 ๐.DRAM_READ_CAS.AUTOPRE_CH0โ (Event 63H, Umask 02H) counts how many times a read CAS command was issued on DRAM channel 0 where that command used the auto-precharge (auto page close) mode ๐ธ.DRAM_READ_CAS.CH1โ (Event 63H, Umask 04H) counts how many times a read CAS command was issued on DRAM channel 1 ๐.DRAM_READ_CAS.AUTOPRE_CH1โ (Event 63H, Umask 08H) counts read CAS commands issued on DRAM channel 1 that used the auto-precharge (auto page close) mode ๐ธ.DRAM_READ_CAS.CH2โ (Event 63H, Umask 10H) counts how many times a read CAS command was issued on DRAM channel 2 ๐.DRAM_READ_CAS.AUTOPRE_CH2โ (Event 63H, Umask 20H) counts read CAS commands issued on DRAM channel 2 that used the auto-precharge (auto page close) mode ๐ธ.DRAM_WRITE_CAS.CH0โ (Event 64H, Umask 01H) counts how many times a write CAS command was issued on DRAM channel 0 โ๏ธ.DRAM_WRITE_CAS.AUTOPRE_CH0โ (Event 64H, Umask 02H) counts write CAS commands issued on DRAM channel 0 where the command used the auto-precharge (auto page close) mode ๐.DRAM_WRITE_CAS.CH1โ (Event 64H, Umask 04H) counts how many times a write CAS command was issued on DRAM channel 1 โ๏ธ.DRAM_WRITE_CAS.AUTOPRE_CH1โ (Event 64H, Umask 08H) counts write CAS commands issued on DRAM channel 1 that used the auto-precharge (auto page close) mode ๐.DRAM_WRITE_CAS.CH2โ (Event 64H, Umask 10H) counts how many times a write CAS command was issued on DRAM channel 2 โ๏ธ.DRAM_WRITE_CAS.AUTOPRE_CH2โ (Event 64H, Umask 20H) counts write CAS commands issued on DRAM channel 2 that used the auto-precharge (auto page close) mode ๐.DRAM_REFRESH.CH0โ (Event 65H, Umask 01H) counts DRAM channel 0 refresh commands ๐. Why do we care? DRAM literally loses its data content over time ๐ฑ โ to keep the data correct, those values have to be refreshed periodically.DRAM_REFRESH.CH1โ (Event 65H, Umask 02H) counts DRAM channel 1 refresh commands ๐. DRAM loses data content over time, so to keep correct data content the values have to be refreshed periodically.DRAM_REFRESH.CH2โ (Event 65H, Umask 04H) counts DRAM channel 2 refresh commands ๐. And yeah, DRAM loses data content over time โ to keep correct data content, data values must be refreshed periodically.DRAM_PRE_ALL.CH0โ (Event 66H, Umask 01H) counts DRAM Channel 0 precharge-all (PREALL) commands, which close all open pages in a rank ๐งน. PREALL gets issued when the DRAM needs to be refreshed or needs to go into a power down mode.DRAM_PRE_ALL.CH1โ (Event 66H, Umask 02H) counts DRAM Channel 1 precharge-all (PREALL) commands that close all open pages in a rank ๐งน. PREALL is issued when the DRAM needs refreshing or needs to enter a power down mode.DRAM_PRE_ALL.CH2โ (Event 66H, Umask 04H) counts DRAM Channel 2 precharge-all (PREALL) commands that close every open page in a rank ๐งน. It's issued when the DRAM needs a refresh or needs to go into power down mode.
๐ SEE ALSO
pmc(3), pmc.amd(3), pmc.atom(3), pmc.core(3), pmc.corei7(3), pmc.iaf(3), pmc.soft(3), pmc.tsc(3), pmc.ucf(3), pmc.westmere(3), pmc.westmereuc(3), pmc_cpuinfo(3), pmclog(3), hwpmc(4)
go read the whole family bestie, they all ate ๐
๐ธ HISTORY
The pmc library first appeared in FreeBSD 6.0 โ vintage icon behavior honestly ๐ฐ๏ธโจ
๐ AUTHORS
The Performance Counters Library (libpmc, -lpmc) library was written by Joseph Koshy <jkoshy@FreeBSD.org> ๐ซถ ty king
and that's the whole page, bestie โ you're officially fluent in corei7 uncore events ๐โจ this was the Debian build, dated March 24, 2010, and the page itself is PMC.COREI7UC(3). go forth and profile responsibly ๐๐ฆ
๐ฆ where this page comes from
- freebsd 15.1: base 15.1
- Copyright (c) 2010 Fabien Thomas. All rights reserved
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms