第六章:Coherence Protocols

chapter6:cache coherence

1、大局观

coherence的目标,具体包括:

  1. 单写多读(single-writer-multiple-reader, SWMR)不变性:对任何内存地址A,在任何时间点上只存在一个可以向A写入的内核,但可以存在多个从A读取的内核。
  2. 数据-值(data-value)不变性:一个内存位置在一个时间片开始时的值与该内存位置在其上一个时间片结束时的值相同。

为了上述这些性质,可以把每个存储结构(包括cache、LLC、内存)与coherence contorller连接起来,构成一个分布式系统,控制器之间交换信息。下面两张图展示了缓存控制器与LLC/内存控制器的功能。对于cache的coherence controller称为cache controller,如下图所示。

controller接受来自core的load和store指令,并将load值返回到核心。cache miss发生时,controller发起一笔coherence transaction,并且这笔transaction通过network与其他controller交互。transaction的类型及格式取决于特定的一致性协议。

每个block对应一个有限状态机,根据当前event改变block的状态,多个相同的状态机构成controller。

2、指定一致性协议

一般可以通过定义controller的行为来定义coherence协议,通常用表格的形式来说明,如下图所示。

3、简单coherence协议示例

为了方便理解举一个简单例子,假设所有处理器通过共享总线(一个Core发送的消息可以被所有Core看到)连接,假设每个缓存行可以在两个稳定态:I(Invalid)和V(Valid)。

根据cache行为分析,可以得到使用三种总线消息传输实现的两种一致性事务:Get请求一个缓存行;数据回复(DataRep)传输一个缓存行的数据;Put将缓存行内容写回LLC/memory。当发生load/store miss时,缓存控制器发送Get消息,并等待即将到来的DataResp消息。上图中前缀Own表示自身Core的请求,Other表示其它Core的请求。

IV_D是指瞬态,当前block状态为ivalid,在等待data response变为valid。在IV_D瞬态中,如果cache controller收到了load/store请求或者需要evict缓存行的请求,都采取Stall等待的措施,这是因为IV_D在逻辑上属于I状态,一方面自然不能满足load/store的请求;另一方面如果对evict请求不stall而直接evict该缓存行的话,最后会产生I状态的缓存行接收到了有可能是dirty的DataResp,由于不是预期的请求,缓存行不会做出任何反应,进而使得dirty的数据没有写回memory,造成错误。

4、coherence设计空间概述

状态

在只有一个参与者的系统中(如没有coherent DMA的单核处理器),一个缓存行的状态是有效(valid)或者无效(invalid)。或许在需要分辨缓存行是否是脏的时候可能需要两个有效状态。在多个参与者的系统中也可以只使用两三个有效状态,但我们通常使用多个有效状态来标志缓存行的某些特性。这些特性有:

  • 有效性(validity):该缓存行有最新的值。
  • 脏(Dirtiness):就像单核系统一样,缓存行拥有最新的值,该值区别于LLC/memory,缓存控制器需要最终将其写回LLC/memory。
  • 独有(Exclusivity):缓存行在系统中只有一份存在于某个核心的private cache(没有其它共享者)。
  • 所有权(Ownership):如果该缓存控制器负责响应对某个缓存行的所有请求,那么称该缓存控制器是该缓存行的所有者。

稳定状态

MOESI协议

过渡状态

在复杂的协议中,我们可能会有几十个过渡状态,我们用XY_Z的形式来表示这些状态,如IV_D表示在Invalid状态中,准备进入Valid状态,且正在等待DataResp。

LC/内存中的状态

有两种命名这些状态的方法:

  1. 以缓存(cache)为中心:一个缓存行在LLC和内存中的状态是该行在缓存中的状态的集合,例如,如果该行在所有缓存中状态都是I,那么在LLC/内存状态也是I,如果在一个或多个缓存中的状态是S,那么LLC/内存状态就是S,如果在一个缓存中状态为M,那么LLC/内存状态就是M。
  2. 以内存(memory)为中心:一个缓存行在LLC/内存中的状态对应于内存控制器对该行的权限(而不是缓存的权限),例如,如果该行在所有缓存中状态都是I,那么在LLC/内存控制器中的状态就是O(而不是以缓存为中心的方法中的I),如果在一个或多个缓存中的状态是S,那么LLC/内存的状态也是O,如果在一个缓存中状态为M或O,那么LLC/内存的状态就是I。

后面我们都使用以缓存为中心的命名方法来表示LLC/内存中的缓存行的状态。

posted @ 2024-05-06 11:41  骑猪上树的少年  阅读(47)  评论(0编辑  收藏  举报
回到顶部