简介 #
这是ARM第一款做的比较成熟的服务器核Neoverse N2,前面的系列Neoverse N1是由移动端A76改进而来,但相对而言没有那么成熟,或者说性能没那么高,这款核在市场上反馈良好,并且以低功耗以及平衡性能的特点占据了一定的市场,本文将分析这款核的一些设计特点。
Neoverse N2最高能跑到3.6GHz,考虑到Op-Cache的引入,这是一款5宽乱序核心,并且非常值得关注的是,N2的分支预测惩罚仅有10个周期,并且在5nm工艺下,面积1.1-1.3mm2
(取决于L2配置的大小),作为服务器端的核,功耗仅有1.0-2.0W/core+L2
,除去本身ARM架构在移动端的生态积累,这种性能和功耗的优势也是其能快速获得云市场青睐的原因。
取指单元 #
前端的优化很多,和N1相比对预测器的优化比较多,N1不支持每个周期预测2个跳转分支,而N2则将预测的带宽扩大为原来的2倍,并且支持了每周期预测2个跳转的分支,这是非常重要的特性,对于提升前端的带宽有非常重要的意义。但从Fetch Queue以及Decode宽度来讲,估计不是实际意义上的2-taken/cycle,应该会有不少限制,例如是2个连续的block的预测,不能在bank冲突时跨cacheline,但既然支持了,肯定会有一定的性能提升的。取指单元总体来讲没有看到太多关于预取的优化,其它方面的优化多少都有。
预测器 #
预测器属于前端的核心组件了,其精度对整个处理器的性能都有很重要的影响,每一次预测错误都会导致流水线刷新,这会导致处理器在做无效功,错误路径的指令会污染Cache
和TLB
,这种错误的影响会随流水线深度增加而增加,当然还要很多负面的影响不太容易量化评估。不管何种设计,现代超标量处理器都是非常重视分支预测器的。
一般情况下,出于并行性和延迟考量,预测器都多级的,一般第一级需要能够实现0cycle定向,有处理器厂商称为0bubble,nextline预测器,考虑到延迟,面积等因素,第一级预测器很难使用复杂算法,所以一般做的都比较小,当然这几年工艺改进快,所以做的可以很大了。N2的0cycle的重定向由原来的16entry提升到64entry,和同样是服务器系列的V2有一定差距,目前定位旗舰核的都是1K+,但考虑到这是2021年推出的核,定位也不是旗舰核,有不少参数差异是能接受的,毕竟这个系列设计对功耗优先级很高。预测方向的算法从各方面的消息来讲,还是Tage,这个算法我在很多文章中说过,这里不多赘述,目前依据这个算法基本是工业界最好的预测器,这里的最好指的是在一定的面积开销,良好的时序下,能实现的精度是最好的,主流厂商基本基于这个算法做一些改进。 主预测器是8K,即使是现在,这个数值也不算小,BTB的大小很大程度决定了能覆盖的范围,同样也影响了命中率,如果预测方向很准确,但BTB的MISS比较高,那么预测器的性能也会很受限,目前BTB的大小一般做的都比较大,并且有很多方法优化存储的信息密度。
Alt-Path的优化,估计是优化预测精度的模块,应该和Tage算法的Alt-Pred不太一样,或者是单独做个模块来跟踪Alt-Path,其实我一直觉得Tage本身的算法(指经典的论文)对可供选择的预测结果挖掘不够,相对而言做的太简单。
指令缓存 #
ICache也是核心模块,一般考虑到速度,做的都比较小,ARM是64KB/4WAY的配置很多年了,我在很多微架构分析文章都提到相关,这里不多赘述。取指带宽仅有16B,而旗舰的V2则是有24B,这是他们的定位决定的。
稍微值得关注的是,Cache(ICache/DCache)都更重视预取机制,预取本身在处理器中非常重要,可以打破一些原本固有的延迟,例如L1 ICache和L2 Cache之间又较大的延迟,预取机制可以在取指或者预测前将指令取到ICache内,这样可以降低延迟,这种性能提升对提升IPC有重大意义。
ARM在N2演说PPT里单独讲了预取机制,如下图:
Op Cache #
这是一个比较有趣的设计,前端除了2-taken/cycle预测,这个地方变化最大,具有1.5K entry,可以绕过decode,对于复杂指令集,decode流水线比较深的微架构,这个组件几乎是必须的,对性能提升很好,前面说的10cycle的预测错误惩罚,很可能就是指命中Mop Cache的情况,因为10cycle属于非常低的预测错误惩罚了。关于这个组件在移动端沿用了好几代,服务器系列的核仅有一代便被删除,ARM后面舍弃这个模块也是功耗的权衡,将更多的资源投入到ICache,并通过ICache增大取指带宽降低删除Mop Cache的影响。
内存管理单元 #
到目前为止,MMU模块实在写的太多,后面的侧重点可能都不在此处,感兴趣可以看其它核的分析文章。
经典的2级TLB结构,L1 ITLB是48entry,L1 DTLB是32entry,L2 TLB是共享的存储,具有5路,这个5路还是比较奇怪的,一般是4路,6路,8路,可能有一路做特殊的设计或者为特殊的Feature做的保留。
Mid-Core #
Rename的改进主要在宽度,这里得益于前端的Mop的引进,Rename的Checkpoint也是N2比较前代引入的新的特性,有利于快速从预测错误分支状态的恢复。ALU增加了一个通路,分支执行则改为2个,实际即使每周期只能预测一个跳转分支,也可以有2个分支执行。,这样也能带来收益,大家可以关注一下其它核都有类似的思想。
其实之前有经验非常丰富的人质疑我的说法,他说很多执行部件都是按照比例固化的,例如Load Store的比例,前端Issue和退休带宽的比例,这些我是知道的,但我理解这些比例不是完全固化的,是可以设计一些荣冗余的通路,尤其是当这个部件的面积和逻辑复杂度开销相对较低的时候,可以设计看上去不合理的比例获得一些场景的收益。并且统计一下Intel/AMD/ARM这些传统强势的CPU厂商他们在设计的时候也没严格按照某些统计学的比例来设计,我并不觉得一些教科书式的经验设计是必须要遵循的。一些模拟器仿真器给出的结果也各不相同。
分支预测惩罚为10cycle,非常低的值,像Zen4我记得是最小11cycle(实际应该大不少),高通24年的核还是13cycle,但这里的10cycle可能指的是命中Mop Cache。
Back-End #
又到了喜闻乐见并且我不熟悉的后端了,DCache是64KB/4WAY,VIPT,从寄存器里看,潜在的alias使用硬件维护。替换算法使用PLRU,这个算法简单,硬件开销相对较小,性能感觉一般,尤其对路数比较小的,这个算法我感觉更一般了(曾经做过这个算法也测试过,但没辙,因为稍微复杂点的算法硬件开销都很大)。L2的带宽是前代的两倍,预取有所改变,这一代开始,ARM的预取的重视明显变得更高了。官方放出的信息来看,LSU设计思路变化不大,基本都是在优化,后面可能改为双口DCache来增加带宽,这一部分挺久没有看到比较有意思的改变了,也可能官方没说。很期待ARM能在Cache设计的核心思路上有所改变。
总结 #
ARM N1的改进相比它的前代实在太小,而N2一些重要的feature纷纷引进,例如预测器每周期预测两个跳转分支,提高L2 Cache容量,重点优化预取器,增加Mop Cache等等。N2目前确实算是比较经典的一代处理器,和移动端的A78一样具有很重要的地位,在商业上也证明了它的成功。
下图是ARM参考设计,本代N2对应的CMN是700系列,相关的GIC和MMU均更新到700系列,CMN700支持最高256核/die,SLC支持最高512MB,每个die支持最多144个节点。国内阿里设计的云服务器CPU采用128个N2,频率最高可以跑到3.2GHz,非常成功的设计。