#每日话题# #有奖活动#
简介
CPU是一个非常复杂的系统,评估其性能并不好量化,传统上讲,我们习惯说“不服跑个分”,这种方式当然也是一个相对靠谱能够对CPU性能进行量化评估的方式,但评估性能对于技术人员来讲,远不是跑个分就能得出结论的,本文将从CPU微架构的角度去讲解当前先进的微架构设计具备特性。亦安不会太过展开微架构的设计细节,所以需要一定的技术背景。
MMU
就从MMU讲起,MMU用于VA-PA的转换以及保护等作用。坦白说各个公司在宣传自家微架构的时候基本不会对MMU有过多的提及,都是提一下L1 TLB和L2 TLB的entry数量就略过,有些甚至都不会提这个。不是因为MMU不重要,而是这个模块相对而言不是CPU的流水线停滞的主要瓶颈点,并且对其微架构的设计都比较成熟,性能做的都还不错,但近些年也有对MMU进行深入研究的论文。
相对普遍的设计是L1 TLB分为ITLB和DTLB,统一的L2 TLB一般是1K entry-4K entry不等,L2 TLB有指令和数据分开的设计,也有混合指令和数据的(TLB用于存储VA-PA的映射)。对于地址转换的逻辑PTW,一般都是多个并行来缓解多个访问源的压力(每次转化地址需要很长时间)。而L2 TLB的自身结构就各家各有自己的设计,有多页面混合的,有页面分开的,这些选择就是PPA的平衡了。具体技术细节我就不讨论了,后续有时间出个专题讨论这些微架构设计的优劣。
刚才提到地址转换的时间是很长的,所以一般还会有Walk Cache,用于存储转化过程的中间页,那么原本可能需要访问4次Cache的转换过程,会被大大缩小。类似想实现缩短转换延迟的方案很多,目前业界采取比较多的是这种。当然其结构各个不一样。
聚合技术,聚合简单说就是VA连续PA连续的情况,可以依据这种规则将多个小页面压到TLB的一个entry里面,实现一次取多页的效果,并且原本一个TLB entry可以存多个页面,当然取来的额外的页未必有用,但评估实验结果来讲多数是有用的。
预取技术,预取在整个CPU领域都是属于关键的技术,目前MMU的预取一般都是实现简单的预取,预测下次要访问的页面。
对于MMU就简单说这些,基本都是高性能处理器具有的特性。
IFU
取指这一块可以聊的东西就很多了,宏观讲就是预测和取指解耦,好处是可以通过更多的预测(因为预测常常有错,会刷新预测的流水线)来缓解取指出现的气泡,还有命中itag后取指可以准确访问idata,减少不必要的无效访问,以及merge多次访问来减少对cache的访问等等。
ICache,ICache可以说是很受关注的一个点了,近些年来,ICache的容量升级不大,基本就是32K/64K的样子,当然也有更大的,相比较L2/L3这种动辄以M为单位的容量,ICahce变化不算大,对其要求当时是低延迟,高命中率,低缺失代价等。对于其优化大家可以参考“计算机体系结构量化研究方法”一书,例如路预测,非阻塞缓存的设计(也叫无锁缓存,缺失后依然命中,可以允许多个miss向L2查找),合并写等等。当然一些替换策略也是对Cache有较大影响的。
预测器,当前预测器比较主流的还是TAGE-SC-L,在2016年分支预测大赛上,TAGE-SC-L夺的桂冠,后续虽然也有不少预测器精度逐渐接近TAGE-SC-L(例如一些机器学习等),但效果依然是TAGE-SC-L更好,近些年基本是围绕TAGE来优化预测器,容量也是随着版本水涨船高。
BTB,BTB用来存储预测的目标,实际BTB相比较TAGE,ICache这些关注度没那么的高,但其miss对流水线停滞也是重大影响,对BTB的要求是在一定面积下实现更高的命中率,对于涉及SRAM结构的要求都差不多,都是希望一定面积下存更多有效信息实现更高的命中率。近些年对BTB的研究也有些比较有趣的论文,例如分region存储,分页存储,以实现在一定的面积下存更多的有效信息。当然这类论文早就有,工程上也很早实现了,只是现在研究的更加细致了。
一个cycle预测多个分支,一般实现这个特性在介绍自己微架构的时候都会提一下,例如AMD的Zen5架构,ARM的N2/V2以及后续版本。实际这种在学术上早在上个世纪就有论文描述,当前各家的实现方案我还在研究。
其它的不细致展开了,核心点就是“更小面积,更低功耗,更高性能”,不少人有个误区,觉得我花费了更多的面积,是不是就是更舍得材料,性能就更高?不是这样的,有些预测器用了更大的面积,但预测的效果还不如那些消耗资源更小预测器,当然这是个复杂的问题,有关于预测器历史发展汇总的论文,感兴趣可以搜搜看。
Decode/Rename/Dispatch
从这里往后我就不是很了解了,因为还没做过,重点的参数当然就是decode宽度了,当前自称高性能处理器的,解码宽度基本都是4+,当然解码宽度不仅仅只是decode模块的问题。
这里提一下复杂指令集常使用的uop-cache,也是预测完后直接访问uop-cache,然后直接绕过decode把指令发到rename。
高性能处理器基本都是乱序执行,和顺序执行相比,效率更高(当然这句话没那么严谨)。rename和dispatch,这里是CPU顺序和乱序的分界点,乱序是以牺牲能耗来提升性能的,这里有分发到执行单元调度的问题,一般这个模块都是希望能够实现高效的调度来实现对资源的高效利用。
传统的调度一般基于依赖性或者就绪性来实现分发,此模块希望提高效率,改善功耗,希望实现更优的指令和内存并行性,相关的论文描述的也比较多。
此处一般会作为宣传的参数有rename checkpoint以及分支flush的恢复优化。
ISSUE/EX
执行一般考虑执行低延迟高带宽,例如ALU的带宽,Zen5有6个ALU,V2也有6个ALU。对于OoO我不熟悉,所以没法过多聊一些所谓“高级”的微架构,后续我参与到这些工作会出一下详细的文章,所以OoO这一块的描述,大家简单参考即可。
LSU
LSU模块关键点DCache,和ICache需要注意点差不多,只是在面向数据存储上做优化,要求低延迟,高命中率,低缺失代价是一致的,除此以外还需要先进的预取引擎。
一般LSU重点需要低延迟,高数据带宽,高执行带宽等,常规的LS 2个,当然涉及的一致性也是关注的重点。
L2
需要的特性是大容量低延迟高命中率,例如现在ARM的新服务器系列的CPU L2基本都到2MB,而和上一代相比容量变大延迟保持不变。取数据的带宽要求更高,能对死区进行有效的预测,支持强大有效的一致性接口。
安全特性
不管是微架构还是架构一般都会有强大的安全设计。
总结
如果我具备某种微架构是不是就可以称为高性能处理器了,如果没有就不是?也不能这么讲,这些微架构都是权衡后的选择,而且也取决于设计者的水平,同样的微架构不同人设计出的效果差距可能巨大。最后说一句“不服跑个分”一定程度上可以反映微架构设计水准的。
|