程序性能数据获取与分析技术

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

程序性能数据获取与分析技术

*车永刚1 王正华1 李晓梅2

(1国防科大并行与分布处理国家重点实验室 长沙 410073

2怀柔装备技术指挥学院 北京 101416)

*light_new@

摘要分析比较了已有的各种程序性能获取与分析技术,重点考察了使用硬件计数器来获取性能数据的技术,并介绍了微机上可用的两种工具——Vtune和PAPI。

关键词性能数据获取;硬件计数器;Profiling

1.前言

应用程序质量好坏的一个重要指标是它在目标计算机上的性能。高性能不仅意味着问题求解时间的减少和开销的节约,还使某些对时间紧迫的任务变得可能。因此,应用程序实际性能的提高是人们非常关心的问题,大规模科学计算程序更是需要针对目标平台进行高度的性能优化。

现代高性能微处理器广泛采用多流出、深度流水、乱序执行、自动动态前瞻(speculation,或称推测执行)等技术,再加上多级存储层次的使用,大大提高了性能。但是程序实际获得性能与机器峰值性能之间却相差很远。实际上,硬件优化的范围还很有限,更加高级和稳定的优化来自优化编译器,而编译器优化有赖于精确的轮廓(profile)信息来验证变换的代码,需要更加高级的性能数据获取与分析工具[1]。正是随着一些高级性能分析工具的出现,使得一些高级的性能优化技术能够实现,如动态优化(Dynamic Optimization)[2]等。

一般来说,性能分析工具应该能回答或帮助程序员回答以下问题[3]:

(1) 程序性能如何?即对程序性能的总体评价。

(2) 程序在性能方面的主要问题在哪里?将性能问题与程序单元(函数、循环或者基本块、指令地址等)相关联,即性能瓶颈的定位。

(3) 引起程序性能瓶颈的主要原因何在?找准原因,才能对症下药。

本文主要探讨获取性能数据的各种方法与系统,并重点介绍了Wintel平台上可用的上两个工具:Vtune和PAPI,并就它们的使用作了一些研究。

2.性能数据获取与分析技术

2.1 静态分析

静态分析就是从源程序出发,结合目标计算机的体系结构进行分析,预测程序的性能。这种方法的代表有:

Cache不命中方程(Cache Miss Equation,CME)[4]:Princeton大学的Somnash Ghosh等提出,他们从源程序出发,结合存储层次模型参数,得到一组丢番图方程,求解之得到循环嵌套的cache不命中次数等指标。他们将这种方法应用于循环置换、数组Pad和循环分块等优化方法选择及参数选取中。

Modal性能模型[5]:这种模型基于对Cache和TLB行为的静态统计分析程序的存储性能,并用于指导对C与Fortran程序的bucket分块优化。

Pure-C 开销模型[6]:由Katajainen等提出,开始只是简单地统计程序中的各种指令操作来估计程序的执行时间。经过Bojesen、Katajainen、Mortensen等人的精化,能够预测cache不命中和分支预测错误数[7]。

此外,Xavier Vera等也提出了基于分析的方法来预测cache命中率[8],对Spec95中的applu 程序,其cache命中率预测取得了较好的准确性。Hanlon等建构了一个在矩阵相乘期间的cache

不命中的分析模型[9]。

静态分析方法的优点:在简单情况下能够获得具有一定准确性的结果;速度快,适合于在编译时使用;程序和机器的各种参数能方便地调整。

静态分析方法的缺点:由于性能函数依赖于很多变量(系统结构、数值算法、数组大小等),各变量之间关系复杂,分析的准确性难以保证;优化编译器一般要对源程序进行各种变换,静态分析很难反映这种情况,预测准确性更值得推敲。

2.2 简单计时

测定程序中指定部分或整个程序的执行时间,是最常见的性能分析方法。各种编程语言中一般都提供获取系统时间的例程,用户可以在应用程序中插入取时间函数调用来获得时间。使用UNIX系统上常见的time命令,也可以获得程序执行的墙上时间、CPU时间、系统时间等。

计时方法的优点是所获得的时间准确性较高,在进行优化前后性能对比时很有用,并且能够帮助程序员定位性能瓶颈。但是,它不能给出性能为何如此的原因。所以,在高级性能优化过程中,还需与其他工具配合使用。

2.3 基于时间的profiling

基于时间的profiling也是一种计时。在程序执行前(如编译时),对可执行程序进行instrumentation(在应用程序中插入特定代码),应用程序执行期间收集程序各个函数的执行时间。Gprof就是这样一种工具,在Linux上如下使用:

(1)编译时候使用 –pg 选项:f77 –pg –O –o app app.f

(2)以正常的方式执行程序app

(3)使用gprof创建profile:gprof app > app.prof

app.prof是一个文本文件,其中包含应用程序的性能数据。

另外,Compaq Visual Fortran中的profliler等也能进行基于时间的profiling。

2.4 模型模拟

模型模拟方法以经过某种编译变换得到的程序、程序执行获得的trace(踪迹)数据、或者直接是可执行程序为输入,在一个性能模拟器(通常实现了计算平台的微体系结构)上执行它,通过此模拟器收集性能数据,并进行分析。如威斯康星大学体系结构研究工具集WARTS中的Dinero Ⅲ是Trace-driven的模拟器,SimpleScalar[10]是一个Execution-driven的模拟器。在[11]中,采用模拟方法来对数据并行和消息传递并行程序进行性能预测。

模型模拟方法的优点是:使用灵活,允许在大范围内改变参数,能够在计算平台可用前就进行验证;可以进行反向映射,即将性能问题与程序代码相关联。

模型模拟的主要缺点是执行速度比真实程序慢得多,难以在编译时使用;另外,由于对计算机系统完全模拟的困难,性能数据的准确性也难以保证。

2.5 使用硬件性能计数器

(1)硬件性能计数器[12]

硬件性能计数器(hardware performance counter)是处理器中一组特殊的寄存器,这些计数器或者计数事件,或者测量事件持续的时间。这里事件指的是与处理器功能相联系的一些信号的发生,监视这些事件可获得应用程序性能的细节信息。

大多数现代微处理器上都提供了硬件性能计数器。如Intel Pentium和P6处理器都包含两个40位的性能计数器,使得能够同时监视两个事件。Intel体系结构处理器中还定义了一个时间戳计数器(time stamp counter,TSC),并提供RDTSC指令读取TSC,用来监视处理器事件发生的相对时间。AMD Athlon处理器也提供4个48位的性能计数器、TSC和RDTSC指令。在Intel IA-64架构的处理器中,至少提供4个性能计数器与4个性能计数器溢出状态寄存器,并在体系结构上为操作系统进行性能监视器上下文切换提供支持。

性能计数器监视的与处理器性能相关的事件分为以下几类:

• 基本事件:时钟周期、引退指令

• 指令执行:指令译码、流出、执行,数据与控制前瞻,存储操作

• 周期统计事件:停顿和执行周期细分

相关文档
最新文档