这个话题从我知道安卓开始就发现提的很多,这个问题要考虑的点很多,甚至很多时候不是一两个测试软件或者一两个理论就能解释清楚的,无论是很多人提到的Geekbenchmark还是SPEC CPU测试,有其准确性也有其不准确性,但是,如果我们往深层次研究一下,结合这些跑分软件的测试方式,其实可以一窥手机(更多指ARM)与PC(多指X86)的现在的差距,
从处理器架构来说,目前Intel作为X86处理器代表,其最先进的架构为Skylake(衍生Kabylake和Coffeelake,区别基本没有)/Skylake-X(改进uncore部分和互连结构,增加新的ISA扩展指令集),其基本架构如下
从上来看,SKL架构的点很多,即使是SKL-X和SKL都有一些区别,但我们先记住以下几条
1,前端指令解码为5条(decoder 5),分支预测单元合作的uop Cache为6
2,out-of-Order windows也叫ROB条目数为224,Sheduler条目97
3,后端执行单元挂在8个端口上,为port0到port7,VEC向量单元位于port0,1,5(这部分将是峰值计算性能的体现),VEC之外的为4个ALU负责逻辑计算和LEA JMP(偏移地址和跳转),他们可以使用4个端口
4,有四个端口与内存子系统相关,也就是port2,3,4,7
5,SKL-X有每核心1MB L2,SKL为256KB,并且拥有一个AVX 512 FMA专用运算器,Intel处理器流水线级数为14级
接下来是ARM A75架构
这里可以简单看出出,ARM A75与SKL的差距
1,前端解码为3(decode 3),执行NEON向量或普通计算
2,执行的单元8个,三个为向量,2个为int,2个为 AGU L/S,另外一个双倍的分支器处理分支跳转和预测
3,NEON向量单元有三个,但一个为Store而不能进行直接计算
4,处理向量计算流水线应该有13级,标量为11级(这一定程度说明X86和ARM的流水线步骤是接近的,但X86处理器频率却还能非常高)
严格来说,A75的架构只是SKL的缩小版,固然规模上有差距,但是实际上不是那么大,比如Sandybridge的后端也仅有6个端口,Haswell的前端解码也只有4条指令解码能力,而这十年X86的IPC提升如下
加上SKL的10% IPC提升,实际上10年来 X86的每核心IPC提升都在以10%提升,累积将IPC提高了接近一倍,所以你说ARM的IPC有X86的80%,我可能也不会太怀疑,再怎么着,10年多来Intel也不过是将其IPC翻了一倍,如果ARM只有X86 50%的IPC,那直接就可以说ARM是X86 PC 10年前的水平了。
但是这里有另一个问题,那就是指令集架构不同,精简指令集顾名思义,就是将一些复杂度高,指令解码,执行的难度高的指令舍弃,换取更快的指令执行速度,也就是说,ARM本身执行简单指令的能力就比X86平均水平要高才对,当然这些年ARM与X86相互学习,ARM的复杂程度已经在不断接近X86,X86也采用了很多原本RISC的特性
现在就是另一个问题,X86的指令比ARM复杂在哪,这我就要拿出SIMD向量指令集出来了,最显而易见的是,X86的主流系列(i3以上),从Haswell开始支持AVX2 FMA指令集,SKL-X/SP/W/EP/D支持AVX-512指令集,其在于一次执行组合浮点或整数计算位宽达到256bit(AVX2)512bit(AVX512)的计算,我们再回到SKL的架构,
普通版SKL支持AVX2 FMA,更重要的是其有两个融合乘加运算器,其实现了双发射256bit向量融合乘加浮点计算能力,最高可支持每周期32次32位浮点数计算或16次64位浮点数计算(计算方法为256X2X2/32,融合乘加一次等于两次乘加浮点运算+双发射256bit位宽),AVX-512版本则可以翻倍,达到64次32位浮点数计算和32次64位浮点数计算/每核心/每周期
我们再看ARM,
ARM同样拥有SIMD指令集,也叫NEON指令集,A75有两个FP运算单元,ARMV8A开始支持了双精度浮点计算能力,但是问题在于,其仅支持128bit向量位宽计算,在A72时期,进行128bit向量还需要两个64bit neon组合在一起执行128bit向量计算,实现1X128 FMA峰值(A15开始ARM支持FMA),也就是8个32位浮点或2个64位浮点(A72还不支持直接打包双精度数,以标量FMA的形式完成两次双精度浮点计算),从这里可以看出频率更低的ARM处理器,即使是每周期的向量计算能力都远远落后于扩展后的X86,8次32位单精度计算能力峰值VS 32次32位单精度浮点计算峰值的HSW/SKL/CFL,那8次单精度计算的向量性能是X86什么时代的水平呢?其实就是SSE指令集了,SSE指令集于1999年推出,128bit向量位宽,SSE2(2001)将向量支持扩展到双精度计算,掐指一算,已经17年了,最后一代SSE处理器是一代酷睿i,距今正好10年。
换句话,X86一次解码一个带着512bit数据的指令,还要做乘加融合,还能跑出3Ghz以上,ARM一次指令只能带着64bit数据的去说:嗨,X86,你IPC快被我追上了哦,请问有什么意义吗,由于手机还受到工艺,晶体管密度和功耗限制,频率也比X86低一截,所以比IPC其实意义不是很大
说完这些,肯定很多人会说,ARM落后X86十年没跑了,其实也不能完全这么说,峰值性能只是一个方面,SSE和SSE4都是128bit向量位宽,你能说SSE4和SSE没区别吗,新的时期的指令集,对应到硬件上是更成熟的架构和运算单元和高效的流水线架构,意味着其可以加入更多数据转换,复杂算式的直接执行指令,更好的扩展,广播,复制指令和更低的延迟,这都是对性能有帮助的,不能简单以峰值吞吐为唯一依据。
说完理论,就来实际看看,很多人会提到跨平台跑分软件Geekbench4,有的人对此不屑,认为夸大了ARM的性能,也有人认为这是一定程度的反映,那实际如何,我们先看看Geekbench4跑了什么
GB4测试分,加密解密测试(AES),整数计算负载。浮点计算负载和内存测试
整数计算负载有LZMA,JPEG,HTML5,LLVM(编译性能,是指编程的时候的编译程序的能力,不是指跑编译好的程序能力,)PDF等等,不一一读了,浮点主要是GEMM(一般乘法矩阵,适合SIMD向量指令集的项目),FFT(快速傅里叶变换),N体模拟(宇宙天体运行模拟),Ray Trace(光线追踪)等等,不一一讲了,内存测试我们暂时放一边
很多人有一个错误,就是从某个项目来看某个处理器适合什么,不擅长什么,却忽视了这个项目的计算是基于什么指令集编译计算的,如果一个处理器AVX性能很强,你给他跑个MMX或者SSE的程序,然后发现性能没比对手高多少,就说XX不擅长渲染,这也是不客观的,好在GB4官方详细告诉了我们部分项目是基于什么指令集的
比如GEMM和FFT就使用了AVX2指令集和ARM V8 NEON指令集,这可以说是双方最强指令集了(当然AVX512还没有)
但是部分项目其实过于日常和轻量,也难以使用高向量化的指令集用于密集计算,这也使得ARM与X86的差距快速缩小。对此我也直接实测一下,然后标明日常应用和使用了各自向量指令集的密集计算的成绩,来看看在这个测试中,是不是GB4是娱乐跑分,我使用7700HQ和麒麟955,(A72 VS KBL),当然有人会说A72不是最强ARM(主要是我没有苹果A11,如果谁用苹果有兴趣也可以说一下),但KBL目前也不算最强X86,但是都是比较主流的代表(A72,73,KBL),我把其中项目分成几类,日常类(PDF这类),密集计算类(AVX VS NENO),半专业类(有一定计算负载但没有使用AVX或NEON V8),只比较单核,7700HQ单核3.4(我这7700HQ单核只能3.4,)A72(2.5GHZ)
我们可以发现,大部分时候,差距在两倍或两倍多一些,如果是苹果A11应该就更接近了,AES X86可以使用基于SSE的AES指令集加速,取得了较大领先,到最后两个AVX与NEON V8向量指令集的对决,X86取得了空前领先,领先幅度在4-6倍,这也说明GB4并非完全娱乐,只不过更贴近日常使用,不过因为考虑到手机的普遍性能,很多项目对X86来说都太短了,甚至高性能ARM也能满血运行,所以一方面不能完全发挥出X86复杂计算的全部实力,ARM也可能看不见降频等问题,但是毕竟没几个人的手机会经常做科学计算,而日常使用,如简单的文档,图片,网页,最新的ARM可能与X86的确差别不大,但计算性能峰值还是差距巨大。
但是,我见有的地方说GEMM这个项目GB4丧心病狂的是支持AVX512的,所以我也拿支持AVX-512 FMA的处理器友情更新一下,值得注意的是,Intel目前的处理器,支持AVX512的处理器,AVX/AVX512向量负载频率会被offset
SKL-X的产品在运行AVX下全核频率将下降为3.7Ghz,单核3.8,AVX512下为3.5Ghz,单核3.6
SKL-X的GEMM果然是变态的高,领先ARM达12倍之多,排除3.6Ghz对2.5Ghz的频率差,领先幅度也超过8倍
但是这会还没完,我又找人跑了一加5的835,以及评论发的苹果A11的成绩
苹果除了向量应用输了,而且相对KBL差距不大,日常应用性能全面赶超KBL,完爆目前的A72/73以及高通kyro,可见GB4一直被称为applebench,那原因是什么,我不得不在网上找了A11的架构流水线的图
流水线最大宽度6(注意,之前说了HSW还是4,SKL是5)。ROB(乱序缓冲区)192个微指令(之前说了SKL是224,但HSW也是192),19+级的流水线(这个长了点),9个执行单元(4int+3FP+2AGU),这甚至比SKL还要多!!!!!!!!,甚至向量位宽也升级到128bit(待确认),实现2X128 FMA,而GB4每个测试很短,甚至可能也没有考虑降频,功耗问题,这样苹果A11的确证明了,ARM是有能力设计一个与X86一样强度的架构,最多在峰值计算能力有差距,SKL-X的512bit在GEMM上大杀四方,而且GB4的GEMM和FFT都是SGEMM和SFFT,也就是单精度的,这给ARM相对友好的表现机会,而且每个项目过短和简单,也对流水线和cache性能在一些特殊情况下的表现难以体现,但不可否认,ARM的确能够设计一个规模直逼X86的处理器
而且受制于功耗和晶体管密度,在如今,晶体管密度越来越集中的情况下,即一个核心内一昧增加计算单元和分支预测单元,访存单元会在某些情况下导致过于密集的发热,同时过多单元导致利用率下降,这也使得增加一个核心的规模带来的收益越来越低,所以更多核心也在出现,Intel一方面增大单个计算单元的向量位宽(但不增加数量),一方面增加核心,设计更新的互连总线(比如SKL-X的mesh),AMD也提出了CCX+IF的方案,现在X86领先的地方也在于能堆出更多的核心,由于手机更重视能耗和发热,这也使得其很难像X86那样全面扩大规模
至于功耗问题,X86为了保证高频,甚至在AVX512下也要3Ghz,4Ghz,这势必对电路设计和晶体管提出更高要求,也迫使Intel采用更利于高频的电路和复杂的指令解码器,所以顶级X86的功耗会一下子高不少,而骁龙835运行Win10,GB4大跌,这也和部分硬件模拟X86指令集和内存模式切换有关,X86使用TSO内存模型,而ARM是weak moudle,转换开销较高
很多人还提到了SPEC CPU测试,这也是一个很强大的测试,最新已经到SPEC 2017了,主要是fp和int测试,又分base,rate和speed,speed计算密集,rate注重计算+I/O,base受编译优化的影响较小,但无论如何,这个测试都是要看编译选项的,Intel的AVX-512处理器开满优化全力跑,可以让非AVX512处理器一个个怀疑人生,不过这个测试我没有,毕竟要999美元,所以就不亲自测了
说了这么多还只是CPU部分,GPU部分怎么看?GPU比CPU更重视计算性能,而且适合能够高度并行化的计算,这也是很多时候CPU的向量指令集不在游戏中大量使用的原因,因为都让GPU干了,CPU都是不易于多核和并行化的任务,简单地说,GPU以支持的API和算力来看的话,目前能上Tflops浮点峰值的手机GPU还没有,而GPU在2008年就上T了(HD4850/4870)
,不过手机GPU支持最新的图形API,有最新的视频解码能力,你硬去比最最最低端的PC GPU的话,其实也不落后多少,比如610M这种的算力低的可怕,很多几年前的GPU也不支持4K 10bit H265,视频解码往往依赖专用电路设计的处理器,如DSP,ISP就被集成进SOC帮助手机,Intel核显的视频解码能力也是集成了DSP电路的结果,甚至有SOC开始集成高速低精度的AI计算单元来协助进行视频,图像处理,这都是10年前PC也不曾有的
最后,相当于多少年前呢,如果你就是上网聊天看电影,手机SOC甚至可以当现在的PC,你要是有密集计算和高I/O(PC可同时挂载的高速硬盘更多,内存带宽更大),手机SOC可能还真的就只能去比10年前PC了,不过十年前PC的硬盘性能,怕也得被手机的UFS和NVMe的存储打爆,所以我们要就事论事,分开的来看待