benchmark和性能评估综述
Benchmark和性能评测综述
1.简介
1.1性能评估标准
⽤户使⽤计算机的主要原因是使⼯作效率更⾼,更快的完成任务。这也是⽤户⾮常关⼼计算机性能的原因。
那么计算机性能评价的标准是什么?直到上世纪80年代后期,评价计算机性能的主要标准是MIPS(million instructions per second)和Mflops(million floating-point operations per second);通过计算每条指令在运⾏时的百分⽐,就可以得到这两个数据。但是这两个标准在评价不同的指令集体系结构就失去了意思,例如CISC体系结构和RISC体系结构,RISC指令⽐CISC 指令更简单更快。
但是,⼈们⼀直都想建⽴⼀个性能评测的标准,⽽现在公认的⽅法就是通过运⾏评测程序(我们也称之为benchmark),⽐较运⾏的时间来评价性能的好坏。
1.2关于评测程序(benchmark)
选择合理的评测程序是正确评价性能的基础,下⾯列出5种评测程序,他们评测的准确程序依次递减
1.真实的程序:虽然得到的结果最真实,但是经常碰到⼀些由于依赖操作系统或者编译器
⽽引起的移植性问题
2.修改过的程序:很多情况下通过修改真实的程序来构造基准程序,主要是为了两个原因:
要么增强可移植性,要么是为了集中测试某种特定的系统功能
3.程序内核:从真实的程序中提取出⼀些⼩⽽关键的程序⽚断来评估程序性能。程序内核
的最⼤⽤途就是分别测试机器的各项性能,以解释运⾏真实程序性能差异的原因。典型的是Linpack和Livermore。
4.⼩型基准程序:通常只有10-100⾏那么⼤,⽤户在测试前往往就知道了运⾏结果。
5.综合(synthetic)基准程序:也可以说是⼈造(synthetic)程序,取⼤量程序的指令和操作书出
现频率的平均值,与真实的情况差距最远,只是最早期的时候才有这样的评测程序。
然⽽因为机器的性价⽐关系到企业的兴衰,各企业都不遗余⼒的提⾼机器运⾏⼴泛使⽤的测试软件的性能,可是针对每个真实程序优化却是不太可能的。于是,将⼀些基准测试软件集中在⼀起来评测处理器性能的⽅法就⼗分的流⾏,它的优点是单独某⼀种测试软件的弱点会被另⼀种测试软件所掩盖。
1.3关于执⾏时间
但是怎么根据⼀组程序的运⾏结果综合的评价计算机的性能?下⾯是⼏个⽅法
总执⾏时间:最简单的相对相对性能综合评价⽅法就是⽐较⼏个程序的总的执⾏时间。对总执⾏时间取算术平均值,就得到平均总执⾏时间…
加权执⾏时间:总执⾏时间⽅法的问题是每个程序在⼯作负载中所占的⽐例可能并不相同,如果他们所占的⽐例不同,那么有两种⽅法可以近似评估机器的综合性能。
常用的java编译器有哪些第⼀种⽅法是为每⼀个程序赋予⼀个权值,将各个程序的权值和执⾏时间乘积加起来就是加权执⾏时间
第⼆种⽅法是将执⾏时间对⼀台参考机器归⼀化,然后去归⼀化执⾏时间的平均值。。。。
时间是评价性能的标准,但是对于计算机的⽤户和管理员来说,时间的概念是不同的。对于计算机⽤户来说,当⼀个程序在⼀台机器上运⾏⽐其他机器上运⾏的时间短时,⽤户认为这台计算机快,也就是响
应时间;⽽对于管理员来说,单位时间内完成的任务多的机器⽐较快,也就是吞吐量。但是关键的衡量标准还是时间,相同的任务花费的时间越少,速度越快,区别是单任务还是多任务。
1.4执⾏时间的组成
同时,也必须清楚到底是衡量的哪部分时间,执⾏时间可能有不同的定义。时间最直接的定义是也称为外部时钟,相应时间,指的是完成⼀项任务所需要的延迟,包括磁盘访问时间,内存访问时间,输⼊输出操作时间,操作系统开销,也就是所有任务
的执⾏时间包括在内。但是当多个程序同时运⾏的计算机中,当⼀个程序等待I/O操作完成时,CPU会转⽽执⾏另⼀个程序,此时计算机不⼀定会使每个程序经过的时间最短。这样,我们就需要另⼀个术语将这种情况考虑在内。CPU时间体现了这⼀区别,它指得是CPU计算耗⽤的时间,⽽不包括等待I/O操作完成或运⾏其他程序的时间。CPU时间⼜可细分为执⾏程序的时间(⽤户CPU时间)和完成程序执⾏所需的操作系统功能调⽤时间(称为系统CPU时间)。
了解CPU时间的组成也是⾮常重要,它可以指导我们通过对体系结构的改进⽽改进CPU时间。
CPU时间=⼀个程序的CPU时钟周期数*时钟周期长度
CPU时间=IC(指令数)*CPI*时钟周期长度
CPU时间和三个因素因素有关:时钟周期长度,每条指令执⾏所需的时钟周期数和程序的指令数。这三个因素对CPU时间的影响是相同的。这三个因素相关联的技术如下:
●时钟周期的长度—由硬件技术和计算机组成决定
●CPI—由计算机组成和指令集的系统结构决定
●指令数—由指令集的系统结构和编译器决定
⼏个因素中,指令集的系统结构和计算机组成是和体系结构相关的,所以对体系结构研究者来说,往往通过改进这两部分来改进CPU时间。
指令集结构设计有以下⼏个⽅⾯
●寻址模式:增加寻址模式能够明显减少指令数量,但是也增加了设计计算机的复杂度和
CPI
●操作数的⼤⼩和类型:这影响到指令的长度。
●指令类型:增加新的指令可能因为减少指令数提⾼性能,但是也可能因为增加时钟周期
长度⽽降低性能
●控制流指令:现在的很多处理器通过深度流⽔来提⾼时钟频率,分⽀失败的代价随着流
⽔线深度加深⽽增⼤,所以控制流指令和分⽀预测当然也值得注意
●指令集的编码:应该在下⾯⼏个因素之间到平衡,希望有尽可能多的寄存器和寻址模
式,尽量少增加指令的长度,使程序尽量⼩,指令的长度易于流⽔线处理。
。。。(可能有遗漏)
计算机组成包括下⾯⼏个⽅⾯
●是否流⽔线
●是否动态调度
●是否多发射
●分⽀预测技术
●。。。(可能有遗漏)
当然我们评价的可能并不只是CPU的性能,⽽是包括存储层次在内的总体性能,那么需要⽤CPU执⾏时间⽽⾮CPU时间来评价
CPU执⾏时间=(CPU时钟周期+存储器停顿周期数)*时钟周期时间
存储器停顿周期数=缺失次数*缺失代价
=执⾏指令数*缺失次数/指令数*缺失代价
=执⾏指令数*存储器访问次数/指令数*缺失率*缺失代价
缺失率是cache设计的最重要的指标之⼀
上⾯所说的都是影响执⾏时间的⼀些重要的因素,⼈们常常通过运⾏benchmark通过分析这些因素来得到系统性能好坏的原因,我们在后⾯将看到很多论⽂中对他们的分析。
1.5 影响性能的⾮体系结构因素
●编程语⾔
经常使⽤的⼏种语⾔是Fortran,C,C++,Java,每种语⾔的特性造成了性能的差别。例如调⽤顺序,指针语义,字符串语义,⾯向对象的语⾔的⼀些特点都会影响执⾏时间。
●编译器
⾼级语⾔是通过编译器转化成机器代码,所以编译器的对性能的影响是⾮常⼤的
●系统库实现
benchmark⼀般来说都需要调⽤系统函数库,有的benchmark在库中花的时间⾮常多,例如Whetstone达到了40%-50%,所以系统库实现的效率也会影响性能。
2.benchmark介绍
2.1早期的benchmark
2.1.1 Whetstone和Dhrystone
历史上第⼀个benchmark是于1976年发布的Whetstone。它是前⾯提到的第五类也就是综合测试程序。
Whetstone是Fortran语⾔编写的,由⼏个模块组成,每个模块包括⼀个特定种类的语句,例
如整型操作,浮点操作,if语句,calls语句等等。它有很多的浮点数据和浮点操作,同时由于有很多的循环,所以代码的局部性⾮常⾼,指令cache命中率将近100%。
跟Whetstone类似的是Dhrystone,他们是最有名的两个综合测试程序。
下⾯两个表分别是对Whetstone和Dhrystone程序中⽤户代码中各个函数以及库函数所占时间的⽐例
2.1.2Linpack和Livermore Loops
Linpack是第⼀个内核级的测试程序,也就是上⾯提到的第三类测试程序,于1976年发布。按照作者的说法,⼀开始并不是想作为⼀个benchmark发布,只是收集了fortran程序⾥⾯常⽤的线性代数算法。
Linpack程序中很有很⼤规模的矩阵,⼤量的浮点运算。由于⼤量的时间花在⼀个函数执⾏中,所以很⾼的指令局部性,但是⼏乎没有数据局部性。同时对cache的配置⾮常的敏感,不同的数组会导致数据在cache中不同的分布。
Livermore Loops包含24个内部循环,都是从物理学计算中提取出来的,程序中有很多的浮点操作和对
数组的访问。
下图是对Linpack程序各函数所占时间分析
2.1.3 其他的早期的benchmark
2.2 benchmark的发展
随着编译技术的发展以及各个企业针对测试程序进⾏的优化,以前的⼩的测试程序已经不能正确反映机器的性能。例如SPEC89⾥⾯的Matrix300性能因为编译器优化⽽提⾼的⼏⼗倍。所以普遍的趋势是修改真实的程序来作为benchmark。
同时计算机应⽤的范围也越来越⼴,服务器,⾼性能处理,多媒体等等,它们的程序⾏为是不同的,所以benchmark也表现出了多样化的趋势。
2.3 主流的benchmark(不知道这样的标题合理不)
下⾯对每个benchmark的介绍⼤都围绕⼏个问题
●这个benchmark是⽤来做什么的
●⼤概包含了哪些应⽤
●测量了哪些部分的性能,没有测量哪些部分的性能
●评估性能⾼低的标准(metric)是什么
●为什么新的版本要替换旧的版本
下⾯所有图表和数据都是摘⾃论⽂中,具体的配置请参照原⽂。
2.3.1 桌⾯应⽤
桌⾯应⽤的特点:复杂的控制指令,好的指令和数据的局部性
1)SPEC CPU
SPEC 是最成功的标准成套测试软件之⼀,它是在20世纪80年代末期为了评估⼯作站性能⽽产⽣的。⽬前SPEC和基于它开发出来的测试软件已经基本覆盖了各个不同的应⽤领域。SPEC CPU是SPEC的桌⾯应⽤测试程序。SPEC的基准测试程序是从真实的应⽤中提取出来,并且提供源码使其可以在不同的UNIX⼯作站上编译运⾏。SPEC89是SPEC CPU最早
的版本,得到了⼯业界的认同。但是随着处理器,编译器,计算机系统(原⽂是system,不知道对不对)的迅猛发展,测试程序也是需要不断发展的。到现在已经发展到了第四版:SPEC CPU2000,最开始的叫SPEC89,中间经历了
SPEC92,SPEC95。
作为⼀个计算密集型的benchmark,SPEC CPU测试处理器,存储层次和编译器的性能,但是并不测试I/O,⽹络和图形显⽰的性能,SPEC程序特意精简并且最⼩化程序的I/O活动。SPEC CPU根据⽤户的需要测试性能的不同的⽅⾯,可以以单个程序响应时间或者吞吐量作为性能评价标准。同时,编译时可以选择”conservative”和”aggressive”两个参数,conservative 表⽰编译器的通常的优化参数,⽽aggressive表⽰最佳性能的优化参数。
SPEC CPU的程序是在不断更新的,主要表现在下⾯⼏⽅⾯
●运⾏时间:有的benchmark运⾏的时间太短,有的部分稍作改变对性能影响就很⼤。●应⽤的⼤⼩:实际的应⽤的⼤⼩和复杂度都是在不断增加的,基准测试程序应该跟随其
发展。
●应⽤的类型:SPEC感觉到应该有更多类型的应⽤应该加进来。例如从SPEC92到
SPEC95增加了图像压缩和数据库的基准程序
●可移植性:SPEC发现benchmark和运⾏benchmark的⼯具跟操作系统⽆关是很重要的,
但是⼀开始的SPEC CPU是针对UNIX的,并且特意选择依赖POSIX和ANSI标准开发环境,SPEC将增加针对其他操作系统的版本。
●不断更新程序:SPEC⼀直是希望在⼀个benchmark上性能的提⾼能代表着整体性能的
提⾼,但是随着竞争越来越激烈,可能有的提⾼只是针对某个程序。通过不断更新程序,希望优化能够针对性更弱。
●特殊的程序:有的程序因为编译器优化或者其他原因导致性能变化太⼤,不能表现实际
的性能,需要删除。例如SPEC89⾥⾯的Matrix300因为编译器优化性能达到了10倍,所以在SPEC92中没有出现。
上图是SPEC2000中包含的应⽤
2)其他桌⾯应⽤的benchmark
其他我所见到的桌⾯应⽤⼀般都是第三类也就是程序内核级别的,提取⼀些很经典的算法。有Linpack,BYTEmark。。。
2.3.2 java client/server
1)java技术相关
Java技术拥有”write-once-run-anywhere”的特性,他的基⽯是Java虚拟机(Java V irtual machine -JVM)技术。Java虚拟机是在硬件平台上⽤软件实现的,在Java程序运⾏之前,Java虚拟机必须在⽬标平台在上安装好,正因为Java虚拟机可以在不同的平台安装,所以才提供了Java 程序的可移植性。java程序编译后变成字节码(Bytecode)组成的⽂件,字节码可以看成是运⾏在Java虚拟机上的指令。
指令集体系结构的最根本的区别在于CPU内部的存储类型有堆栈,累加器和寄存器。Java 虚拟机使⽤的是堆栈,也就是所有的操作数在使⽤之前都要放到栈顶。