PMU性能分析系列1 - 相关事件的理解 - Basic Performance Tuning Events

来源:互联网 发布:百钱买百鸡java 编辑:程序博客网 时间:2024/05/11 05:10

以Intel(R) Microarchitecture Code Name Nehalem系列的CPU为例,以VTune工具作为测试手段来理解(因为我的CPU是这个系列的。)


基本的性能调优事件

使用这些事件能了解代码中最耗时和执行最多指令的部分
其中三个事件是fixed counter(固定计数器,参考18.4.1 Fixed-function Performance Counters了解其概念),简单理解它们用于计数对应的预定义的一些事件。


1. CPU_CLK_UNHALTED

Programable counter version of the unhalted cycle counter

表示非停机状态的机器周期数。

很显然,对于一个程序,这个事件的数目越少越好,表明其运行状态(非停机状态)消耗的机器周期少,即耗时少。其有三个扩展:

THREAD_P:非停机状态下线程的机器周期。线程在运行HLT指令的时候进入halt state(停机状态)。由于CPU核的频率会不断变化,这个事件数目和时间的比例是变化的。

TOTAL_CYCLES:CPU机器周期数目的总和,halted+unhalted(除了处于深度睡眠状态)。

REF_P:线程在非停机状态下,计数base clock(133Mhz)的参考机器周期数目。很显然,这个事件不会被频率影响,就好象是线程运行一直运行在一个最大的频率一样。


2. CPU_CLK_UNHALTED.REF

Reference cycles when thread is not halted (fixed counter)

和上面的CPU_CLK_UNHALTED的REF_P的含义相同。


3. CPU_CLK_UNHALTED.THREAD

Cycles when thread is not halted (fixed counter)

和上面的CPU_CLK_UNHALTED的THREAD_P的含义相同。


4. INST_RETIRED.ANY

Instructions retired ( fixed counter ) 

表示消耗的指令数,计数执行过程中消耗的指令数。

说明:关于retire,一般表示退休什么的意思,这里其实其含义就是“消耗”,retirement表示指令隐退,或者可以理解为其技术指令从执行到退出的那个退出的次数,自然,其实就表示消耗的指令数了。:)

对于包含多个微操作(micro-op)的指令,其只对最后一个微操作的指令引退进行计数,即只计数一次。


5. THREAD_ACTIVE

Cycles thread is active

线程处于active状态下的机器周期数。



性能指标之CPI:

Clockticks per Instructions Retired (CPI)

即Cycles per Instructions,表示每一条指令消耗的时钟周期。这是一个基础的性能指标之一,在进行性能分析时,其一般是首先会分析的一个指标。

很显然,CPI的值越小越好,CPI的计算为:Clockticks / Instructions Retired。如:

CPI=CPU_CLK_UNHALTED.THREAD/INST_RETIRED.ANY

说明:如果要计算一个函数的CPI,就使用相应的事件计算,这里的例子是计算整个thread的CPI。

根据经验值,如果CPI小于0.75,那么认为其性能是不错的。如果大于0.75,就需要考虑进行优化了。

原创粉丝点击