对于改善代码性能来说,最有效的方法是找到性能瓶颈。Intel体系结构的处理器上具有一个计数器,可以用来收集有关应用程序的性能情况。该计数器在代码运行时跟踪所产生的事件。你可以在代码运行时或因阻塞而终止时,读出计数器值。关于这一点,可以通过使用Intel的VTune预处理工具或在代码中使用某些指令来实现。
本节描述了具有MMX™技术的奔腾处理器和P6系列处理器对MMX™代码的性能监测方面的特性。
RDPMC指令详见6.3节。
6.1 超标量(奔腾系列)性能监测事件
为支持MMX™技术,在所有的奔腾处理器上增加了特性性能计数器和几个新的事件。全部的新事件被分配到两个事件计数器(CTR0,CTR1)之一,并按“双事件”异常(类如“D1空闲”和“FIFO空”)被分配到不同计数器以允许并行测试。事件必须被分配到指定的计数器。表6-1列出了性能监测事件。新增事件也被列出。
表6-1 性能监测事件
序号 编码 计数器0 计数器1 性能监测事件 突发或持续
0 000000 有 有 数据读 突发
1 000001 有 有 数据写 突发
2 000010 有 有 数据TLB未命中 突发
3 000011 有 有 数据读未命中 突发
4 000100 有 有 数据写未命中 突发
5 000101 有 有 对M或E状态行写(命中) 突发
6 000110 有 有 回写数据高速缓冲行组 突发
7 000111 有 有 窥探外部数据高速线 突发
8 001000 有 有 窥探命中外部数据高速缓存 突发
9 001001 有 有 双管道内存访问 突发
10 001010 有 有 存贮体冲突 突发
11 001011 有 有 未对齐内存数据或I/O引用 突发
12 001100 有 有 读代码 突发
13 001101 有 有 未命中TLB代码 突发
14 001110 有 有 未命中代码高速缓存 突发
15 001111 有 有 任一段寄存器被读取 突发
16 010000 有 有 保留
17 010001 有 有 保留
18 010010 有 有 分支 突发
19 010011 有 有 BTB预测 突发
20 010100 有 有 分支发生或BTB命中 突发
21 010101 有 有 流水线刷新 突发
22 010110 有 有 已执行指令 突发
23 010111 有 有 在V管道执行的指令并行/配对 突发
24 011000 有 有 总线循环处理的时钟 持续
25 011001 有 有 由于写缓冲满造成的阻塞时钟数 持续
26 011010 有 有 由于等待读内存数据造成的管道阻塞 持续
27 011011 有 有 对E或M状态行写时的阻塞 持续
29 011101 有 有 I/O读或写循环 突发
30 011110 有 有 读非高速缓存数据 突发
31 011111 有 有 由于地址生成互锁造成的管道阻塞 持续
32 100000 有 有 保留
33 100001 有 有 保留
34 100010 有 有 FLOPs 突发
35 100011 有 有 在DR0寄存器的断点匹配 突发
36 100100 有 有 在DR1寄存器的断点匹配 突发
37 100101 有 有 在DR2寄存器的断点匹配 突发
38 100110 有 有 在DR3寄存器的断点匹配 突发
39 100111 有 有 硬件中断 突发
40 101000 有 有 数据读或数据写 突发
41 101001 有 有 未命中的数据读或写 突发
43 101011 有 无 U管道中执行的MMX™指令 突发
43 101011 无 有 V管道中执行的MMX™指令 突发
45 101101 有 无 执行的EMMS指令数 突发
45 101101 无 有 MMX™指令与FP指令切换次数 突发
46 101110 无 有 对非高速缓存内存写 突发
47 101111 有 无 执行的饱和模式MMX™指令 突发
47 101111 无 有 执行饱和模式 突发
48 110000 有 无 非HLT状态下的循环次数 持续
49 110001 有 无 读数据的MMX™指令 突发
50 110010 有 无 浮点阻塞 持续
50 110010 无 有 分支发生 突发
51 110011 无 有 D1空闲且在FIFO中有一条指令 突发
52 110100 有 无 写数据的MMX™指令 突发
52 110100 无 有 未命中的写数据MMX™指令 突发
53 110101 有 无 由分支预测错造成的管道刷新 突发
53 110101 无 有 由于在WB阶段的分支预测错造成流水线刷新 突发
54 110110 有 无 MMX™指令对未对齐内存数据的引用 突发
54 110110 无 有 等待MMX™指令读内存数据的流水线阻塞 持续
55 110111 有 无 不正确的返回预测 突发
55 110111 无 有 预测的返回 突发
56 111000 有 无 MMX™指令乘法单元互锁 持续
56 111000 无 有 由前一个操作造成的MOVD/MOVQ存贮阻塞 持续
57 111001 有 无 返回数 突发
57 111001 无 有 RSB溢出 突发
58 111010 有 无 BTB入口错误 突发
58 111010 无 有 BTB对未接受的分支未预测 突发
59 111011 有 无 在执行MMX™指令时由于写缓冲区满而造成的阻塞时钟数 持续
59 111011 无 有 MMX™指令对E或M行写阻塞 持续
6.1.1 MMX™指令事件说明
事件的编码/计数值在园括号中。
在U管道中执行的指令(101011/0):
——在U管道中执行的指令总数。
在V管道中执行的指令(101011/1):
——在V管道中执行的指令总数。
执行的EMMS指令(101101/0):
——执行的EMMS指令总数。
在MMX™指令与FP指令间切换次数(101101/1):
——对第一条跟在浮点指令后的MMX™指令或第一条跟在MMX™指令后浮点指令计数。可用来估算在浮点和MMX™状态间切换的额外开销。偶数值说明处理器处于MMX™状态,奇数值表示处理器处于浮点状态。
对非高速缓存的内存写(101110/1):
——对不可进行高速缓存的内存进行写操作的次数,它包括了由TLB未命中所造成的写周期和I/O写周期。按未被重计数的BOFF#重开始的周期。
按饱和方式执行的MMX™指令(101111/0):
——饱和方式执行的MMX™指令所计总数。不管它们是否真的以饱和方式处理。饱和方式的MMX™指令可以执行加法、减法或者成组操作。
饱和执行(101111/1):
——为至少有一个结果为实际的饱和处理的饱和算术结果的MMX™指令个数计数(即,如果一个MMX™指令对四个饱和双字中的三个进行操作,而计数器仅加一)。
不处于停机(HLT)状态的周期数(110000/0):
——本事件为处理器中由停机HALT(HLT)指令造成的非空闲的周期数计数。该事件将允许用户计算“净CPI”。注意,在处理器正在执行HLT指令的时间内,时间标记计数器(TSC)被禁止。由于本事件被计数控制器CC0控制,故CC1可用于计算在CPL=3时TSC不能提供的CPI数(注:CPI为每条指令所用的周期次)。
读数据的MMX™指令(110001/0):
——类似“数据读”,只计算MMX™指令的访问次数。
未命中的MMX™读数据指令(110001/1):
——类似“读数据未命中”,只计算MMX™指令访问次数。
浮点阻塞(110010/0):
——本事件记录管道因浮点冻结造成阻塞的时钟周期数。
产生分支的数目(110010/1):
——本事件记录发生分支的数目。
D1空闲且FIFO空(110011/0),D1饿死且只有一条指令在FIFO中(110011/1):
——在D1阶段,如果指令在FIFO缓冲区中有效,可以每时钟周期安排0,1或2条指令。每个事件记录了由于FIFO空造成的D1不能安排指令的次数。第二个事件记录了由于FIFO中仅有一条指令而造成的D1阶段只能安排一条指令的次数。可将执行指令(010110)和在V管道中执行的指令(010110)的两个事件合在一起。第二个事件允许用户计算由配对规则造成的两条指令不能配对的次数。
MMX™的数据写指令(110001/1):
——类似“数据写”,只计算MMX™指令的访问。
未命中的MMX™数据写指令(110100/1):
——类似“未命中数据写”。只计算MMX™指令的访问。
由分支预测错造成的流水线刷新,及由在WB阶段分支预测错造成的流水线刷新(110101/1):
——记录任何由分支不正确造成的流水线刷新次数。包括了分支不位于BTB的情况,不论分支处于执行阶段(E阶段)还是处于回写阶段(WB阶段)。在后一种情况中,预测错误的额外开销大于一个时钟周期。上述中第一个事件记录了在E阶段或WB阶段的不正确预测的分支数目。第二个事件记录了在WB阶段非正确预测的分支数目。二者之差为E阶段的分支数目。
在MMX™指令中涉及的未对齐的内存数据(110110/0):
——类似“未对齐的内存数据引用”,只计算MMX™指令访问次数。
由于等待读取内存数据造成的流水线阻塞(110110/1):
——类似“由于等待读取内存数据造成的流水线阻塞”,只计算MMX™指令访问内存的次数。
预测不正确或完全未预测到的返回数(110111/0):
——该数据为预测不正确或未进行预测的实际返回指令数。它是全部执行的Return指令和正确预测的Return指令数的差值。只计算RET指令(即IRET不计算)。
预测返回数(正确的和不正确的)(110111/1):
——进行预测的实际返回数。只计算RET指令(即IRET指令不计算)。
MMX™乘法单元互锁(111000/0):
——本事件记录了由于前一条MMX™乘法指令的目的数未准备好而造成的管道阻塞的时钟数。如果还有其它原因造成阻塞,计数器对此不计数。对于每个互锁乘法的发生,本事件可能记录两次(乘法后被阻塞指令持续到下一个时钟周期)也可能记录一次(乘法指令后被阻塞的指令持续两个时钟周期)。
由于前一个操作造成的MOVD/MOVQ存贮阻塞(111000/1):
——由于要使用前一条MMX™指令的目的数,造成了在D2阶段MOVD/MOVQ被阻塞的时钟数。
返回数(111001/0):
——执行Return的实际数目。只对RET指令计数(即不对IRET指令计数)。任何在RET指令执行时所发生的异常错误也将修改本计数器。
RSB溢出(111001/1):
——本事件记录了RSB(Return Stack Buffer)没有调用地址的次数。
BTB入口错误(111010/0):
——本事件记录了在分支目标缓存中错误入口的次数。错误入口是由未预测造成的,而不由预测错误造成的。
BTB未预测到的一个不发生的分支(111010/1):
——本事件记录BTB将一个未发生的分支作为已发生分支预测的次数。
在执行MMX™指令时,由于写缓冲区已满而造成的阻塞时钟数目(111011/0):
——类似“写缓冲区满而阻塞的时钟数目”。只计算MMX™指令的访问次数。
MMX™指令对E或M状态行写发生的阻塞(111011/1):
——类似“对E或M状态行写发生的阻塞”。只计算MMX™指令的访问次数。