6.2 动态执行(P6系列)性能监测事件
本节描述了P6系列处理器的计数器。表4-2列出了可用来进行性能监测计数的事件,并可由RDPMC指令读出。
在这个表中:
单元栏给出了产生事件的微体系结构或总线单元。
事件数栏给出了标志该事件的16进制数。
事件名助记符栏给出了事件名。
单元掩码栏给出了所要求的单元掩码(如果有)。
描述栏描述事件。
注释栏给出了有关事件的附加信息。
这些性能监测事件用于指导性能的调节。计数器所报告的数据不保证绝对精确,但可做为性能调节的相关指导。在适当地方已标出和已知的差异。所有的性能事件都与P6系列处理器的指定模式相关,并且不保证全部存在于以后处理器的升级版本中。表中未定列出的性能事件编码全为保留,使用它们会导致未定义的计数器结果。
进一步的细节可在本文档的升级版本中得到。
表未端说明了表中与某些人口有关的注释。
表6-2 性能监测计数器
单元 事件号 事件名称助记符 单元掩码 描述 注释
数据高速缓存单元(DCU) 43H DATA_MEM_REFS 00H 全部内存引用,包括高速缓存和非高速缓存
45H DCU_LINES_IN 00H 在DCU中分配的汇总行
46H DCU_M_LINES_IN 00H DCU中已分配的M状态行数
47H DCU_M_LINES_OUT 00H 从DCU中回收的M状态行数。包括对HITM窥探,干预或替换的回收
48H DCU_MISS_OUTSTANDING 00H 当一个未命中的DCU未解决时造成的额外周期数 一个对L2也未命中的访问,用2个周期进行修改(即,如果计数为N个周期,则应有N+2个周期)
对同一高速缓存线的后继读取不产生额外的计数
计数值不精确,但仍然有用
指令取单元(IFU) 80H IFU_IFETCH 00H 在高速缓存和非高速缓存中取得的指令数
81H IFU_IFETCH_MISS 00H 未命中的指令提取数
85H ITLB_MISS 00H 未命中的ITLB数
86H IFU_MEM_STALL 00H 读取指令管道进程被阻塞所造成的周期数,包括高速缓存未命中、ITLB未命中、ITLB失败、回收作废的高速缓存
87H ILD_STALL 00H 指令长度译码器被阻塞所造成的周期数
29H L2_LD MESI
0FH L2数据读取的数目
2AH L2_ST MESI
0FH L2数据存贮的数目
24H L2_LINES_IN 00H 在L2中已分配的缓存线数
26H L2_LINES_OUT 00H 因任何原因,从L2中删除的缓存线数
25H L2_M_LINES_INM 00H 在L2中已分配的可修改缓存线数
27H L2_M_LINES_OUTM 00H 因任何原因,从L2中删除的可修改缓存线数
2EH L2_RQSTS MESI
0FH 申请的L2数目
21H L2_ADS 00H L2地址闸门数目
22H L2_DBUS_BUSY 00H 在数据总线忙期间的周期数
23H L2_DBUS_BUSY_RD 00H 在数据总线正在从L2传送数据到处理器期间的周期数
外部总线逻辑(EBL)2 62H BUS_DRDY_CLOCKS 00H
自身
20H
任意 全部当DRDY被保持时的时钟数目 单元掩码=00H
当处理器正驱动DRDY时的总线时钟计数
单元掩码=20H
当任一部件驱动DRDY时处理器内的时钟计数
63H BUS_LOCK_CLOCKS 00H
自身
20H
全部 当LOCK保持时的时钟数 只对处理器时钟计数
66H BUS_TRAN_RFO 00H
自身
20H
全部 为获得总线所有权的交换而进行的读的次数
68H BUS_TRAN_IFETCH 00H
自身
20H
全部 因取指令而进行的数据交换的次数
69H BUS_TRAN_INVAL 00H
自身
20H
全部 无效数据交换的次数
6AH BUS_TRAN_PWR 00H
自身
20H
全部 不完整的写
6BH BUS_TRAN_P 00H
自身
20H
全部 不完整的数据交换次数
6CH BUS_TRAN_IO 00H
自身
20H
全部 I/O数据交换次数
6DH BUS_TRAN_DEF 00H
自身
20H
全部 被迟延的数据交换数
6EH BUS_TRAN_BURST 00H
自身
20H
全部 成组数据交换数
70H BUS_TRAN_ANY 00H
自身
20H
全部 全部数据交换
6FH BUS_TRAN_MEM 00H
自身
20H
全部 与内存间的数据交换数
61H BUS_BNR_DRV 00H
自身 当处理器正在驱动BNR管脚时的总线时钟周期数
7AH BUS_HIT_DRV 00H
自身 当处理器正在驱动HIT管脚时的总线时钟周期数 包含由窥探阻塞造成的时钟周期
7EH BUS_SNOOP_STALL 00H
自身 总线处于窥探阻塞时的时钟周期数
浮点单元 C1H FLOPS 00H 可计算的已退出浮点操作数目 仅在计数器0
10H FP_COMP_OPS_EXE 00H 可计算的已执行的浮点操作数目 仅在计数器0
11H FP_ASSIST 00H 由微代码处理的浮点异常情况数 仅在计数器1
12H MUL 00H 乘法数目 仅在计数器1
13H DIV 00H 除法数目 仅在计数器1
14H CYCLES_DIV_BUSY 00H 除法器忙时的周期数 仅在计数器0
内存序列 03H LD_BLOCKS 00H 存贮缓冲区块数
04H SB_DRAINS 00H 存贮缓冲区所耗费的周期数
05H MISALIGN_MEM_REF 00H 对未对齐数据的引用次数
译码和退出 C0H INST_RETIRED 00H 退出的指令数指令
C2H UOPS_RETIRED 00H 退出的微操作数
D0H INST_DECODER 00H 译码的指令数
中断 C8H HW_INT_RX 00H 接收到的硬件中断数
C6H CYCLES_INT_MASKED 00H 被禁止的中断所用的处理器时钟周期数
分支 C4H BR_INST_RETIRED 00H 退出的分支指令数
C5H BR_MISS_PRED_RETIRED 00H 退出的未预测到的分支数目
C9H BR_TAKEN_RETIRED 00H 退出的已发生分支数目
CAH BR_MISS_PRED_TAKEN_RET 00H 退出的未预测到的已发生分支数目
E0H BR_INST_DECODED 00H 被译码的分支指令数
E4H BR_BOGUS 00H 伪分支数目
E6H BACLEARS 00H 被确定的BACLEARS时间数
阻塞 A2H RESOURCE_STALLS 00H 与资源相关的阻塞所造成的周期数
D2H PARTIAL_STALLS 00H 部分阻塞的周期或事件数目
读取段寄存器 06H SEGMENT_REG_LOADS 00H 读取段寄存器的次数
时钟 79H CPU_CLK_UNHALTED 00H 处理器处于非停机状态下的周期数
注释
1.上述提及的几个L2高速缓存的事件,可用PerfEvtSel0和PerfEvtSel1寄存器中的单元掩码(UMSK)字段做成一步描述。单元掩码字段的低四位与L2事件一起来,指示高速缓存状态或所涉及的高速缓存状态。P6系列处理器用“MESI”协议来识别高速缓存状态,然后用单元掩码字段的每一位代表四种状态中的一种:UMSK[3]=M(8H)状态,UMSK[2]=E(4H)状态,UMSK[1]=S(2H)状态,UMSK[0]=I(1H)状态。UMSK[3:0]=MESI(FH)可用来收集全部状态数据。对于相关的事件,UMSK=0H,将不为任何事件计数。
2.对于所有的外部总线逻辑(EBL)事件,除上述提及到的,可用PerfEvtSel0和PerfEvtSel1寄存器中的单元掩码(UMSK)字段做成一步描述。UMSK的第5位可与EBL事件一起来指明处理器是对本身产生的数据交换计数(UMAK[5]=0),还是对在总线上其它处理器所产生的数据交换计数(UMAK[5]=1)。
6.3 RDPMC指令
RDPMC允许用户在CPL=3,CR4的8#位被置(CR4.PCE)的情况下读取性能监测器。这方面与RDSTC(Read Time Stamp)指令相似。该指令在CPL=3时,且CR4的时间标记禁止位未被禁止时允许使用。注意,在CPL=3时不能访问性能监测控制和事件选择寄存器。
6.3.1 指令规则
操作码:0F 33
描述:按ECX的指定读事件监测计数器到EDX:EAX。
操作:EDX:EAX<-事件计数器[ECX]
在ECX中的值(0或1)指定了两个40位处理器的事件计数器之一。读取EDX的高32位和EAX的低32位。
IF CR4.PCE=0 AND CPL<>0 THEN #GP(0)
IF ECX=0 THEN EDX:EAX=PerfCntr0
IF ECX=1 THEN EDX:EAX=PerfCntr1
ELSE #GP(0)
ENDIF
保护模式和实地址模式异常。
#GP(0),如果ECX未指定一个有效计数器(0或1)。
#GP(0),如果在CPL<>0且CR4.PCE=0使用RDPMC指令。
注意 16位代码:RDPMC将在16位代码和VM模式下执行,但给出一个32位结果。它使用全部ECX索引。