程序性能数据获取与分析技术*车永刚1 王正华1 李晓梅2(1国防科大并行与分布处理国家重点实验室 长沙 4100732怀柔装备技术指挥学院 北京 101416)*light_new@摘要分析比较了已有的各种程序性能获取与分析技术,重点考察了使用硬件计数器来获取性能数据的技术,并介绍了微机上可用的两种工具——Vtune和PAPI。
关键词性能数据获取;硬件计数器;Profiling1.前言应用程序质量好坏的一个重要指标是它在目标计算机上的性能。
高性能不仅意味着问题求解时间的减少和开销的节约,还使某些对时间紧迫的任务变得可能。
因此,应用程序实际性能的提高是人们非常关心的问题,大规模科学计算程序更是需要针对目标平台进行高度的性能优化。
现代高性能微处理器广泛采用多流出、深度流水、乱序执行、自动动态前瞻(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.profapp.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个性能计数器溢出状态寄存器,并在体系结构上为操作系统进行性能监视器上下文切换提供支持。
性能计数器监视的与处理器性能相关的事件分为以下几类:• 基本事件:时钟周期、引退指令• 指令执行:指令译码、流出、执行,数据与控制前瞻,存储操作• 周期统计事件:停顿和执行周期细分• 分支事件:分支预测• 存储层次:Cache的访问情况• 系统事件:操作系统监视器、指令与数据TLB(2)使用性能计数器的Profiling使用性能计数器的profiling一般先对应用程序进行instrumentation,然后执应用程序。
在执行期间,通过所instrumentation的代码配置、启动、停止、清除和读取性能计数器,获得详细的性能数据。
此外,也可通过采样的方式来使用处理器的性能监视硬件,采样可以通过硬件计数器溢出、时钟中断等触发软件中断来实现,如在DCPI中,采样计数器溢出时候进行。
为了允许用户级别对性能计数器的访问(通常是禁止的),需要操作系统提供事件监视设备驱动程序来包含初始化、启动、停止和读取性能计数器。
已有的使用硬件性能计数器来进行profiling的系统有:DCPI[13]:Digital公司的持续轮廓分析工具。
PAPI[14]:访问性能计数器的标准化的API。
PCL[15]:跨平台的访问性能计数器的接口,与PAPI的高级接口非常相似。
Vtune[16]:Intel的集成的性能优化环境,能够访问硬件计数器。
SvPablo[17]:对应用程序进行浏览其性能数据的图形环境,通过PAPI工具包实现到硬件性能计数器的接口。
Rabbit[18]:Linux上的性能计数器库,提供从C语言中访问x86处理器中性能计数器的例程。
(3)优缺点优点:使用硬件计数器极大地增强了profiling数据的质量与可靠性,扩展了可以独立或者相关联测量的事件集合[19];速度快,系统开销很小[20, 21];一般能进行全系统范围的profile,并能够对不同粒度的程序单元进行profiling。
基于硬件计数器的profiling是实现动态优化的基础。
例如,cache优化经常要求程序数据访问的详细的时间信息,传统的获取这种信息的技术非常昂贵,在动态优化系统中难以使用,而基于硬件计数器的profiling开销很小且数据准确,能满足动态优化系统的要求。
Intel公司的动态优化项目就依赖于使用性能计数器来紧密地监视应用程序执行时的运行时行为[2]。
缺点:所获得的数据与体系结构相关,体系结构参数不可调;由于计数器数量有限,限制了程序一次执行中可以获得的性能信息的数目,对大型应用程序,获得足够的性能信息需要很长时间,通过时分复用(multiplexing)计数器可以部分解决这一问题[12];事件打滑(event skid):由于指令多流出、乱序执行、深流水线等因素,所采样的程序计数器值会与引发事件的指令地址不一致,如在P6处理器上,Vtune的事件采样会被记录在距引发该事件的指令5~10条指令处。
3.Intel Vtune和PAPI介绍3.1 Intel Vtune[16]Vtune是Intel为在Intel处理器和Microsoft Windows平台上开发高性能软件而提供的集成性能优化调整环境。
Vtune收集、分析与提供体系结构相关的性能数据,将这些数据与应用程序或操作系统例程相关联,并图形化地显示。
在NT上,它能够访问处理器的硬件计数器。
Vtune能够在性能分析的基础上对C、C++、Java或者Fortran程序的优化提出建议。
目前Intel已经发布了Vtune 6.0。
(1)基本的性能分析Vtune通过下列四种方式来获得程序的基本性能数据:基于时间的采样(Time-based Sampling,TBS)TBS以固定时间周期进行采样,监视系统上所有活跃的程序,收集其性能数据(主要是各个进程所占时间百分比及选定监视的程序中各个范围的指令执行时间的百分比),然后Vtune性能分析器(Performance Analyser)对其进行分析,并提供系统活动情况的详细视图。