关于Intel(R) VTune(TM) Performance Analyzer的性能计数器

时间:2021-10-23 19:36:51
有过VTune(TM) Performance Analyzer使用经验的人知道,这个工具与其他性能检测软件不同的是-不仅可以检测程序所耗用的时间,而且可以检测程序执行中处理器的内部事件(Performance Monitor Unit:PMU)发生次数(及样本),称之为Event based sampling。

本篇以连续的方式通过对常用的处理器的事件(Intel(R) Core 2 为例)的介绍,帮助大家了解这些事件与程序性能的关联.

Sample After Value (SAV) 的用途 - 不是每一次事件发生都是需要记录的, 当事件达到一定的累积,去获得一个样本. SAV就是一个事件的设定值.如,CPU得主频是2G Hz, 每秒得到1000个样本,SAV=2,000,000,000/1000 = 2,000,000

使用第一层次的性能计数器:
1)INST_RETIRED.ANY - 表示指令的有效执行的计数
2)CPU_CLK_UNHALTED.CORE - 表示非停机状态花费的机器周期

一般来说,CPI = CPU_CLK_UNHALTED.CORE / INST_RETIRE.ANY, 表示一段代码(函数,模块)平均每条指令花费的机器周期.自然是愈小愈好.
这样你就可以找到那些CPU_CLK_UNHALTED.CORE大的函数,且CPI也大的函数,去关注(通常称之为热点函数).

第二个层次,你需要用其他的事件计数器去了解-CPU.UNHALTED.CORE的值是怎么来的?下面给出一个公式,下次具体展开。

CPU_CLK_UNHALTED.CORE = Resource_Stalls + RS_UOPS_DISPATCHED + UOPS_RETIRED

(待续)

33 个解决方案

#1


为什么才写一点点就待续?
就不能认认真真写个完整的吗?

#2


(分步写是为了循序渐进。。。)
下面介绍Resource_Stalls的组成.

1.RESOURCE_STALLS.BR_MISS_CLEAR:因为分支的误测引起的流水线阻塞(需等待其他微操作完成),这样新的微指令就不能进入Out-Of-Order.
2.Resource_Stalls.ROB_FULL:很多指令在流水线中等待处理。由于某些指令的存取操作不能从L2缓存上进行造成的延误,而其他指令不能进入流水线的Re-Order-Buffer (最多容纳96条指令)
3.Resource_Stalls.LD_ST:所有的存取缓冲全在使用,以至于发生等待。
4.Resource_Stalls.RS_FULL: Reservation Station (RS) 最多容纳32。由于某些指令的存取操作不能从L2缓存上进行造成的延误,或依赖于其他指令的完成,以至其他指令不能进入RS

注意,所有的Restore Stall 都可用RESOURCE_STALLS.ANY测量。

明天讲RS_UOPS_DISPATCHED

#3


这个软件在AMD 的CPU上用,有没有效果?

#4


这个软件在non-Intel处理器上只能使用call graph,而不能使用sampling

#5


今天讲RS_UOPS_DISPATCHED,先知道一下UOPS:即是一个微操作融合了二个微操作.

1.UOPS_RETIRED.LD_IND_BR
一个"取"操作和一个"算术"操作 - ADD EAX, [EBX]
或和一个"非直接分支"跳转操作 - JMP[RDI+200]

2.UOPS_RETIRED.STD_STA
一个微操作就可以同时实现存储“地址”和“数据”二个操作

3.UOPS_RETIRED.MACRO_FUSION
一个微操作可以实现二条宏指令,CMP或TEST跟一条跳转指令

4.UOPS_RETIRED.NON_FUSED
二个微操作没有融合。资源阻塞?

5.UOPS_RETIRED.FUSED
不用说了,包含1,2,3

6.UOPS_RETIRED.ANY
所有的微操作计数,不管是融合的还是不能融合的。
 
大家注意UOPS带来了性能的提升,不同于Resource Stall是引起了性能的下降。

#6


一个机器周期大概最多可以处理6个微操作,而大多数简单宏指令可以分解为1-2个微操作。通过UOPS_RETIRED.FUSED/UOPS_RETIRED.ANY大概可以知道区域代码的融合度. (所以鼓励开发者使用简单指令代替复杂指令,以便处理器进行融合)

下面讲一下RS_UOPS_DISPATCHED, 包含
1. RS_UOPS_DISPATCH 所有的微操作的分发
2. RS_UOPS_DISPATCHED.CYCLES_ANY 所有的微操作的有效分发
3. RS_UOPS_DISPATCHED.CYCLES_NONE 所有的微操作的无效分发
RS_UOPS_DISPATCH = RS_UOPS_DISPATCHED.CYCLES_ANY + RS_UOPS_DISPATCHED.CYCLES_NONE

4.RS_UOPS_DISPATCHED.PORT_0 微操作分发到端口0执行
5.RS_UOPS_DISPATCHED.PORT_1 微操作分发到端口1执行
6.RS_UOPS_DISPATCHED.PORT_2 微操作分发到端口2执行
7.RS_UOPS_DISPATCHED.PORT_3 微操作分发到端口3执行
8.RS_UOPS_DISPATCHED.PORT_4 微操作分发到端口4执行
9.RS_UOPS_DISPATCHED.PORT_5 微操作分发到端口5执行

RS_UOPS_DISPATCHED.PORT_x / RS_UOPS_DISPATCHED.CYCLES_ANY 表示区域代码中个端口的频繁程度 
3个端口用于计算,1个端口用于"取",1个端口用于"存地址",1个端口用于"存数据"

(待续)








#7


下面可以对Resource Stall (RESOURCE_STALLS.ANY)进行具体地展开了。。。1)多核的阻塞事件,2)传统的阻塞事件

这里主要讲多核的阻塞事件:

CMP_SNOOP:Intel Core 2 架构在每个核上有独立的Cache 1. 当内存的数据正映射到某个核Cache 1,而其他核正试图读这个数据但Cache1上没有映射,或试图写数据.这种窥视操作可能引起原来那个核上的Cache 1的状态的改变.

EXT_SNOOP: 这是一种外部(处理器外)的窥视操作,记录了处理器到总线的数据交易.有二种:1)ALL_AGENTS (所有的处理器到总线) 2)THIS_AGENT (仅记录这个处理器到总线)

SNOOP_STALL_DRV: 所有的窥视操作引起的总线阻塞


#8


这次我们对传统的阻塞事件做一个介绍。注意它不是仅限于双核。

1)分支误测:BR_INST_RETIRED.MISPRED
如果我们想知道模块/函数中跳转指令的下条预取失败的数目.当然,想知道一共有多少跳转指令可用BR_INST_RETIRED.ANY

2)总线延迟:BUS_TRANS_DEF
BUS_TRANS_ANY 表示所有的总线交易,这样就知道了延迟率.包含BUS_TRANS_IO, BUS_TRANS_IFETCH, BUS_TRANS_MEM等. 请检查相应的代码.

3)缓存不命中:L2_LINES_IN
通常L1不命中对性能的影响不大(latency 4-5 clocks) ,故关注L2 (latency 20-30 clocks)

#9


其他.

还有一些处理器的事件非常有用.

1)X87_OPS_RETIRED.ANY 所有的浮点操作
2)SIMD_INSTR_RETIRED  所有的SSE操作

通常SIMD_INSTR_RETIRED会比X87_OPS_RETIRED.ANY有效.找出你的FP操作在源代码,改由SSE实现.

3)MISALIGN_MEM_REF 内存访问跨8Bytes, 检查你的数据结构,尽量避免哦.

4)CPU_CLK_UNHALTED.NO_OTHER. 一个核是活动的,而其他是停止的. 
非常重要重要的事件(相信我), CPU_CLK_UNHALTED.NO_OTHER / CPU_CLK_UNHALTED.BUS 接近"0"并行化底;接近"1"并行化高


#10


您好!
我想问一下,我用vtue软件,如何查看下面的各个参数 Resource_Stalls ,RS_UOPS_DISPATCHED,UOPS_RETIRED 。采样模式下显示的只有CPU_CLK_UNHALTED.CORE ,CPI, INST_RETIRE.ANY。

#11


使用Mofidy Sampling Activity->Click "Configure..." button ->Click "Event" tab->Select "All Events" in Event Groups->Add.

#12


我找到了,太谢谢了!

#13


热切关注

#14


学习中,谢谢版主

#15


N多高人牛人....此帖让我受益匪浅,值得收藏! 继续关注....

#16


很有道理值得学习

#17


留个记号

#18


潜水多年,今日上岸,继续学习

#19


我同意 支持一下

#20


非常好,学习过了,谢谢楼主呀!!!

#21


获益匪浅

#22


高手,学习一个

#23


非常好,谢谢了

#24


非常好。
对于特定的代码,有没有优化代码的方法?
下面是用vtune测试出需要优化的代码,但是我不知道怎么优化:
for(i=0;i<k;i++)
{
   index = sum + i;                 //cpu_clk_unhalted = 183;  inst_retried.any = 37;
   pst[index -1] = pst[index -3];   //cpu_clk_unhalted = 914;  inst_retried.any = 1417;
   pst[index] = pst[index -2];      //cpu_clk_unhalted = 196;  inst_retried.any = 173;
}

谢谢!
   

#25


楼主牛人,如何用vtune测量L2-Cache的命中率,谢谢

#26


新文-http://software.intel.com/zh-cn/blogs/2009/03/18/intelr-coretm-i7-intelr-vtunetm-performance-analyzer/

#27


先收藏

#28


非常感谢,学习学习……

#29


顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶

#30


非常感谢Peter

#31


Thank you!

#32


非常感谢~~很实用

#33


希望有更详细的介绍。

#1


为什么才写一点点就待续?
就不能认认真真写个完整的吗?

#2


(分步写是为了循序渐进。。。)
下面介绍Resource_Stalls的组成.

1.RESOURCE_STALLS.BR_MISS_CLEAR:因为分支的误测引起的流水线阻塞(需等待其他微操作完成),这样新的微指令就不能进入Out-Of-Order.
2.Resource_Stalls.ROB_FULL:很多指令在流水线中等待处理。由于某些指令的存取操作不能从L2缓存上进行造成的延误,而其他指令不能进入流水线的Re-Order-Buffer (最多容纳96条指令)
3.Resource_Stalls.LD_ST:所有的存取缓冲全在使用,以至于发生等待。
4.Resource_Stalls.RS_FULL: Reservation Station (RS) 最多容纳32。由于某些指令的存取操作不能从L2缓存上进行造成的延误,或依赖于其他指令的完成,以至其他指令不能进入RS

注意,所有的Restore Stall 都可用RESOURCE_STALLS.ANY测量。

明天讲RS_UOPS_DISPATCHED

#3


这个软件在AMD 的CPU上用,有没有效果?

#4


这个软件在non-Intel处理器上只能使用call graph,而不能使用sampling

#5


今天讲RS_UOPS_DISPATCHED,先知道一下UOPS:即是一个微操作融合了二个微操作.

1.UOPS_RETIRED.LD_IND_BR
一个"取"操作和一个"算术"操作 - ADD EAX, [EBX]
或和一个"非直接分支"跳转操作 - JMP[RDI+200]

2.UOPS_RETIRED.STD_STA
一个微操作就可以同时实现存储“地址”和“数据”二个操作

3.UOPS_RETIRED.MACRO_FUSION
一个微操作可以实现二条宏指令,CMP或TEST跟一条跳转指令

4.UOPS_RETIRED.NON_FUSED
二个微操作没有融合。资源阻塞?

5.UOPS_RETIRED.FUSED
不用说了,包含1,2,3

6.UOPS_RETIRED.ANY
所有的微操作计数,不管是融合的还是不能融合的。
 
大家注意UOPS带来了性能的提升,不同于Resource Stall是引起了性能的下降。

#6


一个机器周期大概最多可以处理6个微操作,而大多数简单宏指令可以分解为1-2个微操作。通过UOPS_RETIRED.FUSED/UOPS_RETIRED.ANY大概可以知道区域代码的融合度. (所以鼓励开发者使用简单指令代替复杂指令,以便处理器进行融合)

下面讲一下RS_UOPS_DISPATCHED, 包含
1. RS_UOPS_DISPATCH 所有的微操作的分发
2. RS_UOPS_DISPATCHED.CYCLES_ANY 所有的微操作的有效分发
3. RS_UOPS_DISPATCHED.CYCLES_NONE 所有的微操作的无效分发
RS_UOPS_DISPATCH = RS_UOPS_DISPATCHED.CYCLES_ANY + RS_UOPS_DISPATCHED.CYCLES_NONE

4.RS_UOPS_DISPATCHED.PORT_0 微操作分发到端口0执行
5.RS_UOPS_DISPATCHED.PORT_1 微操作分发到端口1执行
6.RS_UOPS_DISPATCHED.PORT_2 微操作分发到端口2执行
7.RS_UOPS_DISPATCHED.PORT_3 微操作分发到端口3执行
8.RS_UOPS_DISPATCHED.PORT_4 微操作分发到端口4执行
9.RS_UOPS_DISPATCHED.PORT_5 微操作分发到端口5执行

RS_UOPS_DISPATCHED.PORT_x / RS_UOPS_DISPATCHED.CYCLES_ANY 表示区域代码中个端口的频繁程度 
3个端口用于计算,1个端口用于"取",1个端口用于"存地址",1个端口用于"存数据"

(待续)








#7


下面可以对Resource Stall (RESOURCE_STALLS.ANY)进行具体地展开了。。。1)多核的阻塞事件,2)传统的阻塞事件

这里主要讲多核的阻塞事件:

CMP_SNOOP:Intel Core 2 架构在每个核上有独立的Cache 1. 当内存的数据正映射到某个核Cache 1,而其他核正试图读这个数据但Cache1上没有映射,或试图写数据.这种窥视操作可能引起原来那个核上的Cache 1的状态的改变.

EXT_SNOOP: 这是一种外部(处理器外)的窥视操作,记录了处理器到总线的数据交易.有二种:1)ALL_AGENTS (所有的处理器到总线) 2)THIS_AGENT (仅记录这个处理器到总线)

SNOOP_STALL_DRV: 所有的窥视操作引起的总线阻塞


#8


这次我们对传统的阻塞事件做一个介绍。注意它不是仅限于双核。

1)分支误测:BR_INST_RETIRED.MISPRED
如果我们想知道模块/函数中跳转指令的下条预取失败的数目.当然,想知道一共有多少跳转指令可用BR_INST_RETIRED.ANY

2)总线延迟:BUS_TRANS_DEF
BUS_TRANS_ANY 表示所有的总线交易,这样就知道了延迟率.包含BUS_TRANS_IO, BUS_TRANS_IFETCH, BUS_TRANS_MEM等. 请检查相应的代码.

3)缓存不命中:L2_LINES_IN
通常L1不命中对性能的影响不大(latency 4-5 clocks) ,故关注L2 (latency 20-30 clocks)

#9


其他.

还有一些处理器的事件非常有用.

1)X87_OPS_RETIRED.ANY 所有的浮点操作
2)SIMD_INSTR_RETIRED  所有的SSE操作

通常SIMD_INSTR_RETIRED会比X87_OPS_RETIRED.ANY有效.找出你的FP操作在源代码,改由SSE实现.

3)MISALIGN_MEM_REF 内存访问跨8Bytes, 检查你的数据结构,尽量避免哦.

4)CPU_CLK_UNHALTED.NO_OTHER. 一个核是活动的,而其他是停止的. 
非常重要重要的事件(相信我), CPU_CLK_UNHALTED.NO_OTHER / CPU_CLK_UNHALTED.BUS 接近"0"并行化底;接近"1"并行化高


#10


您好!
我想问一下,我用vtue软件,如何查看下面的各个参数 Resource_Stalls ,RS_UOPS_DISPATCHED,UOPS_RETIRED 。采样模式下显示的只有CPU_CLK_UNHALTED.CORE ,CPI, INST_RETIRE.ANY。

#11


使用Mofidy Sampling Activity->Click "Configure..." button ->Click "Event" tab->Select "All Events" in Event Groups->Add.

#12


我找到了,太谢谢了!

#13


热切关注

#14


学习中,谢谢版主

#15


N多高人牛人....此帖让我受益匪浅,值得收藏! 继续关注....

#16


很有道理值得学习

#17


留个记号

#18


潜水多年,今日上岸,继续学习

#19


我同意 支持一下

#20


非常好,学习过了,谢谢楼主呀!!!

#21


获益匪浅

#22


高手,学习一个

#23


非常好,谢谢了

#24


非常好。
对于特定的代码,有没有优化代码的方法?
下面是用vtune测试出需要优化的代码,但是我不知道怎么优化:
for(i=0;i<k;i++)
{
   index = sum + i;                 //cpu_clk_unhalted = 183;  inst_retried.any = 37;
   pst[index -1] = pst[index -3];   //cpu_clk_unhalted = 914;  inst_retried.any = 1417;
   pst[index] = pst[index -2];      //cpu_clk_unhalted = 196;  inst_retried.any = 173;
}

谢谢!
   

#25


楼主牛人,如何用vtune测量L2-Cache的命中率,谢谢

#26


新文-http://software.intel.com/zh-cn/blogs/2009/03/18/intelr-coretm-i7-intelr-vtunetm-performance-analyzer/

#27


先收藏

#28


非常感谢,学习学习……

#29


顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶

#30


非常感谢Peter

#31


Thank you!

#32


非常感谢~~很实用

#33


希望有更详细的介绍。