
己亥年,鲲鹏的关注度也过去了。写点科普,也不会扯上泄密啊,趁热点喷起来之类。
关于SPECINT2006,有时候缩写为SPECINT2K6。嗯,菊厂的鲲鹏920跑了多少分什么的,我一概不知,也不会提。这里主要谈一谈benchmark本身,因为很多帖子都吵得不可开交。牛顿定律说得好,不同的参照系下面相对速率各不相同,所以统一参照系是关键。
SPEC是一个开放组织,网页链接如下。
SPEC包含了一系列的benchmark,包括SPECINT,SPECFP,SPECJBB,SPECPOWER,SPECAPC等等等等,不同的benchmark有不同的测试目的,当然最出名的是SPECINT,这是对general processor,也就是CPU的通用性能的评判。其他benchmark当然也各有价值,有需要可以另谈。
SPECINT有2006和2017两个版本,版本的变化体现了业界广泛的业务形态的典型性的演进,毕竟benchmark要有足够的代表性才有评测的价值。从2018年Q3开始,SPEC网站就不允许specint2006的数据上传了,不过因为Specint2006和specint2017的绝对分值相差较多,而且specint2017缺乏以前的历史数据,所以现在业界大多数时候做性能比拼还是基于SPECINT2006,参照系比较清晰,或许再过几年数据积累起来,就会逐渐以Specint2017为标准了。总得来讲,specint2017和specint2006的测试目标和趋势是相近的,不过specint2017也有一些故事,例如分值上specint2017也是specint2006的1/6左右(分数向下走总让人心里不舒服),但这都是另外的话题了。
从spec网站我们可以点击benchmark选择获得系统厂商上传的分数,都是公开的。这里我们着重关注一下SPECINT RATE,这表示的是一个CPU整系统的总分数。
目前intel的server CPU的最新架构是SKYLAKE,最顶端的型号是白金版本8180,28核56线程2.5GHz,大约是$10000每颗,顺带截图第三行中有黄金版6148是发货量相对比较大的主力版本,20核40线程2.4GHz,大约是$2500。8176算是8180残疾版,会比8180稍便宜一些。
截图是2018Q1的数据,谁都能查到。怎么看这个截图呢,解释一下,这三台设备都是思科的硬件,copies代表SPECINT2K6跑了多少份,其实也就是VCPU数量,也就是整系统有多少CHIP,每个CHIP多少CORE,每个CORE多少线程,乘起来即可。第一行的8180是2S系统,单片28x2=56线程,到2S系统56x2=112总线程(copies),后两行的8176和6148是4S系统,所以后两行核多总分高,很容易理解吧。具体到分数,base是系统统一配置测试全部子项的分,peak是每个子项独立调优,配置各不相同的分。理论上我们只看base,因为peak那种调法,用户没法重复,真实业务也没法搞,属于洗煤炭的无用功。
SPECINT2K6在多socket下基本线性,所以我们可以得到单芯片下8180是1390分,8176是1218分,6148是965分。
分数很高,对吧,这也是和鲲鹏发布造成很多争执的地方。
原因在于,SPEC网站上传的分数都是基于INTEL ICC编译器的,ICC又被戏称为benchmark compiler,你懂的( ̄∀ ̄)
为什么SPEC网站没有GCC 编译器的分数呢?这是一个缺乏监管导致劣币逐良币的结果,你懂的( ̄∀ ̄)。业界做评测的人都很清楚,所以往往使用X86会额外用GCC再次进行评测,费时费力。
ICC其实是一个很好的编译器,它针对X86每代微架构都有很多针对性的优化,一些编译器领域的新技术也都是ICC在领先采用,对比起来,GCC虽然开源,但很多老maintaner技术守旧,更新缓慢,甚至LLVM都表现得比GCC更优了。
曾经评测过ICC,如果不看benchmark数字,在一些传统的网络转发和数据库业务上,ICC在X86服务器上能够获得大约10%到20%的纯收益,非常诱人,但业界真正用ICC的人还是不多,一个问题是 ,ICC需要额外付费,M$量级,另一个问题是debug和兼容性。ICC的优化幅度很大,其o2选项使能了大量GCC o3选项以上的特性,这样编译出来的汇编可读性很差,还有很多普通程序员,对CPU的ordering理解也不够深入,很多代码其实是有顺序性bug的,但用GCC保守编译顺序执行了并不会引发错误,而一到ICC就跑飞。这是血淋淋的教训。
回到specint2006,先看一张图,这是前面8180测试项,点击HTML格式得到的图面。
各个子项分数都是在1000~3000之间变化,除了一个libquantum怪胎是50900分,是其他项目的20倍! SPECINT的设计者是不是脑子发烧了,设计一个评分怪异的子项目?肯定不是!事出反常必有妖!
先说结论,intel同一款芯片SPECINT2006的ICC分数是GCC分数的约1.8~1.9倍。刚才也说了,同一款芯片ICC在业务性能评测上是GCC的1.1~1.2倍。所以这1.8~1.9倍的收益,对于用户来讲基本上是拿不到的,这也是ICC被称为benchmark compiler的原因。
光嘴皮子这么说肯定不行,我们可以再进一步看看是什么带来的这1.8倍提升,看看是不是业务性能真的拿不到?
第一个关键项是AVX,AVX是intel的向量及浮点运算加速的指令。向量指令能够大福提升CPU Load/Store的效率,一些向量的运算也能大福提升运算效率,所以AVX对计算和访存密集型业务有很大收益,典型就是libquantum量子计算。当然GCC也有AVX开关,但是很明显其收益远远小于ICC。有人会问,AVX指令是intel的有效指令,能用而且用的好那是本事。没错,先不谈ICC额外收费的问题,你知道使能AVX,8180的基本频率会降低到2.0GHz么?这其实是一个隐含的配置项,CPU降频会影响很多非访存密集的业务。为什么benchmark其他子项没有受到影响? 因为不同子项是独立编译并且独立运行的,用户的一个完整业务能够拆成很多子业务独立编译独立运行吗? 不能啊。
第二个关键点就是parallel选项了,这个怎么说呢,我的观点就是赤裸裸作弊了,但我不明白为什么SPEC网站允许,因为这个选项已经背离了specint测试项的测试目标本身。parallel选项的机制是调用OPENMP库,把一个任务中可以并发的代码都包装成独立的子任务并让众多的子任务并发运行。简单举例,ICC下表面上你在测试单核性能,实际上ICC会调用更多的核来并行执行众多的子任务。那这样测试的结果有意义么? 以前面的8180测试为例,理论上我们期望有112个copies在并发,但ICC的parallel会编译出数千个子任务并发。这确实是编译器上了不起的技术,但已经超出了SPECINT原本的测试目的,也不是能够让绝大多数用户获得的收益。
over
intel有ICC,AMD有AOCC,其实ARM也有ARMCC,也能做类似的事情。但benchmark的用途是给用户建立性能参照体系而不是相互割裂跑一个虚高的数字。所以我们应该回到benchmark的原点,统一参照系。
统一用GCC -o2,去掉那些额外的option,这也是业界用户的主流用法。当今典型的处理器分数其实如下(此时libquantum的分数和其他子项是相近的),若有疑问请自行测试,欢迎挑战。
intel skylake 8180v5 28核 ~750
intel skylake 6148v5 20核 ~550
AMD Zen1 7601 32核 ~700
Qualcomm 2400 48核 ~650
Cavium TX2 32核 ~750
飞腾 FT2000 64核 ~600
鲲鹏? 嗯,我不想提 (ΘへΘ)
不过呢,今天今日,SPECINT跑分最高的CPU单芯片,应当是AMD的ZEN2 ROME,ROME相比ZEN1 7601从32核翻倍到64核,但可惜内存带宽并未翻倍,而且内存延迟有较大的增加,所以预估是~1200分。
