4.4 To be nclusive or not to be…

来源:互联网 发布:爱特数据恢复中心 编辑:程序博客网 时间:2024/06/06 00:26

Athlon微架构中,L1 Cache的大小为128KB,分别为64KB Data64KB Instruction Cache,运行频率与CPU Core Clock相同,在Hit时的Load-Use Latency3Clock CycleL2 Cache大小为512KB,运行频率为CPU Core Clock的一半[86][1]L1L2 Cache之间的比值为4,这使得Exclusive Cache结构成为必然的选择。在L1 CacheL2 Cache之间,Athlon微架构设置了专用的Buffer,暂存从L1 Cache中淘汰的Cache Block,这个Buffer也被称之为Victim BufferL1 CacheL2 CacheVictim Buffer的组成结构如所示。

4.4 <wbr>To <wbr>be <wbr>inclusive <wbr>or <wbr>not <wbr>to <wbr>be <wbr>2

Athlon微架构中,Victim Buffer864B大小的Entry组成。而L1 CacheVictim BufferL2 Cache之间也是严格的Exclusive关系。在Athlon微架构盛行的年代,L1 Cache容量为128KB是一个很大的数字,这个数字放到今天也并不小。这使得CPU Core访问的多数数据在L1 Cache中命中,L1 CacheL2 Cache间的总线并不繁忙,Victim Buffer暂存的Cache Block可以在总线Idle时与L2 Cache进行同步。Victim Buffer很少会因为所有都Entry被占用而成为系统瓶颈[86]

CPUCore读取的数据在L1 Cache Miss,而在Victim Buffer Hit时,数据将从Victim Buffer中传递给CPU CoreL1 Cache,从L1 CacheEvictCache Block将送至Victim Cache,无需L2 Cache的参与。即便数据访问在L1 CacheVictim Buffer全部Miss时,Athlon微架构L2 CacheLoad-Use Latency也仅为11Clock Cycle,包括L1 Miss所使用的3Cycle

VictimBuffer为满,CPU Core访问的数据在L1 CacheMiss且在L2 CacheHit的场景中,Victim Buffer暂存的Cache Block需要使用8Cycle刷新到L2 Cache中;之后L2 Cache需要2CyclesTurnaround周期将命中的Cache Block提交给L1 Cache,同时将在L1 CacheEvictCache Block送往Victim Buffer;最后L2 Cache还需要2个额外的Turnaround周期完成整个操作。此时L2 CacheLoad-Use Latency也仅为20Cycle

Athlon微架构的Cache Hierarchy结构在与当时同类处理器的较量中赢得了先机。而在多数应用场景中,微架构间的较量首先发生在Cache Hierarchy中。而后的K8微架构进一步优化了Cache Hierarchy结构。

AMDMagny Cours微架构中,L3 Cache作为L2 CacheVictim[87]AMDExclusive Cache情有独钟,基于K7K8K10的一系列微架构均使用了这一结构。在当时AMD凭借着Cache Hierarchy结构上这些貌似微弱的领先优势,迎来了其历史上风光无限的时代。Intel直到Nehalem微架构之后才真正超越了AMD,并开始在Cache Hierarchy领域上的一骑绝尘。

AMD最新的Bulldozer微架构在Cache Hierarchy层面上做出了较为激进的改革,虽然在L1 Cache层面依然使用VIPT方式,大小为16KB,却也不再坚持之前微架构3CycleLoad-to-use Latency,而是扩大到4CycleLatency的提高使得BulldozerL1 Cache层面使用128位总线带宽成为可能,提高了总线的带宽。

L2 Cache由两个CPU Core共享,最大可达2MB,这使得Exclusive Cache的组成方式失去意义,不出意外Bulldozer微架构采用了NI/NE方式。最令人意外的是该微架构L2 CacheLoad-to-use Latency达到了18~20Cycle,远高于NehalemSandy Bridge微架构的10Cycle[74][12][69]。但是与NehalemSandy Bridge相比,Bulldozer微架构提高了可并发的Outstanding Cache Miss总线请求,L1 CacheMiss的可并发总线请求为8个,L2 Cache Miss的可并发总线请求为23个。

Bulldozer微架构这些设计必然经过详尽的Qualitative ResearchQuantitative Analysis,在没有获得精确的性能数据之前,无法进一步诠释Bulldozer微架构的优劣。事实上即便你拿到这些数据,又能够说明多少问题。这些数据很难真正地做到公正全面,在很多情况之下依然是一个片面的结果。此时可以肯定的是,AMD依然不断前进摸索,在工艺落后Intel的事实中正在寻求新的变化,这个公司值得尊敬。

Bulldozer微架构放弃了Exclusive Cache结构必定基于其深层次的考虑。即便是通过简单的理论分析,Exclusive Cache也并非完美。Exclusive CachePure Inclusive Cache的另一个极端表现方式,Inner CacheOuter Cache间依然紧耦合联系在一起,这造成了各级Cache间频繁的数据交换,尤其是Inner CacheVictim Cache之间的数据颠簸。在CMP组成的ccNUMA处理器系统中这种颠簸更加凸显。

首先在OuterCache作为Inner CacheVictim时,Outer Cache仍需要监控发向Inner CacheRequestReply等信息,加大了Outer Cache Controller的设计难度。其次在一个CMP处理器系统中,某个CPU Core发起的Snooping操作,必须要同时Probe其他CPU CoreOuter Cache TagInner Cache Tag

Inner CacheTagProbe操作必将影响当前CPU CoreInner Cache的访问延时,而这个延时恰是单个CPU Core设计所重点关注的内容,处于关键路径。如果每次Probe操作都直接访问L1 CacheTag,将影响CPU CoreL1 Cache的访问,可能会Stall指令流水线的执行,带来严厉的系统惩罚。

通常情况下,处理器可以使用两种方法解决这类问题。一个是设置专用的Snoop Filter,处理来自其他CPUSnoop Transaction,减少对Inner Cache不必要的Probe,对于Exclusive Cache设置Snoop Filter需要额外的逻辑,而Inclusive Cache较易实现Snoop Filter。另一种方法是复制Inner CacheTag,实现CPU Core访问Inner Cache TagSnoop的并行操作。

这两种方法都会带来额外的硬件开销,从而加大了Cache Controller的设计难度。不仅如此,在Cache Hierarchy的设计中每加入一个Buffer都要细致考虑Memory Consistency层面的问题,各类复杂的Race Condition处理和由此带来的Transient State。这一切使本身已经极为复杂的Cache Controller,更加难以设计。

NI/NE CacheExclusive CacheInclusive Cache的折衷。IntelP6处理器开始一直到目前最新的Sandy Bridge处理器,一直使用这种结构。Intel也曾经尝试过ExclusiveInclusive Cache结构,最终坚持选择了NI/NE结构,也开始了Intel x86Memory Hierarchy领域的领先。但是我们不能依此得出NI/NE结构是最优的结构,也不能认为这个结构是一个很古老的设计而应该淘汰,在没有得到较为全面的量化结果之前,很难做出孰优孰劣的判断。即便有这些结果也不能贸然作出结论。

在使用NI/NECache结构时,Inner CacheOuter Cache的部分将内容重叠,与Inclusive结构相比,Cache容量利用率相对较高,但是仍然不及Exclusive Cache结构,因为Accidentally Hit的原因,NI/NE Cache容量利用率与Inclusive Cache相比,提高得较为有限。单纯从这个角度出现,在设计中并没有使用NI/NE Cache结构的强大动力。

此外采用NI/NECache方式时,在Outer Cache中不保证包含Inner Cache中的全部信息,因此其他CPU CoreSnoop 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)位,即可克服InclusiveExclusive Cache存在的诸多缺点,并带来许多优点,如消减Outer CacheConflict Miss,充分利用Inner CacheOuter Cache间总线带宽,Write Allocate on Inner Cache without Outer Cacheinteraction,减少不必要的RFO(Read for ownership)操作等。

我无从辩驳这些确实存在的优点,但是更加关心这些优点从何而来。从一个工程师的角度上看,NI/NE Cache带来的最大优点莫过于简化了Cache Hierarchy的设计。与使用InclusiveExclusive Cache结构相比,采用这种方式使得Inner CacheOuter Cache间的耦合度得到了较大的降低,也因此降低了Cache Hierarchy的设计难度。

耦合度的降低有助于InnerOuter Cache Controller设计团队在一定程度上的各自为政。这种各自为政的结果不仅仅提高了Cache Controller的效率,更重要的是提高了设计人员的工作效率。但是这种各自为政只是在一定程度上的,InnerOuter CacheInner这个事实决定了Inner CacheOuter Cache无论采用何种方式进行互联,依然存在大的耦合度。

NI/NE Cache结构并不是Intel x86处理器的全部。Intel近期发布的NehalemSandy Bridge处理器,在使用NI/NE Cache的同时,也使用了Inclusive CacheNehalem EP处理器含有4CPU Core,其中每一个CPU Core含有独立的L1L2 Cache,其中L1L2 CacheInner Cache;而所有CPU共享同一个L3 Cache,这个L3 Cache也被称为LLC或者Outer Cache

其中L1Cache32KB的指令Cache32KB的数据Cache组成,采用NI/NE结构;L2 Cache的大小为256KB,采用NI/NE结构;L3 Cache的大小为8MB,采用Inclusive结构,即该Cache中包含所有CPU Core L1L2 Cache的数据副本。Inclusive LLC也是一个天然的Snoop filter。在LLC中的每一个Cache Block中都含有一个由4位组成的Valid Vector字段,用来表示LLC中包含的副本是否存在于4CPU CoreInner Cache[12]

ValidVector[i]1时,表示第iCPU CoreInner Cache中可能含有LLC中的Cache Block副本,因为NI/NE结构的缘故,Valid Vector[i]1并不保证Inner Cache中是L1还是L2 Cache中含有数据副本,仍然需要进一步的Probe操作;当Valid Vector[i]0时表示,第iCPU CoreInner Cache中一定不含有LLC中的Cache Block副本[12]

LLCValid Vector字段可以简化由Nehalem EP/EX处理器组成的ccNUMA处理器系统中的Cache Coherency。因为LLC可以代表一个Nehalem EP/EX处理器中的所有Cache,当其他Socket进行Snoop Cache时,仅需首先访问LLC即可,而不必每一次都需要Probe所有InnerOuter Cache,从而简化了Cache Hierarchy的设计。

Sandy Bridge处理器的Snoop Filter的设计与Nehalem EP/EX处理器类似,只是进一步扩展了Nehalem EP/EX处理器的Valid Vector字段,以支持内部集成的GPU[69]。采用Exclusive Cache结构的Magny Cours6MBL3 Cache中划出了1MBProbe Filter Directory作为Snoop filter[87],而且提高了Cache Controller的设计复杂度。

AMD在其工艺落后于Intel,在相同的Die Size只能容纳更少晶体管数目的劣势下,使用规模庞大Probe Filter Directory有利于多个CMP系统间Cache一致性的实现,尤其在4个或者更多Socket的场景。但是即便是在这个场景下,AMD仅依靠Probe Filter Directory并不足以超过IntelSandy BridgeLLC层面的实现几乎独步天下,不仅运行在Clock Frequency,而且其Load-Use Latency仅为26~31Cycles[69]

除此之外SandyBridgeLLC的实现中使用了Distributed的方式,将一个LLC分解为多个Slice,其中每一个CPU Core对应一个SliceCPU Core经过Hash结果访问各自的Slice。这种Partitioning Cache Slice降低了Cache Coherency的设计难度,进一步提高了LLC的总线带宽,提高了LLCScalability,避免了潜在的Cache Contention[69]AMDMagny Cours也支持这种Cache组织方式[87]。除此之外,NI/NE with Inclusive Cache还可以使用一些手段进一步优化,如[90]中介绍的TLA(Temporal Locality Aware)算法。

无论是Intel采用的NI/NE Inner CacheInclusive Outer Cache的结构,还是AMD采用的Exclusive Cache结构[3],在Cache Hierarchy的设计中,只有耦合程度相对较低的区别。如果从数字逻辑的设计角度上看,这些设计都是耦合的不能再耦合的设计。

在很多场景中,一个完美的设计通常从少数人开始,这也意味着设计的强耦合,一体化的设计有助于整体效率的提高,但也很容易扼杀子团队的创造热情。一个将完美作为习惯的架构师最终可以左右一个设计,创造出一个又一个属于他的完美设计。这样产生的完美,不可继承,不可复制,等待着粉碎后的重建。这样的完美本身是一场悲剧,这些悲剧使得这些完美愈显珍贵。

不同群体对完美的不同认知使得这些悲剧几乎发生在每朝每代。这些完美的人不可轻易复制,使得一个大型设计通常选用多数人基于这个时代赋予认知后的完美,属于多数人的完美。这使得架构师在设计产品时,若只考虑技术层面,而不考虑设计者间的联系,并不称职。这也使得一个优秀的架构师在历经时光痕迹,岁月沧桑后,做出了很多不情愿也不知对错的中庸选择。这些中庸可能是大智慧。而总有一些人愿意去挑战这些中庸。



[1]本文介绍的Athlon处理器采用的L2 CacheFull-Speed On-Die L2 Cache

[2]原图来自[89],并有所改动。笔者并不认同该论文的部分内容,仅引用该图。

[3]Magny Cours微架构并不是严格意义的Exclusive CacheL3 Cache需要检查True Sharing状态[76]

0 0
原创粉丝点击