ARM和x86/64间的性能对比网上已经有不少了,可以看到ARM在简单任务上有着接近x86的性能且能效比更高,但复杂任务上的性能仍远逊于x86。不过phoronix上测试采用的ARM CPU都比较老了,且是Linux上。那么9102最新的ARM CPU微软SQ1(高通855超频版)的表现如何?Windows ARM的表现如何?Windows上ARM模拟x86执行的效率如何?
今天折腾了一下午,试图找一些benchmark能够在ARM版Windows上编译。最终只成功编出来3个测试。Linux上有许多ARM的测试,对于ARM的生态支持比较好,但Windows相对开源支持就比较糟糕。许多开源测试的编译都失败在3点:1、项目配置依赖于x86而不允许给ARM编译。2、有针对CPU的Windows API或指令不支持ARM。3、缺乏编译工具链。Windows ARM的编译主要依赖于VS的ARM支持和第三方版本llvm-mingw,工具链并不能完整支持许多比较大的项目编译。工具链可以自己从头一点点做,不过实在太麻烦了先没做。
测的两台机一台是6核i5 8600k,平台比较垃圾,睿频4.15,全核4.07。另一台是Surface Pro X,微软SQ1,四核A76(3G)和四核A55(按下面测算1.7G左右)。均无超线程。
测试软件都使用同样源码,使用llvm-mingw或者nmake编译。在8600k上编译x64和x86版运行,在SPX上编译ARM64和x86版运行。
性能数据在最后进行具体计算分析。
C-Ray
计算光线追踪的程序,使用的别人编译的llvm-mingw二进制,运行命令:c-ray-mt-32.exe -t {6 (i5), 8 (SQ1)} -s 1920x1080 -r 8 -i sphfract -o output.ppm
86k上x64跑的笔x86慢,估计是哪里有问题,毕竟这个程序不是很全面的测试,就看x86成绩好了。8核SQ1比6核86k慢接近一半。SQ1上虚拟x86执行比ARM64惊人的慢了近3倍。
另外还跑了个光线追踪渲染程序POV-Ray,这个测试比较成熟,针对FPU有高度优化,因此编不出ARM版。86k上x64成绩2433.30 PPS,x86成绩1949.04 PPS。在SPX上运行x86版只有大约不到200 PPS,差距15倍。似乎这个调度有问题,第一次运行了一会后突然变成只有4颗小核在运行,之后运行虽然都是设定8线程,但都只能在4个小核上运行,成绩只有大约6、70 PPS。不确定是POV-Ray的问题还是Windows的问题,在别的测试中没有这个问题。
m-queen
非常naive的经典搜索算法。这个一般是作为OpenMP的测试,但OMP工具链缺乏,只能测单线程。也算看看CPU单线程简单工作的IPC区别。运行命令:m-queens 17
这种纯搜索算法的任务虚拟x86和ARM64性能几乎没区别。
7zip
测试加解压算法性能。使用VS的nmake编译,运行命令:7za b -mmt{x},测试了不同线程计算的结果,结果挺有意思的,后面再分析。注意2T的数据不知道为什么都比较高,可能是其算法有什么优化?在后面计算分析中不考虑2T成绩。
1-4T任务能够调度在4颗大核上,5-8T的任务则会加在小核上,调度器能正常调度大小核区别,任务管理器中前4个为小核,后四个为大核。不过由于存在大小核之分,也有后面分析中的问题。
由于数据比较多,还有MIPS与CPU占用率比例没放在图里,完整测试结果数据放在最后。
编译Linux Kernel
只是想测个现实复杂任务,但没啥比较好的可用测试,就测一下使用WSL进行Linux编译。注意SPX的WSL也是ARM64版的,所以编译的结果也是ARM版Windows,与86k上负载不完全相同,不能直接对比,仅供参考。编译命令make defoncifg && time make -j{x}
有意思的是86k编译时kernel time比user time大了很多,而SQ1则kernel time比user time少了很多。不知道是不是ARM版WSL架构上有什么改变。但确实ARM版Windows上无法使用wsl命令,可能有什么优化?也可能只是ARM版编译配置不一样。
8600k
real 7m31.094s
user 13m59.344s
sys 24m23.359s
SQ1
real 17m26.865s
user 76m12.906s
sys 45m48.32s
结果计算分析
仅看数值,ARM CPU与x86 CPU最大的区别在于:1、没有超线程;2、没有睿频;3、每个核心有各自的最大频率设定,且有大小核之分。
也就是说,ARM的每颗核心最大频率很可能都不一样。SQ1标称最大3G很可能实际上只有一颗A76能3G,其他都达不到3G,其他A76最高频率可能会差了1、200M。SPX满载时任务管理器显示2.37G,当作4颗大核都3G,则计算下来4颗小核大约1.74G。这个数值基本符合测试结果的计算。
也因此在7z测试中,1T到4T成绩的增长幅度很稳定,但一旦再加线程用上小核,平均性能就开始大打折扣。8T的MIPS/CPU比例远低于4T成绩,而86k上6T该比例与1T基本仅仅相差睿频。
若通过频率与核心数的简单换算,将SQ1的成绩换算为6核4.1G(即对标8600k)A76的成绩,则在7z测试中对比x64,ARM慢了11%,在m-queens测试中慢了3.5%,在CRay测试中慢了50%(此处对比x86)。
而虚拟x86的成绩在CRay中慢了171%,在m-queens中慢了1.4%,在7z中慢了36.5%。
也就是说,ARM的理论IPC极限性能(mqueens)与无超线程的x86性能接近,但即使是同频同核心数全大核,由于缺少CISC各种指令集的加成,在复杂任务上性能略弱,在各类x86指令集优化的程序下被吊打。有机会的话借一块Zen 3测测对比下IPC。
而且由于缺乏睿频,在少线程任务下不能充分利用CPU资源;缺乏超线程,意味着又比x86少了平均20-30%的性能,并且和之前写的文章里提到的一样,很容易由于资源抢占IO阻塞等问题导致性能下降。总的来说目前肯定是不值得当作桌面系统CPU的。
另外由于存在大小核之分,系统调度器中也会增加许多麻烦事,相关文章lwn不少,不再赘述。
至于虚拟x86,在naive的程序下可以说没损失,不过在优化过的x86程序下虚拟那些指令的成本不小,但还算可接受。
不过现在程序基本还没有对ARM优化,也许能够勉强追上一点。但上面的结论在于需要全大核,而没有小核的话则失去了低负载下高能效的意义。并且目前也没有ARM能够有这么高频率。之前有新闻达到8核A72 4G,仅仅是展示,不知道会不会存在哪些问题。而且目前ARM也没有加入超线程的打算。
总的来说ARM64性能比预想中的要好,x86模拟的效率不高和预想差不多。能效比上根据这些日子体验只有低载时能效高,而有负载情况下能效并不是很满意。需要等待后续优化和各厂商的ARM64支持(很困难)。
至于有很多人尤其是外媒喷SPX无用没有意义,其实微软推出主要目的也是靠第一方硬件(和钱)来强推ARM生态带动各软硬件厂商。微软的Surface各系产品都是这样来打的头阵。想想Surface Pro 3之前除了苹果的笔记本体验做的都是什么臭鱼烂虾。大多人觉得苹果贵是卖系统,其实贵是真的是硬件贵。
另外虚拟x86程序识别CPU识别为virtual CPU,估计应该是hyper-v做的虚拟化,里面技术细节应该有不少有意思的。Win10经过这么多年的改变,现今整个Windows内核都是运行在hyper-v上的,也带来了许多这样的优势。
7z完整测试数据