4.4 To be nclusive or not to be…
来源:互联网 发布:爱特数据恢复中心 编辑:程序博客网 时间:2024/06/06 00:26
在Athlon微架构中,L1 Cache的大小为128KB,分别为64KB Data和64KB Instruction Cache,运行频率与CPU Core Clock相同,在Hit时的Load-Use Latency为3个Clock Cycle。L2 Cache大小为512KB,运行频率为CPU Core Clock的一半[86][1]。L1与L2 Cache之间的比值为4,这使得Exclusive Cache结构成为必然的选择。在L1 Cache与L2 Cache之间,Athlon微架构设置了专用的Buffer,暂存从L1 Cache中淘汰的Cache Block,这个Buffer也被称之为Victim Buffer。L1 Cache,L2 Cache与Victim Buffer的组成结构如所示。
在Athlon微架构中,Victim Buffer由8个64B大小的Entry组成。而L1 Cache,Victim Buffer和L2 Cache之间也是严格的Exclusive关系。在Athlon微架构盛行的年代,L1 Cache容量为128KB是一个很大的数字,这个数字放到今天也并不小。这使得CPU Core访问的多数数据在L1 Cache中命中,L1 Cache和L2 Cache间的总线并不繁忙,Victim Buffer暂存的Cache Block可以在总线Idle时与L2 Cache进行同步。Victim Buffer很少会因为所有都Entry被占用而成为系统瓶颈[86]。
当CPUCore读取的数据在L1 Cache Miss,而在Victim Buffer Hit时,数据将从Victim Buffer中传递给CPU Core和L1 Cache,从L1 Cache中Evict的Cache Block将送至Victim Cache,无需L2 Cache的参与。即便数据访问在L1 Cache和Victim Buffer全部Miss时,Athlon微架构L2 Cache的Load-Use Latency也仅为11个Clock Cycle,包括L1 Miss所使用的3个Cycle。
在VictimBuffer为满,CPU Core访问的数据在L1 Cache中Miss且在L2 Cache中Hit的场景中,Victim Buffer暂存的Cache Block需要使用8个Cycle刷新到L2 Cache中;之后L2 Cache需要2个Cycles的Turnaround周期将命中的Cache Block提交给L1 Cache,同时将在L1 Cache中Evict的Cache Block送往Victim Buffer;最后L2 Cache还需要2个额外的Turnaround周期完成整个操作。此时L2 Cache的Load-Use Latency也仅为20个Cycle。
Athlon微架构的Cache Hierarchy结构在与当时同类处理器的较量中赢得了先机。而在多数应用场景中,微架构间的较量首先发生在Cache Hierarchy中。而后的K8微架构进一步优化了Cache Hierarchy结构。
AMD在Magny Cours微架构中,L3 Cache作为L2 Cache的Victim[87]。AMD对Exclusive Cache情有独钟,基于K7,K8和K10的一系列微架构均使用了这一结构。在当时AMD凭借着Cache Hierarchy结构上这些貌似微弱的领先优势,迎来了其历史上风光无限的时代。Intel直到Nehalem微架构之后才真正超越了AMD,并开始在Cache Hierarchy领域上的一骑绝尘。
AMD最新的Bulldozer微架构在Cache Hierarchy层面上做出了较为激进的改革,虽然在L1 Cache层面依然使用VIPT方式,大小为16KB,却也不再坚持之前微架构3个Cycle的Load-to-use Latency,而是扩大到4个Cycle。Latency的提高使得Bulldozer在L1 Cache层面使用128位总线带宽成为可能,提高了总线的带宽。
L2 Cache由两个CPU Core共享,最大可达2MB,这使得Exclusive Cache的组成方式失去意义,不出意外Bulldozer微架构采用了NI/NE方式。最令人意外的是该微架构L2 Cache的Load-to-use Latency达到了18~20个Cycle,远高于Nehalem和Sandy Bridge微架构的10个Cycle[74][12][69]。但是与Nehalem和Sandy Bridge相比,Bulldozer微架构提高了可并发的Outstanding Cache Miss总线请求,L1 CacheMiss的可并发总线请求为8个,L2 Cache Miss的可并发总线请求为23个。
Bulldozer微架构这些设计必然经过详尽的Qualitative Research和Quantitative Analysis,在没有获得精确的性能数据之前,无法进一步诠释Bulldozer微架构的优劣。事实上即便你拿到这些数据,又能够说明多少问题。这些数据很难真正地做到公正全面,在很多情况之下依然是一个片面的结果。此时可以肯定的是,AMD依然不断前进摸索,在工艺落后Intel的事实中正在寻求新的变化,这个公司值得尊敬。
Bulldozer微架构放弃了Exclusive Cache结构必定基于其深层次的考虑。即便是通过简单的理论分析,Exclusive Cache也并非完美。Exclusive Cache是Pure Inclusive Cache的另一个极端表现方式,Inner Cache与Outer Cache间依然紧耦合联系在一起,这造成了各级Cache间频繁的数据交换,尤其是Inner Cache和Victim Cache之间的数据颠簸。在CMP组成的ccNUMA处理器系统中这种颠簸更加凸显。
首先在OuterCache作为Inner Cache的Victim时,Outer Cache仍需要监控发向Inner Cache的Request和Reply等信息,加大了Outer Cache Controller的设计难度。其次在一个CMP处理器系统中,某个CPU Core发起的Snooping操作,必须要同时Probe其他CPU Core的Outer Cache Tag和Inner Cache Tag。
对Inner CacheTag的Probe操作必将影响当前CPU Core对Inner Cache的访问延时,而这个延时恰是单个CPU Core设计所重点关注的内容,处于关键路径。如果每次Probe操作都直接访问L1 Cache的Tag,将影响CPU Core对L1 Cache的访问,可能会Stall指令流水线的执行,带来严厉的系统惩罚。
通常情况下,处理器可以使用两种方法解决这类问题。一个是设置专用的Snoop Filter,处理来自其他CPU的Snoop Transaction,减少对Inner Cache不必要的Probe,对于Exclusive Cache设置Snoop Filter需要额外的逻辑,而Inclusive Cache较易实现Snoop Filter。另一种方法是复制Inner Cache的Tag,实现CPU Core访问Inner Cache Tag与Snoop的并行操作。
这两种方法都会带来额外的硬件开销,从而加大了Cache Controller的设计难度。不仅如此,在Cache Hierarchy的设计中每加入一个Buffer都要细致考虑Memory Consistency层面的问题,各类复杂的Race Condition处理和由此带来的Transient State。这一切使本身已经极为复杂的Cache Controller,更加难以设计。
NI/NE Cache是Exclusive Cache与Inclusive Cache的折衷。Intel从P6处理器开始一直到目前最新的Sandy Bridge处理器,一直使用这种结构。Intel也曾经尝试过Exclusive和Inclusive Cache结构,最终坚持选择了NI/NE结构,也开始了Intel x86在Memory Hierarchy领域的领先。但是我们不能依此得出NI/NE结构是最优的结构,也不能认为这个结构是一个很古老的设计而应该淘汰,在没有得到较为全面的量化结果之前,很难做出孰优孰劣的判断。即便有这些结果也不能贸然作出结论。
在使用NI/NECache结构时,Inner Cache与Outer Cache的部分将内容重叠,与Inclusive结构相比,Cache容量利用率相对较高,但是仍然不及Exclusive Cache结构,因为Accidentally Hit的原因,NI/NE Cache容量利用率与Inclusive Cache相比,提高得较为有限。单纯从这个角度出现,在设计中并没有使用NI/NE Cache结构的强大动力。
此外采用NI/NECache方式时,在Outer Cache中不保证包含Inner Cache中的全部信息,因此其他CPU Core的Snoop Transaction仍然需要Probe Inner Cache,这使得NI/NE Cache方式依然要复制Inner Cache Tag,或者加入一个Snoop Filer。
从以上两方面分析,我们很难得出使用NI/NE结构的优点。NI/NE Cache的支持者显然会反对这些说法,他们会提出很多NI/NE Cache的优点。NI/NE Cache可以在Outer Cache中加入IB(Inclusive Bit)和CD(Clean/Dirty)位,即可克服Inclusive和Exclusive Cache存在的诸多缺点,并带来许多优点,如消减Outer Cache的Conflict Miss,充分利用Inner Cache与Outer Cache间总线带宽,Write Allocate on Inner Cache without Outer Cacheinteraction,减少不必要的RFO(Read for ownership)操作等。
我无从辩驳这些确实存在的优点,但是更加关心这些优点从何而来。从一个工程师的角度上看,NI/NE Cache带来的最大优点莫过于简化了Cache Hierarchy的设计。与使用Inclusive和Exclusive Cache结构相比,采用这种方式使得Inner Cache和Outer Cache间的耦合度得到了较大的降低,也因此降低了Cache Hierarchy的设计难度。
耦合度的降低有助于Inner和Outer Cache Controller设计团队在一定程度上的各自为政。这种各自为政的结果不仅仅提高了Cache Controller的效率,更重要的是提高了设计人员的工作效率。但是这种各自为政只是在一定程度上的,Inner是Outer Cache的Inner这个事实决定了Inner Cache和Outer Cache无论采用何种方式进行互联,依然存在大的耦合度。
NI/NE Cache结构并不是Intel x86处理器的全部。Intel近期发布的Nehalem和Sandy Bridge处理器,在使用NI/NE Cache的同时,也使用了Inclusive Cache。Nehalem EP处理器含有4个CPU Core,其中每一个CPU Core含有独立的L1和L2 Cache,其中L1和L2 Cache为Inner Cache;而所有CPU共享同一个L3 Cache,这个L3 Cache也被称为LLC或者Outer Cache。
其中L1Cache由32KB的指令Cache与32KB的数据Cache组成,采用NI/NE结构;L2 Cache的大小为256KB,采用NI/NE结构;L3 Cache的大小为8MB,采用Inclusive结构,即该Cache中包含所有CPU Core L1和L2 Cache的数据副本。Inclusive LLC也是一个天然的Snoop filter。在LLC中的每一个Cache Block中都含有一个由4位组成的Valid Vector字段,用来表示LLC中包含的副本是否存在于4个CPU Core的Inner Cache中[12]。
当ValidVector[i]为1时,表示第i个CPU Core的Inner Cache中可能含有LLC中的Cache Block副本,因为NI/NE结构的缘故,Valid Vector[i]为1并不保证Inner Cache中是L1还是L2 Cache中含有数据副本,仍然需要进一步的Probe操作;当Valid Vector[i]为0时表示,第i个CPU Core的Inner Cache中一定不含有LLC中的Cache Block副本[12]。
LLC的Valid Vector字段可以简化由Nehalem EP/EX处理器组成的ccNUMA处理器系统中的Cache Coherency。因为LLC可以代表一个Nehalem EP/EX处理器中的所有Cache,当其他Socket进行Snoop Cache时,仅需首先访问LLC即可,而不必每一次都需要Probe所有Inner和Outer Cache,从而简化了Cache Hierarchy的设计。
Sandy Bridge处理器的Snoop Filter的设计与Nehalem EP/EX处理器类似,只是进一步扩展了Nehalem EP/EX处理器的Valid Vector字段,以支持内部集成的GPU[69]。采用Exclusive Cache结构的Magny Cours在6MB的L3 Cache中划出了1MB的Probe Filter Directory作为Snoop filter[87],而且提高了Cache Controller的设计复杂度。
AMD在其工艺落后于Intel,在相同的Die Size只能容纳更少晶体管数目的劣势下,使用规模庞大Probe Filter Directory有利于多个CMP系统间Cache一致性的实现,尤其在4个或者更多Socket的场景。但是即便是在这个场景下,AMD仅依靠Probe Filter Directory并不足以超过Intel。Sandy Bridge在LLC层面的实现几乎独步天下,不仅运行在Clock Frequency,而且其Load-Use Latency仅为26~31个Cycles[69]。
除此之外SandyBridge在LLC的实现中使用了Distributed的方式,将一个LLC分解为多个Slice,其中每一个CPU Core对应一个Slice,CPU Core经过Hash结果访问各自的Slice。这种Partitioning Cache Slice降低了Cache Coherency的设计难度,进一步提高了LLC的总线带宽,提高了LLC的Scalability,避免了潜在的Cache Contention[69]。AMD的Magny Cours也支持这种Cache组织方式[87]。除此之外,NI/NE with Inclusive Cache还可以使用一些手段进一步优化,如[90]中介绍的TLA(Temporal Locality Aware)算法。
无论是Intel采用的NI/NE Inner Cache加Inclusive Outer Cache的结构,还是AMD采用的Exclusive Cache结构[3],在Cache Hierarchy的设计中,只有耦合程度相对较低的区别。如果从数字逻辑的设计角度上看,这些设计都是耦合的不能再耦合的设计。
在很多场景中,一个完美的设计通常从少数人开始,这也意味着设计的强耦合,一体化的设计有助于整体效率的提高,但也很容易扼杀子团队的创造热情。一个将完美作为习惯的架构师最终可以左右一个设计,创造出一个又一个属于他的完美设计。这样产生的完美,不可继承,不可复制,等待着粉碎后的重建。这样的完美本身是一场悲剧,这些悲剧使得这些完美愈显珍贵。
不同群体对完美的不同认知使得这些悲剧几乎发生在每朝每代。这些完美的人不可轻易复制,使得一个大型设计通常选用多数人基于这个时代赋予认知后的完美,属于多数人的完美。这使得架构师在设计产品时,若只考虑技术层面,而不考虑设计者间的联系,并不称职。这也使得一个优秀的架构师在历经时光痕迹,岁月沧桑后,做出了很多不情愿也不知对错的中庸选择。这些中庸可能是大智慧。而总有一些人愿意去挑战这些中庸。
[1]本文介绍的Athlon处理器采用的L2 Cache为Full-Speed On-Die L2 Cache。
[2]原图来自[89],并有所改动。笔者并不认同该论文的部分内容,仅引用该图。
[3]Magny Cours微架构并不是严格意义的Exclusive Cache,L3 Cache需要检查True Sharing状态[76]。
- 4.4 To be nclusive or not to be…
- 4.4 To be inclusive or not to be…
- To be or not
- To be or not to be
- To be or not to be
- To be or not to be
- TO BE OR NOT TO BE
- To be or not to be
- To Be or Not To Be
- to be or not to be
- to be or not to be
- 4.4 To be inclusive or not to be 1
- To Be of Not To Be ,or to Be Null
- 程序员的 to be or not to be
- To Be or Not To Be Certified? @ JDJ
- TO BE OR NOT TO BE THAT IS AQUESTION
- HDU 3031 To Be Or Not To Be
- HDU 3031 To Be Or Not To Be(左偏树)
- 4.2 存储器读写指令的发射与执行2
- 软件开发本质论——自然之路
- 4.3 Cache Controller的基本组成
- 4.4 To be inclusive or not to be…
- 用vector容器写职工管理系统
- 4.4 To be nclusive or not to be…
- 4.5 Beyond MOESIF 1
- 4.5 Beyond MOESIF
- 4.6 Cache Write Policy
- 4.7 Case Study on Sandy Bridge C…
- 第5章 Data Prefetch
- 5.1 数据预读
- 5.2 软件预读
- 5.3 硬件预读