3.1 Cache Coherency
来源:互联网 发布:柏曼灯具怎么样知乎 编辑:程序博客网 时间:2024/05/23 13:13
CacheCoherency产生的原因是在一个处理器系统中,不同的Cache和Memory可能具有同一个数据的多个副本,在仅有一个数据副本的处理器系统中不存在Coherency问题。维护Cache Coherency的关键在于跟踪每一个Cache Block的状态,并根据CPU Core的读写操作及总线上的相应Transaction,更新Cache Block的状态,借此维护Cache Coherency。Cache Coherency可以使用软件或者硬件方式保证。
在使用软件方式维护时,CPU需要提供专门的显式操作Cache的指令,包括Cache Block Copy,Move,Eviction和Invalidate等指令,多数微架构都提供了这样的指令,如PowerPC处理器设置的dcbt,dcbf,dcba等指令[43]。
程序员可以使用这些指令,维护处理器系统的Cache Coherency。在进行DMA操作之前,可以将数据区域与主存储器通过软件指令保证Cache Coherency,进行DMA操作时,不需要硬件来维护Cache Coherency。在某种情况下,使用这种方式可以提高数据传送效率。
软件维护CacheCoherency的优点是硬件开销小,缺点在多数情况下对性能有较大影响,而且需要程序员的介入。多数情况下Cache Coherency由硬件维护。不同的处理器使用不同的Cache Coherency Protocol实现Cache Coherency。这些Protocol维护一个有限状态机FSM(Finite State Machine),根据存储器读写指令或者Bus Transaction,进行状态迁移和相应的Cache Block操作,隐式保证Cache Coherency,不需要程序员的介入。
根据Cache CoherencyProtocol维护Cache Block状态方法的不同,处理器可以使用Bus Snooping和Directory这两大类机制。这两类机制的主要区别在于Directory机制全局统一管理不同Cache的状态;而在Bus Snooping机制中,每个Cache分别管理自身Cache Block的状态,并通过Interconnection进行不同Cache间的状态同步。
无论采用哪种机制,CoherencyProtocol所要求的Cache Block操作都可以通过Invalidate,Update或者Read Snarfing策略完成。Update和Read Snarfing策略需要更多的总线操作,对带宽和延迟都有很大影响,多数Cache Coherency Protocol采用了Invalidate策略。
最为经典的总线监听协议Write-Once[60]由James Goodman于1983年提出,是在x86,ARM和Power处理器中大行其道的MESI Protocol(也叫Illinois Protocol)的前身和一种变体,或者说是一种具体实现。
Write-OnceProtocol的实现关键在于其使用的特殊的Cache回写机制,即Write Once。Write-Once是Write-Back和Write-Through的综合。当使用这种机制时,对一个Cache Block进行第一次回写时,采用Write-Through策略将数据同时回写到Cache和主存储器,之后的写操作采用Write-Back,只回写到Cache而不回写到主存储器。
这种设计有利于在带宽和CoherencyProtocol的复杂度之间取得均衡。Write-Back机制能够有效节约带宽,但是由于主存储器中并没有最新的数据副本,增加了维护Cache Coherency的开销。Write-Through则相反。有关Write-Back和Write-Through的详细信息可以继续阅读本篇的后续章节。
通过之前的描述可以发现,在任何一种CacheCoherency Protocol中,每个Cache Block都有自己的一个状态字段。而维护Cache Coherency的关键在于维护每个Cache Block的状态域。Cache Controller通常使用一个状态机来维护这些状态域。
使用Write-Once回写机制实现Cache Coherency时,每一个CPU Core中的Cache Block需要设置4个状态位,用以识别当前Cache Block的状态,处于这些状态的Cache Block在收到不同的输入后,将进行状态迁移,以保证Cache Coherency。
- Invalid位。表示当前Cache Block不含有有效数据,是个无效Cache Block。
- Valid位。表示当前Cache Block的数据为最新,在主存储器中拥有该Cache Block的数据副本。在Eviction时不需要回写主存储器。其他CPU Core的Cache中可能含有该Cache Block的数据。在这个Cache Block中的数据可能与其他CPU Core中的Cache共享,各个共享数据副本都为最新的值,即与主存储器同步。在进行存储器读操作后,Cache Block可能处于该状态。
- Reserved位有效表明该Cache Block中的数据是最新的,在主存储器中拥有该Cache Block的数据副本。在Eviction时不需要回写主存储器。其他CPU Core的Cache中不能含有该Cache Block的数据。这是由第一次对该数据进行写操作所达到的状态,读者可以简单回忆write-once的写回机制。
- Dirty位。表示该Cache Block中的数据是最新的,而且只有该Cache Block拥有这个最新的数据副本,而且与主存储器不同步。主存储器和其他CPU Core的Cache中没有这个数据副本。这是通过对该数据反复进行写操作所达到的状态,读者可以再次回忆Write-Once的回写机制。
根据以上这几种状态,我们简要分析基于Write-Once协议的Cache Coherency Protocol,其FSM描述如图3‑1所示,其中右图是使用Write-Once协议的处理器系统示意图。在该处理器系统中含有两个处理器,而且只有一级Cache,分别为C0和C1,通过共享总线方式与主存储器进行连接。
在学习基于Write-Once策略的Cache Coherency Protocol时,需要将状态机迁移与处理器互联拓扑进行对照。在Write-Once状态机中含有四个状态,分别为Invalid,Valid,Dirty和Reserved。Cache Block处于这些状态时,可以接收到四种输入请求。
这四种输入请求也是不同处理器的CacheController所接收到四种读写操作,即状态机中的输入信号,包括总线读BR(Bus Read),总线写BW(Bus Write),处理器读PR(Processor Read)和处理器写PW(Processor Write)。当Cache Controller监听到对某个Cache Block的操作的时候,将根据当前Cache Block的状态进行迁移。
总线读BR表示Cache Controller监听到了来自总线的读操作。该操作的产生原因是处理器读取的数据不在其本地的Cache中,需要查找主存储器或者其他处理器的Cache。如果此时另外一个处理器的Cache含有该数据最新的副本,该处理器的Cache Controller将提供这个最新的副本,即Data Refill,当该数据副本为Dirty时,需要将数据回写到主存储器,并将自身的状态迁移为Valid,表示这个数据被多个Cache共享。
总线写BW表示某个CPU的Cache Block需要回写主存储器。如果总线写BW是第一次对Cache Block进行写操作时产生,此时使用的是Write-Through策略,而不是Write-Back。特别注意的是,Cache Block因为Replacement而回写到主存储器时不会产生总线写BW。
如果某个处理器的CacheController监听到了总线写BW,并且在自身Cache中含有数据的一个副本。此时该Cache Block处于Valid,Reserved或者Dirty状态,首先需要向发起总线写的处理器提供这些数据,即进行Data Refill操作,之后Invalidate这个Cache Block中的副本,并将状态迁移到Invalid。
处理器读PR是处理器读取本地Cache时产生的Transaction。如果本地Cache没有命中,或者处于Invalidate状态,将通过Data Refill操作获得相应的数据,此时该Cache Controller将发出总线读BR,从其他CPU Core的Cache中获得数据副本,之后将状态迁移到Valid。如果此时Cache Block为Valid,Reserved或者Dirty状态时为Cache命中,维持原状态不变。
处理器写PW是处理器向本地Cache写数据时产生的Transaction。在Write-Once策略使用的特殊回写机制中,如果处理器是第一次对该数据进行写操作,该Cache Block状态将迁移为Reserved,表明只有当前Cache Block和主存储器拥有数据副本。
此时CacheController将使用总线写BW Invalidate其他处理器中的数据副本。如果是对该数据的后续写操作,则只写回Cache,从而使状态迁移为Dirty,表明只有当前本地Cache含有该数据副本,此时不会产生BW信号。另外需要注意的是,如果某个数据因为某种原因被替换到主存储器,之后又被再次读入Cache时,对它的写操作也相当于第一次,相当于维护对同一个数据的新的Cache Coherency周期。
除了从CacheController的角度分析这些状态迁移之外,还可以从处理器的角度认识Write-Once机制。处理器访问Cache时,可能会出现Read Miss,Read Hit,Write Miss和Write Hit这四种情况。我们分别讨论这四种情况。
如果发生ReadHit,命中的Cache Block一定处于Valid,Reserved或者Dirty状态。Read Hit不会改变该Cache Block的状态。如果发生Read Miss,则该Cache Block的当前状态或者是Invalid或者不在本地Cache中。此时Cache Controller会产生一个总线读BR,从其他处理器的Cache获得所需的数据,该数据会同时存在于主存储器中。此时将Cache Block状态将迁移为Valid,表示此时Cache Block中的数据和主存储器一致,并且其他处理器的Cache可能拥有该数据的副本。
如果发生WriteHit,则根据该写操作是第一次还是后续写,将状态分别迁移到Reserved或者Dirty状态。如果是第一次写操作,进行Write-Through操作的同时也会产生总线写BW,以保证本地Cache中的数据是除主存储器之外唯一的副本。如果发生Write Miss,则该Cache Block的当前状态或者是Invalid或者不在本地Cache中,这次写操作一定是第一次写,因此将迁移为Reserved。
Write-Once协议的实现要点在于第一次写操作采用Write-Through,并通过Write-Through产生的总线写BW,Invalidate其他处理器Cache中的相应数据副本,使本地Cache中的数据成为除了主存储器以外的唯一副本,从而维护Cache Coherency。
MESIProtocol,也被称为Illinois Protocol[66],是大多数SMP处理器维护Cache Coherency采用的策略,其实现与Write-Once Protocol大同小异,虽然这种Protocol出现得相对较晚,却得到了更广泛的应用。目前主流的处理器,如x86,Power,MIPS和ARM处理器,均使用类MESI协议维护Cache Coherency。
MESIProtocol的得名源于该协议使用的Modified,Exclusive,Shared和Invalid这四个状态,这些状态对应Write-Once协议使用的Dirty, Reserved, Valid, Invalid四个状态,所表达的含义也大致相同,但是仍然有些微小区别。标准的MESI Protocol还有一些变种,如MOESI和MESIF等一系列协议。
值得额外关注的是,一个CacheBlock除了要使用MESI这些基本的状态位之外,还包含许多辅助状态位,共同维护Cache Coherency。考虑多级Cache间的联系和各种Race Condition的处理情况,MESI Protocol的实现比想象中难出许多。在标准Illinois Protocol中定义了以下四种状态。
- M(Exclusive-Modified)有效表示当前Cache Block中包含的数据与主存储器不一致,而且仅在当前Cache中有正确的副本。
- E(Exclusive-Unmodified)有效表示当前Cache Block中的数据在当前Cache及主存储器中一致。M和E状态都表示Exclusive状态,一个Dirty,一个Clean。
- S(Shared-Unmodified)有效表示当前Cache Block中的数据至少在当前Cache及主存储器中有效,在其他处理器的Cache中也可能含有正确的副本。
- I(Invalid):当前Cache Block无效,不包含有效数据。
Illinoisprotocol和Write-Once协议的最大不同在于回写机制。Illinois Protocol在写命中时的策略只有Write-Back,而Write-Once区分第一次写和后续写。在使用Write-Once协议时,第一次写时采用Write-Through策略非常重要,正是通过第一次Write-Through产生的总线写BW Invalidate其他副本从而维护Cache Coherency。
在使用Write-Back策略的Illinois Protocol中,一个处理器进行Cache写操作时,将主动广播一个Invalidate Transaction,也被称为RFO(Request For Ownership)。Illinois Protocol根据Write Miss与Write Hit两种情况,将Write-Once协议使用的总线写BW,分解为BRI(Bus Read with Invalidate)和BI(Bus Invalidate Observed)两类Invalidate信号。下面着重分析状态机中与BRI和BI相关的状态迁移,其余情况和Write-Once协议的处理较为类似。Illinois Protocol的FSM描述如图3‑2所示。
当CacheBlock处于Invalid状态时,如果Cache Controller收到来自总线的信号时,如BR,BRI和BI,将保持原状态不变;如果Cache Controller收到处理器写PW时,将出现Write Miss,此时Cache Controller会广播一个BRI信号,表示需要从其他处理器中读取该数据,进行Data Refill,并且Invalidate其他所有副本,这也是该操作也被称为Bus Read with Invalidate的原因,之后该Cache Block的状态迁移为Modified,表示拥有唯一最新的副本。
当CacheBlock处于Shared状态时,如果收到处理器写PW信号,会广播一个BI信号,表示本地Cache有最新的副本,但是在进行写操作前需要Invalidate其他副本,之后该Cache Block的状态将迁移为Modified。如果处于Shared状态的Cache Block收到来自总线的BRI或者BI Transaction时,将Invalidate本地Cache副本,并且状态迁移为Invalid;如果收到总线读时BRI需要向请求段提供该数据的副本以做Data Refill。
当CacheBlock处于Exclusive状态时,在处理器系统中的所有Cache中只有本地Cache拥有数据副本,因此不可能收到来自总线的请求BI;如果收到来自总线的请求BRI,需要向请求方提供该数据的副本以做Data Refill,并且迁移至Invalid状态。
当CacheBlock处于Modified状态时,在处理器系统中的所有Cache中只有本地Cache拥有数据副本,因此也不可能收到来自总线的请求BI;如果收到来自总线的请求BRI,需要向请求方提供该数据的副本以做Data Refill,并且迁移至Invalid状态。
MESI协议有一个重要的变种,即MOESI。DEC Alpha21264,AMD x86,RMI Raza系列处理器,ARM Cortex A5和SUN UltraSPARC处理器使用了这种协议。基于MOESI协议的FSM描述如图3‑3所示,该模型基于AMD处理器使用的MOESI协议。不同的处理器在实现MOESI协议时,状态机的转换原理类似,但是在处理上仍有细微区别。
MOESI协议引入了一个O(Owned)状态,并在MESI协议的基础上,进行了重新定义了S状态,而E,M和I状态和MESI协议的对应状态相同。
- O位。O位为1表示在当前Cache行中包含的数据是当前处理器系统最新的数据拷贝,而且在其他CPU中可能具有该Cache行的副本,此时其他CPU的Cache行状态为S。如果主存储器的数据在多个CPU的Cache中都具有副本时,有且仅有一个CPU的Cache行状态为O,其他CPU的Cache行状态只能为S。与MESI协议中的S状态不同,状态为O的Cache行中的数据与主存储器中的数据可以不一致。
- S位。在MOESI协议中,S状态发生了微小变化。当Cache Block状态为S时,其包含的数据并不一定与存储器一致。不存在状态为O的副本时,Cache Block中的数据与存储器一致;存在状态为O的副本时,Cache Block中的数据与存储器不一致。
在MOESI模型中,Probe Read表示主设备从其他CPU中获取数据拷贝的目的是为了读取数据;Probe Write表示主设备从其他CPU中获取数据拷贝的目的是为了写入数据;Read Hit和Write Hit表示当前访问在本地Cache中获得数据副本;Read Miss和Write Miss表示当前访问没有在本地Cache中获得数据副本;Probe Read Hit和Probe Write Hit表示当前访问在其他CPU的Cache中获得数据副本。
我并不喜欢图3‑3的FSM,更倾向使用图3‑1和图3‑2中的描述,下一版将统一使用BR/BW和PR/PW模型。MESI Protocol广泛应用与Bus-Snooping结构,CMP间的Cache Coherency常使用Directory Protocol。
与Bus-Snooping相比,Directory Protocol所带来的Latency较长,但是Bus Traffic较少,下一版会主要基于Stanford FLASH和DASH[64][65]去书写这部分内容。Intel Sandy Bridge EP系列处理器也使用了这种结构,目前没有公开详细实现。AMD的Magny-Cours中也使用了这种方式进行Cache Coherency,但是也没有公开最新的Bulldozer处理器的实现。还有一个适用与Ring-Bus的Token Protocol值得关注,准备下一版书写。目前暂时如此。
[1]图3‑1来自Yale N. Patt的讲义。
[2]图3‑2来自Yale N. Patt的讲义。
- 3.1 Cache Coherency
- cache Coherency
- cache coherency
- cache coherency when using dma
- cache coherency VS memory consistency
- PIO Cache Coherency Issue on Cortex A9
- 缓存一致性(Cache Coherency)入门
- 缓存一致性(Cache Coherency)入门
- 缓存一致性(Cache Coherency)入门
- 缓存一致性(Cache Coherency)入门
- 缓存一致性(Cache Coherency)入门
- 缓存一致性(Cache Coherency)入门
- 缓存一致性(Cache Coherency)入门
- 缓存一致性(Cache Coherency)入门
- 聊聊FPGA/CPU/PCIE/Cache-Coherency/CAPI
- 聊聊FPGA/GPCPU/PCIE/Cache-Coherency/CAPI1.0
- 聊聊FPGA/GPCPU/PCIE/Cache-Coherency/CAPI1.0
- 第3章 Coherency and Consistency
- 每日170212
- 2.5 指令Cache
- 2.6 Cache Never Block
- CSS属性之margin
- 第3章 Coherency and Consistency
- 3.1 Cache Coherency
- 第4章 Cache的层次结构
- 站长网播报:电视盒子遭封杀 1000多人卷入微信传销案
- 4.1 Cache层次结构的引入
- 4.2 存储器读写指令的发射与执行1
- 4.2 存储器读写指令的发射与执行2
- 软件开发本质论——自然之路
- 4.3 Cache Controller的基本组成
- 4.4 To be inclusive or not to be…