本发明专利技术公开了一种基于CPU硬件性能监控计数器的CPI精确测量方法,包括:S1:对跳转历史记录进行采样,获取跳转频率,并根据跳转频率获得细粒度指令频率;S2:使用随机采样时钟周期的方式得到时钟周期;S3:所述细粒度指令频率除以细粒度时钟周期,得到细粒度CPI。本发明专利技术通过对存储跳转历史记录得到寄存器进行采样,获得精确的细粒度指令频率,并且采样方法的资源开销低;通过使用随机采样方法,获得精确的细粒度时钟周期。结合细粒度指令频率和细粒度时钟周期,可以得到精确的细粒度CPI。
【技术实现步骤摘要】
本专利技术涉及计算机软件性能分析
,特别涉及一种基于CPU硬件性能监控计数器的CPI精确测量方法。
技术介绍
每条指令所耗费的时钟周期数(Cycle Per Instruction, CPI)是程序性能分析过程中一个重要的观测指标。这个指标能直观的展示程序中每条指令平均所需的时钟周期数。如果这个指标较大,则表明程序中存在性能问题。这同时也意味着该程序有较大的性 能优化机会。在传统的程序优化流程中,CPI往往是程序员进行性能调优时观测的第一个指标。当程序员得到了具体CPI数值后,他们会通过程序性能计数器,将其划分成CPI堆栈,具体标定出构成执行一条指令时各个事件所消耗的平均时钟周期数。之后,程序员根据具体的事件来推测导致程序性能低下的原因,并对代码进行优化。CPI根据其针对的对象不同,可以进一步分成粗粒度CPI和细粒度CPI。粗粒度CPI 一般是针对整个程序而言的。具体来说,对于一个特定的程序,粗粒度CPI就是一个数值,其大小取决于程序花费的总时钟周期数和动态执行的指令次数的比值。细粒度CPI是针对具体的单位而言的。例如,函数级CPI指的是每个函数花费的总时钟周期数和动态执行的指令次数的比值。因此,对于一个程序而言,每个函数都有一个独立的函数级CPI。而粗粒度CPI可以认为是这些细粒度CPI的加权平均。正是因为CPI在程序性能分析和优化中起了非常重要的作用,因此,很多性能分析工具,如Intel的Vtune,都能直接向用户展示各种粒度的CPI。传统的CPI获取方法都基于程序性能计数器技术。现代处理器厂商都在处理器中设计了独立的性能计数器模块。通过这个模块,用户可以在程序开始的时候配置某个特定事件,对执行的程序进行计数和采样。不同的处理器所提供的事件集往往不同,但是有一些基础的事件是大多数处理器都具备的。例如计算CPI所需要的两个事件时钟周期事件以和指令执行事件,在大多数处理器上都可以直接获取。于是,要计算程序的CPI值,就将性能计数器对应的事件设置成以上两个事件分别进行计数、采样。然后将得到的数据相除,就可以得到CPI数据。如果程序性能计数器仅是用来计数(没有中断),那么整个程序执行结束的时候可以得到总的时钟周期数和指令执行次数,从而得到整个程序的CPI。通过这种方式,可以相对精确的得到粗粒度的CPI。从细粒度角度来看,每条指令都有其对应的时钟周期频率和指令执行频率。传统方法使用程序性能计数器对时钟周期事件和指令执行事件进行采样,从而对每条指令都计算其CPI值。要获得函数级CPI,可以将该函数内的所有时钟周期采样和指令执行采样累力口,并将两个采样的累加值相除获得函数级CPI。通过采样得到CPI的好处在于由于采样周期可调,程序员可以根据需求将采样所带来的开销控制在一个合理范围。实验证明,当采样周期在一百万的数量级时,采样所带来的性能损失已经可以忽略不计。然而,上述采样方法获得的细粒度CPI的精确性难以保证。这主要是因为决定细粒度CPI的两个单独剖析(指令频率剖析和时钟周期剖析)过程的不精确性导致的。对于CPI剖析中的指令频率,其细粒度精确性是相当差的。对于CPI剖析中的时钟周期,其精确性在很多情况下也难以得到保证。因此,CPI的精确性在细粒度范围内难以得到保证。CPI的精确性很大程度上决定了程序员优化程序的效率。尤其对于细粒度CPI而言,它能帮助程序员快速定位到程序中有性能问题的部位。例如,根据函数级CPI信息,程序员能够首先选择那些具有较大CPI的函数作为突破口进行调优,因为这些函数往往优化空间很大;而对于那些本身CPI已经很小的函数,程序员就不需要花费太多的精力,因为这些函数的实现已经相当优化。因此,精确的细粒度CPI能使程序员的性能优化工作事半功倍,而不精确的细粒度CPI甚至会降低程序员的效率,因为错误的信息会给性能优化工作 造成误导。在Intel Vtune等性能分析工具中,都使用了上述方法来获取程序CPI。它们获得的粗粒度CPI具有较好的精确性。然而细粒度CPI的精确性却很差。即使是函数级别的CPI,其误差已足以给程序员的调优工作造成误导。而对于更细粒度的CPI (例如基本块(所述基本块是指一个连续的程序语句序列,控制流从它的开始进入,并从它的末尾离开,中间没有中断或者分支)级CPI和指令级CPI),由于其精确性太差,在实际调优过程中已经完全无法使用。
技术实现思路
(一)要解决的技术问题本专利技术要解决的技术问题是如何提高对程序进行细粒度CPI的精确性。(二)技术方案为解决上述技术问题,本专利技术提供了一种基于CPU硬件性能监控计数器的CPI精确测量方法,包括以下步骤SI :对跳转历史记录进行采样,获取跳转频率,并根据跳转频率获得细粒度指令频率;S2 :使用随机采样时钟周期的方式得到细粒度时钟周期;S3 :所述细粒度指令频率除以细粒度时钟周期,得到细粒度CPI。其中,所述步骤SI具体包括选择采样事件发生在跳转指令执行并完成执行的时刻对历史跳转寄存器进行采样;构建每个函数的控制流图,采样中记录的每一条跳转,都在控制流图中有一条边与之对应,遍历每个控制流图,计算出每个函数中所有基本块的频率和边的频率,所述基本块的频率为其中每条指令的指令频率。其中,所述步骤SI具体包括记录着若干个连续的跳转指令,两条连续跳转指令中间的所有指令的频率都加1,则每条指令最后获得的频率即为该指令的指令频率。其中,所述步骤S2中随机采样时钟周期的方式为在时钟周期采样时,在采样周期常数P上加上一个随机数R,使得等效的采样周期为P+R+S-A,其中,S表示从硬件计数器溢出到真正进入中断需要若干个周期的中断偏移;当硬件计数器在中断处理程序中复位之后,中断处理程序返回到用户程序,在这个过程中,处理器需要A个周期去填充指令流水线使其达到完全开放的状态。其中,所述R为255。(三)有益效果 本专利技术通过对存储跳转历史记录得到寄存器进行采样,获得精确的细粒度指令频率,并且采样方法的资源开销低;通过使用随机采样方法,获得精确的细粒度时钟周期。结合细粒度指令频率和细粒度时钟周期,可以得到精确的细粒度CPI。附图说明图I是本专利技术实施例的一种基于CPU硬件性能监控计数器的CPI精确测量方法流程图;图2是本专利技术的方法和传统方法实验对比图。具体实施例方式下面结合附图和实施例,对本专利技术的具体实施方式作进一步详细描述。以下实施例用于说明本专利技术,但不用来限制本专利技术的范围。细粒度CPI由细粒度指令频率和细粒度时钟周期共同获得。本专利技术使用的方法仍然是对细粒度指令频率和细粒度时钟周期分别进行采样,然后结合两个采样,获得细粒度CPI0但在获取细粒度指令频率时,本专利技术对跳转历史记录进行采样,并通过一定的变换获得精确的细粒度指令频率。在获取细粒度时钟周期时,本专利技术使用随机采样的方式,克服采样过程中可能引起的系统误差,从而得到精确的时钟周期。最后将两种精确的相结合,得到精确的细粒度CPI。具体步骤如图I所示,包括步骤SlOl,对跳转历史记录进行采样,获取跳转频率,并根据跳转频率获得细粒度指令频率。很多处理器上都提供一种记录跳转历史记录的寄存器。例如在最新的Intel x86处理器上,有若干个LBR(Last Branch Register,历史跳转寄存器)寄存器,这本文档来自技高网...
【技术保护点】
一种基于CPU硬件性能监控计数器的CPI精确测量方法,其特征在于,包括以下步骤:S1:对跳转历史记录进行采样,获取跳转频率,并根据跳转频率获得细粒度指令频率;S2:使用随机采样时钟周期的方式得到细粒度时钟周期;S3:所述细粒度指令频率除以细粒度时钟周期,得到细粒度CPI。
【技术特征摘要】
【专利技术属性】
技术研发人员:郑纬民,陈德颢,陈文光,
申请(专利权)人:清华大学,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。