DoSERV服务器在线 3月29日原创报道:大约在35年前,同样也是一个四月,美国Argonne国家实验室应用数学所主任Jim Pool提出,应该建立一套专门解决线性系统系统问题的数学软件及其模型——直到现在,在一系列关于Linpack的纪年表中,Jim Pool的名字仍然高居榜首。随后,他在当年六月的一次学术会议上正式提出了自己对线性系统软件包(Linear system package),也就是Linpack的想法。在此之后,Linpack这一想法正式被美国国家科学基金会所采纳,Cleve Moler及其同时在没改过国家科学基金会的资助下,开发了Linpack和EISPACK的Fortan子程序库,这两个程序库作为解决线性方程和特征值问题的“法宝”代表了上世纪七十年代矩阵计算软件的最高水平。
国际上一般就是把用Linpack基准测试出的最高性能指标作为衡量机器性能的标准。之所以选择Linpack,主要是因为它使用广泛而且它的指标几乎可以在所有参加测试的系统上得到。虽然这些指标并不反映给定系统的全部系统性能,但可以作为对系统峰值性能的一个修正。
至目前为止, LINPACK 还是广泛地应用于解各种数学和工程问题。 也由于它高效率的运算, 使得其它几种数学软件例如 IMSL、 MATLAB 纷纷加以引用来处理矩阵问题, 所以足见其在科学计算上有举足轻重的地位。
但是,在高性能计算界已经有人对其提出了不同的看法,而这些质疑声音正在变得越来越强大,并正在动摇Linpack在高性能计算界的影响力。
Linpack的原理与特色
Linpack的出现基本上可以称之为力学(Mechanics)分析软件的鼻祖,并建立了数学软件的比较机制,与此同时,提供软件链接库, 允许使用者加以修正以便处理特殊问题,兼顾了对各计算机系统的通用性, 并提供高效率的运算——基本上来说,Linkpack代表了线性计算评价标准的最高水平。
事实上,Linpack现在在国际上已经成为最流行的用于测试高性能计算机系统浮点性能的benchmark。通过利用高性能计算机,用高斯消元法求解一元N次稠密线性代数方程组的测试,评价高性能计算机的浮点性能。
Linpack测试包括三类,Linpack100、Linpack1000和HPL。Linpack100求解规模为100阶的稠密线性代数方程组,它只允许采用编译优化选项进行优化,不得更改代码,甚至代码中的注释也不得修改。Linpack1000要求求解规模为1000阶的线性代数方程组,达到指定的精度要求,可以在不改变计算量的前提下做算法和代码上做优化。HPL即High Performance Linpack,也叫高度并行计算基准测试,它对数组大小N没有限制,求解问题的规模可以改变,除基本算法(计算量)不可改变外,可以采用其它任何优化方法。前两种测试运行规模较小,已不是很适合现代计算机的发展,因此现在使用较多的测试标准为HPL,而且阶次N也是linpack测试必须指明的参数。
HPL是针对现代并行计算机提出的测试方式。用户在不修改任意测试程序的基础上,可以调节问题规模大小N(矩阵大小)、使用到的CPU数目、使用各种优化方法等来执行该测试程序,以获取最佳的性能。HPL采用高斯消元法求解线性方程组。当求解问题规模为N时,浮点运算次数为(2/3 * N^3-2*N^2)。因此,只要给出问题规模N,测得系统计算时间T,峰值=计算量(2/3 * N^3-2*N^2)/计算时间T,测试结果以浮点运算每秒(Flops)给出。
Linpack的局限:浮点与线性计算
Cleve Moler所为人熟知的原因并非他对Linpack计算所作出的努力,几乎每一个数学系毕业的学生(包括我本人这个数学系毕业的不才学生),几乎对Cleve Moler的名字都十分熟知,因为他开发了对数学计算,尤其是计算数学产生重大影响的MATLAB:
到70年代后期,身为美国New Mexico大学计算机系系主任的Cleve Moler,在给学生讲授线性代数课程时,想教学生使用EISPACK和LINPACK程序库,但他发现学生用FORTRAN编写接口程序很费时间,于是他开始自己动手,利用业余时间为学生编写EISPACK和LINPACK的接口程序。Cleve Moler给这个接口程序取名为MATLAB。
MATLAB时至今日已经是一种用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,在数值计算方面无比强大,可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域??但是,在初期,无论是Linpack和MATLAB都是以线性计算为基础的,这从Linpack的原名即可得知。
另一方面,Linpack专注于浮点运算,首先,我们要明白,数和计算通常是按“整数”或“浮点数”进行划分的。整数计算使用计算的所有位(如32位)记录整数“值”。而浮点计算则使用计算的一部分位表示“值”(如23位),另一部分位表示指数(8位)。由于一部分位用来表示指数,所以浮点计算得出的值可以比整数计算得出的值大很多或是小很多。换句话说,对于给定数量的位,浮点计算的精度没有整数计算高,但浮点计算结果的范围却比整数计算大很多??后面我们随提及为何整数计算并非如人们所传言无所大用。
这也就是说,Linpack几乎可以被人做是一个面向数学计算领域的线性计算方法及评价标准,这也就意味着,尽管Linpack数据具有极强的评价能力,却正显得有些不合时宜了。
对于大部分高性能计算用户来说,HPC被用来进行大量的科学计算,所以对于诸如石油勘探、地质勘测、天气预报等用户来说,非常注重服务器的浮点计算能力,而对于整数运算能力却并不太关心,整数运算能力是指系统对于16位以内数据的计算精确度和速度,而浮点运算能力代表的是一个计算机系统对于16位以上数据的计算速度和结果精确度。所以,对于高性能计算机的用户来说,在采购服务器的时候,对于厂商提供的SPECfp2000浮点运算基准测试要给予重点关注,而对于一般的商业用户来说,一个计算机系统的浮点运算能力强或者弱,并没有太大的实质意义,这个用户群体更应该关注诸如TPC-C等在线事务交易处理性能。
另一方面,Linpack的出现主要是因为上世纪七十年代线性代数方程组在各个领域的应用十分广泛,所以该软件包就很自然地称为测试各种机器性能的测试程序,但是随着科学计算的深入,更多数学方法出现在人们面前,即使是线性计算方面的计算方法也获得了强大的发展。
更有甚者,尽管Linpack作为数学型的测试程序现在仍很有生命力,但作为实际求解线性代数问题的软件包甚至都已经开始落伍了:
1992年出现了代替Linpack以及EisPACK(特征值软件包)的LAPACK,它使用了数值线性代数中最新、最精确的算法,同时采用了大型矩阵分解成小矩阵的方法从而可有效地使用存储器。LAPACK是建立在BLAS1 ,BLAS2,BLAS3的基础上的,其中BLAS2执行矩阵-向量运算,BLAS3执行矩阵-矩阵运算。
随后出现的是ScaLAPACK,其被称为LAPACK的增强版,主要为可扩放的,分布存储的并行计算机而设计的。ScaLAPACK支持稠密和带状矩阵上各类操作,诸如乘法,转置和分解等。在国际上,ScaLAPACK例程可以加入多个并行算法,并且可根据数据分布,问题规模和机器大小选择这些算法,然而用户却不必关心这些细节。
高性能计算的更多基准测试方法
相较于Linpack,更多的高性能计算基准测试方法正在逐步应用到测试中,以更加可观的衡量和对比不同高性能计算系统在各种不同应用上面的性能特征。
以SPECfp_rate_base2006为例,其是一项计算密集型性能指标评测,用于衡量计算机系统在运行大量并行任务时的浮点吞吐性能。性能指标评测包括从实际最终用户应用开发而来的一组十四个浮点工作负载。通过将性能指标评测的拷贝数量设置成操作系统可识别的逻辑硬件内核数量而同时运行多个性能指标评测拷贝来测量系统吞吐率。报告的性能得分是按工作/小时测量的系统吞吐率的衡量标准。得分越高表示性能越好。
从分类上来说,综合型、核心型、数学计算型、应用型和并行计算型等,上面所说的SPEC计算与Whetstone和Dhrystone即属于综合型,不过在综合型中,后两种基准测试方法由于编译程序较为敏感,造成了对用户程序性能预测的不确定性,因此已经基本上被不同类型的SPEC计算所取代,SPEC最早是作为NCGA(National computer graphics association)的一个小组20世纪80年代创立的,第一组基准测试程序叫SPEC89,包含10个程序; SPEC92扩从到20个程序,6个整数程序,和14个浮点程序分别称为SPECint92,SPECfp92。随后SPEC又发布了一些新的基准测试程序(如SPEC95,SPEChpc96,SPECweb96, SPEC2000等)。SPEC原主要是测试CPU性能的,现在强调开发能反映真实应用(如实际负载等)的基准测试程序,并已推广至客户/服务器计算,商业应用,I/O子系统等。
数学计算型基本上可以等同于Linpack计算+FFT(FFT有浮点的(就是普通的FFT),有整数的(就是离散化的FFT)),而核心型的主要包括Livemore、Fortran Kernals、NASA NAS等,而并行的主要为NPB和PARKBENCK,具体的测试方式介绍在此就不在赘述,可以从http://www.netlib.org/liblist.html查到,可以在其中的“Benchmark Programs and Reports”页面看到比较全面的测试介绍。
非基准测试的不同评价体系
除了基准测试之外,也有许多的学者提出了对于高性能计算或一般计算系统的性能评价的不同体系,许多学者认为对计算系统的评价现在除了计算模拟之外,应该有更多的评价标准,在这一点上,其已经很难被称为传统的基准测试标准,而是对现实应用的需求的一种映射。
如果我们以一个国内兄弟媒体所介绍的实际的例子及结论为参照:将一个巨大空间(比如太平洋)划分成无数个小区域,随着时间的推移模拟大气、液体的流动,并且在超级计算机里,给每一个小区域或一组区域指定一个特定的处理器。
所能得到的结果会让我们发现,处理器的运算速度更高当然是好事,但是,当试验进行到结束近100年的气候模拟阶段时,处理器需要进行大量的内存访问,这时处理器就会变得慢得多。此外,有些应用需要处理器之间进行信息传递,这种情况下处理器速度也会相对下降。因此,对于实际操作中的许多应用来说,系统内部的通信网络带宽要比其单纯的浮点运算性能重要得多,这才是真实的商业应用(如在线搜索或交易处理)所迫切需要的。
除此之外,更大的问题在于目前所有程序一般都是串行指令,很难改成统一的并行指令。因此,如果一个处理器的工作量超标了,那么所有其他访问只能在一旁等待,从而降低了机器的整体性能。Linpack是以矩阵为最小单元,通过将每个矩阵都划成合适的大小,每个处理器都可以均衡的工作,从而得出超高整体性能的假象。
从目前的情况来看,问题的复杂性还远远超过于此:在实际应用中高性能计算仍然使用较低效率的串行算法,而非彻底的并行处理是造成问题的其中一个方面,同时,问题还出现于处理器的内存访问和对节点内部的I/O访问机制的瓶颈之上,目前,业界正在逐步改进问题,在2007年的IDF上英特尔披露了一项加速器计划,作为改善加速器连接的Geneseo架构,将能够减少软件开销、简化并增强操作系统支持以及减少硬件开销,同时,作为增强PCI-Express的下一代I/O设备架构,Geneseo架构未来的应用将首先进入Clearspeed、DRC、高性能计算应用等领域,因其在海量的数据运算、低延时的实时响应、固定算法功能领域的出色性能,数学密集型事务处理、可视化和媒体处理以及嵌入式内容处理领域都将是Geneseo架构的用武之地。
在计算系统中,我们实际上还面对着另外一个问题:对于一个计算系统来说,在不同类型的应用下所展现的性能是否是一样的?对于这个问题,我在前几天的文章《Nehalem:改变千万亿次计算的未来》中已经有所涉及,在此不再多言,不过需要注重提到的是,Nehalem架构的出现,对于高性能计算,尤其是未来的千万亿次计算的改变将是巨大的,??对于这一点来说,我深信不移。
我需要再次提到的是,之所以我们要不停地讨论高性能计算的评价体系与标准问题,其主要原因在于高性能计算对我们生活的影响和改变,随着越来越多的高性能计算系统被部署到如天气预报、在线交易、业务分析,甚至是网络游戏之中后,我们的生活已经与高性能计算变得不可分割了。
最后,十分欢迎大家对文章中的疏漏和错误提出观点,具体可以来DoIT论坛讨论,对于一个已经毕业了四年的数学系“不才学生”来说,对于Linpack和高性能计算话题的探索确实有点深,许多数学问题和理论知识都快还给老师了,在写这篇文章时,还手捧着一本《组合数学》在看,真是感谢出版社的老师们出版了这么精彩的一本书。