【知乎】Apple M2 Blizzard微架构评测(上):阳春白雪
AcFan-AK
编辑于 2023年12月31日 02:32

Apple M2 Blizzard微架构评测(上):阳春白雪

JamesAslan

喜欢画画和摄影的硅工码农(滑稽)

16 人赞同了该文章

前言

M1的横空出世惊艳世人,而M2中规中矩的性能改进、更进一步的产品定价让这一代产品黯然失色。不过我们并不能忽视工程师向其浇灌的汗水,在M1中立下汗马功劳的小核icestorm并没有停下脚步,M2的小核blizzard让我们看到了山巅更高更远的青空。其使用了极小的流水线规模,却刷新着新世代窄发射处理器的性能上限。与之相比,Arm的中核A710、A715似乎也显得乏善可陈;倘若考虑功耗、能效比,blizzard更是遥遥领先。苹果的小核综合表现已然成为M系列、A系列处理器的一大护城河,是每一位后来者必然需要面对的高山。我们这次就来探究Blizzard的微架构。

碎碎念

之所这次将基准测试部分特别拆出,是因为经常被问到一些问题,这次统一做出一些回应,放在末尾:

  1. 关于优化选项的影响。

  2. 关于每GHz SPEC分数是否有意义。

基准测试

在这一部分我们使用SPEC06、SPEC17、Coremark以及Verilator对处理器进行测试。注意,我们并不执着于fine-tune以获得某一微架构的最高分数;而是以合理、统一的编译参数带来可比的分值数据。SPEC06、SPEC17等的分值受系统环境、编译器版本、编译参数、BIOS调教、频率稳定性、具体SKU的Cache配置、具体平台的内存参数等因素影响巨大,且无法通过任何简单线性缩放进行分数推演。详细的编译选项如下:

  • 调用库:GLIBC 23.5.0

  • SPEC06: -Ofast -static (x86 + avx2)

  • SPEC17: -O3 -static (x86 + avx2)

同ISA平台使用相同二进制运行,避免反复编译(包括SPEC06、SEPC17、Coremark、Verilator)。所有SKU在性能测试中都会运行在自身的最高频率。

频率

我们使用的平台是Mac mini M2,处理器为Apple M2。其中的小核心Blizzard能够稳定运行在2.42GHz,这是我们使用程序测得的实际等效频率,以下的测试都基于2.42GHz的频率进行。

SPEC06

SPEC06是已经退役的SPEC测试集但是仍然被广泛使用;其负载特性与SPEC17并不相同,因此仍然具有相当的测试价值。

blizzard在所有子项上都取得了相较icestorm的坚实提升,并且平均提升幅度(30%)远超频率提升(21%)。那么不严谨得计算,blizzard的IPC表现提升似乎仅有~9%;但是在后文的逆向中我们惊讶得发现,blizzard的流水线规模、队列容量、Cache容量等参数基本没有任何提升,也就是说blizzard的同频性能提升似乎是一顿免费的午餐?从410、462子项上我们似乎能够发现一些端倪,即blizzard的访存带宽有所增长;这一方面来自于其改进的数据预取器,另一方面可能也来自于苹果对小核簇访存带宽限制的松绑。尽管blizzard的访存带宽仍然有明显的受限痕迹(不及大核的一半),但是相较icestorm有了明显改善,对于饥渴的小核而言恰如甘霖。这也预示着这样的成绩远非该微架构的能力上限,我们添加更多的编译选项(-flto -funroll-all-loops +jemalloc),定点分数提升至38.52分,但是浮点分数却基本不变约为40分。浮点侧没有明显提升,因为其对带宽的要求更高,blizzard明显仍然受到访存带宽的掣肘。倘若在下一代中苹果继续放开相关限制,小核即便不做出微结构改进,仍然能够获得可观的性能提升。这样的表现对于一颗只配备了4MB LLC、4ALU、2FPU、1LD/ST、1LD、128项ROB的处理器而言实属惊人,超过了本人印象中所有近似规格的处理器。

在与Arm Cortex A系列的中核对比时,blizzard在总成绩上落后,但是差距大幅缩减。由于明显的人为访存带宽限制,blizzard在浮点方面被远远甩开;但是在更符合其应用场景的定点方面,blizzard已然赶上了老当益壮的A77。考虑到两者的规格差异,blizzard显然更胜A77一筹,与A715也相去不远,可谓我个人心目中的最强小核了。

SPEC17

SPEC17是现役的SPEC测试集,被广泛用于微结构性能评估。

与Arm中核的停滞不前不同,blizzard还在稳步前行,大幅缩减了绝对性能的差距,不过幅度更接近于频率提升。不过提升幅度接近频率提升并不总是一种阴阳。倘若频率提升了3%,性能提升了3%,那么这可以是一种“性能提升全靠提频”的委婉转述;倘若频率提升了21%,性能也能提升21%,那么就必然需要设计上的额外努力。因为memory wall的存在,核心频率升高时性能收益会出现大幅衰减;反过来说,每一款性能提升线性紧咬频率提升的处理器背后,都有精心设计、调试的访存子系统。工程师都需要付出额外的代价(可以是头发,也可以是设计上的取舍或巧思),才能实现这样的效果。与SPEC06类似,大部分访存带宽敏感子项上blizzard都有较好的表现;较为反常的是548子项,还需进一步探究。总体而言,blizzard更少的访存带宽限制使能了其线性性能提升。

Coremark

Coremark是一款嵌入式基准测试程序,其受下级Cache子系统、内存等的影响极小,主要考察核内流水线以及L1 Cache的性能表现。

在Arm与X86平台上我们主要关注coremark在O1与O2旗标下的成绩。Coremark不涉及L1Cache以下的访存子系统 ,因此其得分与最大频率基本呈现完美线性,反应的是流水线的基本效率,故我们使用每MHz分数来呈现结果。

blizzard相较icestorm在基本运算效率上改进不大。blizzard是一颗4.5发射处理器(在后续文章中会详细解释),每周期能够译码5条指令但只能重命名、发射4条需要修改寄存器的操作。因此,在coremark这样重视运算的负载上,相较4发射的icestorm没有明显优势,也落后于5发射的Arm中核A715。基本没有变动的分支预测子系统当然也无法带来相较icestorm的优势。不过往好处想,在频率提升了接近25%的同时保持了coremark/MHz分值的不变,说明流水线没有为高频设计做出妥协。与之相反的是同样经历了提频的M2大核avalanche,其coremark/MHz分值出现了小幅倒退。

Verilator

以上三款测试集对处理器的前端压力较小,仿真大规模设计的verilator则恰恰相反,海量的分支与数MB的代码足迹能够轻松压垮ICache、BTB等组件,导致巨大的性能下降。

由于手机环境的限制,我们完整仿真环境中的部分组件无法运行,裁切部分组件并削减仿真规模后得到了Verilator_lite测试。注意:

  • Verilator_lite测试的成绩与Verilator测试的结果不能直接比较。

  • 我们也会在桌面平台上运行Verilator_lite测试以提供参照,请留意图表标题是Verilator_lite还是Verilator。

  • 在同一图表中仅会出现Verilator_lite或Verilator成绩中的一种,不会有数据混杂。

注意:

  • 8Gen2中仅有2颗a710+2颗a715,在1-thread和2-thread中我们使用了2颗a710,在3-thread和4-thread中又额外引入了剩下的1-2颗a715。

除去乱入的M2大核avalanche,在这一项目中blizzard展现出了压倒性的优势,实属意外。avalanche凭借大幅增强的BTB相较M1 firestorm获得了很大的性能提升,这一点我们在下文中曾有所讨论:

JamesAslan:不为人知的角落,Apple M2的小小努力(其一)168 赞同 · 13 评论文章

但是小核blizzard并没有获得类似的BTB增强,其整个前端的分支预测组件与icestorm高度近似,却仍然展现出了超过频率提升幅度的性能增长。不过,从数据侧的测试中我们发现blizzard的访存带宽和预取器都有相当的改进,因此指令侧可能也存在类似的情况。在面对verilator海量的指令足迹时,更强大的指令侧访存能力能够显著提高性能。

尽管我们在A710的评测中盛赞了其前端规格的增强,但是对比产生伤害。在与规模和频率都更低的blizzard对比时,A710在该负载上全面落于下风(当然部分由于手机平台的限制),8192项BTB的A710并没有很好得展现出其应有的指令足迹覆盖能力。blizzard相较A710的优势可能主要在于其巨大的128KB ICache,8Gen2中A710的32KB ICache限制了其表现。

优化选项的影响

后台总有无数的问题讨论优化选项的影响,讨论各种CPU之间的横向对比,与本专栏相关的就是SPEC相关的编译参数。那么,编译参数的影响是极其巨大的,一般语境下,出于正常目的,只能对比同编译器、同flag的成绩。以SPEC06为例,本专栏使用的是gcc12.0 -Ofast -static,总有人觉得这样的选项优化程度不够,实际上-Ofast已经是很激进的优化了,正常编译时很多时候都不会启用至这一选项。我们以M2的大核为例,展示常用编译优化手段、选项的效用:

可见更好的malloc库、链接时优化lto、强制循环展开都是效果十分显著的优化手段,即便是这些常见的手段也能够带来10%的优化。其中的原因与SPEC的程序特征有关,在诸多论文中都有详尽的分析。因此,我们不能随意将不同编译选项的成绩进行比较。

每GHz分数的意义

SPEC的每GHz分数没有任何科学含义,只有目标频率相近的设计才有相互比较的意义,但是此时为何不比较总分呢?尽管本专栏也时常提及处理器设计的两大流派:speed demon(高主频)与brainiac(高ILP),然而两大流派的宗旨是一样的:追求高的最终性能,单纯的某项指标不能够独立衡量一款处理器的好坏。

回到SPEC的每GHz分数,一方面,SPEC的每GHz分数受到memory wall影响显著,当处理器运行在更高频率时,内存带宽的不足会导致性能无法跟随频率增长,进而导致每GHz分数下降。另一方面,SoC中的总线、LLC等部件的频率,在一些设计中未必会一直随核心频率变化,在一些设计中又受到核心频率的制约,这些部件相对核心较高或较低的频率会带来各种倒挂、超购现象,导致每GHz分数的变化难以预测。因此,我们谈论每GHz分值时也需要标注运行频率,这也是本专栏总是告知测试运行频率的原因;同时,我们也不能通过随意的线性缩放估算一款处理器运行在更高或更低频率下的成绩。每一款性能提升线性紧咬频率提升的处理器背后,都有精心设计、调试的访存子系统,工程师都需要为此付出额外的代价,可以是头发,也可以是设计上的取舍(如x86阵营)或巧思。

我们继续以M2的大核为例展示SPEC的每GHz分数随处理器最大频率的变化,我们将核心锁定在660Mhz-3.45GHz间的多个频率点上运行SPEC06 rate1,并计算每GHz分数:

可以看到每GHz分数在不同的频率上有~15%的变化,这里甚至都没有考虑一款核心本身的设计取向。因此,不加限定时这一数值没有严谨上的意义。

发布于 2023-12-30 14:04