AMBA-CHI协议和一致性维护及CMN600

CHI协议是如何维护cache的一致性?靠的是哪些机制?

首先给出答案:CHI靠的就是Directory+snoopFilter来完成一致性维护,详细内容可参考下文。

1.什么是CHI的snoop

1.1 snoop是什么

有人把snoop简单的翻译为监听/嗅探,这对于CHI协议来说并不全面。CHI的HN/MN节点会监听各个RN的读写请求,从而能够在HN/MN中维护一个各RN中cacheLine的状态表-----这个状态表有的地方叫Directory。另一方面当HN/MN收到RN的读写请求时,会根据Directory的查询结果向其他RN发送不同的snoop请求。

所以snoop包含两部分:

  1. 监听RN状态
  2. 发送snoop请求

总线在维护cache一致性时,通知相关cache的操作称为snoop; snoop操作分为两种类型:全部通知和精准通知

  • 全部通知就是通知所有的cache来查询自身是否有与此操作相关的cache line, 这种做法的缺点是由于共享的cache line毕竟是少数的,所以CPU需要处理很多与自身不相关的snoop请求,从而增加CPU的资源开销。由于多数snoop都是无效的,因此全部通知也会浪费总线的资源。
  • 精准通知是指总线会记录各个cache中cache line的信息,当有请求时,先通过snoop filter来筛选出相关的cache并发送snoop。Snoop filter中记录了各个cache line的地址信息和状态信息。目前一致性总线大多采用精准通知的方式,虽然snoop filter增加了总线的资源开销,但是减少了CPU侧的资源开销,同时也避免总线发送不必要的snoop。

一致性总线通过snoop filter来记录各个cache中的cache line状态,在总线的视角中,cache中每个cache line的状态都在掌握之中。

1.2 snoop filter

1.1节描述的snoop操作全部通知,在节点比较少的系统中,系统还负担得起全部通知的代价,随着处理器的增多,总线的负荷就越来越大(这也是Hub让位于Switch的原因之一),因此就导致了SnoopFilter出现。snoopFilter就是1.1节精准通知对应的snoop策略

Snoop Filter通过添加一个硬件过滤器来解决这个问题。它会对总线进行嗅探,并过滤掉不相关的数据,只将对缓存一致性有影响的数据传输给相关处理器,从而减少了通信量。在Snoop Filter中,每个缓存行都有一个标记位,标记该缓存行是否被缓存了【就是Directory里的记录】。当一个处理器想要访问某个内存地址时,它会首先检查该地址对应的缓存行是否被标记了,如果标记了,则该处理器会直接从缓存中读取数据,而不是向总线发送请求。

Snoop Filter还有一个重要的作用是处理器之间的同步。当一个处理器修改了缓存中的数据时,该处理器先向HN发makeInvalid或makeUnique,然后HN(SF)会向总线发送一个信号,通知其他处理器对应的缓存行已经无效。其他处理器接收到该信号后,会将对应的缓存行标记为无效,下次再访问该地址时就会从内存中重新读取数据,从而保证了缓存的一致性。

总之,Snoop Filter通过硬件过滤器过滤掉不相关的数据,从而减少了通信量,并通过处理器之间的同步保证了缓存的一致性。

2.CHI是如何完成cache一致性维护的

 第2章主要摘自ABMA CHI协议学习 - 知乎

2.1 cache state

常用的cache一致性协议有:AXI ACE和CHI。在ACE和CHI中分别定义了cache的state,而cache state是进行一致性维护的基础。ACE定义了MESI和MOESI这两种状态,可以参考附录1,先说一下CHI的cache state。

我们照着例子讲吧,搞一个简单点的例子

假设现在所有的cache都没有数据

–cpu0从DDRC读了一个数据到L00,这个数据地址是0x0010,数据是0x1111。那么L00有这个数据了!

2.1.1 cache的状态属性

先定义一下cache state model,在一个cache,有一个数据,这个数据给定义了这几种属性:

1)valid跟invalid:这个好理解呀,你读回来一个数据,你这个cache这个数据就是valid的,如果这个数据在其他cache修改了,你这就是个旧数据,那就是invalid。

比如说cpu1也读到这个数据了,也就是L01也有这个数据。然后cpu0改写了这个地址的数据,那你L01里面的就是旧数据,就是invalid的了。

2)Unique跟Shared:Unique的意思是这个地址的数据,只在我这个cache里面有,其他的cache都没有这个数据。Shared的意思,请注意!!!,Shared表示可能有其他cache里面有这个数据,仅仅是可能而已!

比如说cpu0读到的这个数据,L01里面必须没有这个地址的数据,就Unique。如果cpu0读到的这个数据状态是Shared,那L01里面可能有这个地址的数据,也可能没有。

3)clean跟Dirty:这个有一点点复杂,简单说来,根据有没有责任更新主存来。Dirty呢,表示我有责任要更新主存。Clean呢,表示我没有责任更新主存。为啥要更新主存呢,就是因为cache里面的数据跟主存里面的数据不一样,有新数据了。那是不是一个cache有新数据了,就有责任更新主存了?诶不一定哟!

比如说:cpu0读到的这个数据,然后改写了,原来数据地址是0x0010,数据是0x1111,现在跟主存里面的数据是一样的,所以没有责任更新主存,是clean的。

现在把数据改成0x2222了,诶!你就成了Dirty的了,你有责任要更新主存了。

但是现在cpu1从L00读到这个地址(可以不从主存里面读的)到L01,那么L01里面的数据也是0x2222了。那么!!两个cache的状态是什么呢!

答案是一个是Dirty,一个是Clean。哪个是Dirty,哪个是Clean呢!!??都!可!以!看怎么实现,反正现在两个cache数据都跟主存的不一样。至少而已只需要一个有责任去更新主存就好了,另一个clean。

4)FULL、Partial和Empty:一般来说呀,我们从主存里面不会只读一个地址8bit的数据呀,我们会读一个cacheline,一个cacheline可能可以512bit,可能更大也可能更小。假设我们是512bit也就是64Byte(怎么样,数学好吧),cpu0读到的这个64Byte的数据,然后cpu0改了其中1Byte,那你就叫做Partial Dirty了64Byte全改了就叫FULL Dirty那么Empty是个啥呢,就是你cache里面有一个地址,但是呢,没有数据。为啥要这么玩?看下面cacheline的state吧哈

cache state model这东西说来也是纯软的,跟Protocol属于同一种东西,但定义了这些东西是要为硬件服务的,怎么服务呢,看cacheline state。

2.2.2 cacheline state

cache state呢,讲的是属性,有这么些个属性,有点像软件定义的,跟硬件没啥关系,就是一纸协议。cacheline state呢,就有点硬了,这是要硬件实现滴。cacheline state有啥呢,感受一下吧

【我的理解就是把cache的状态属性组合起来描述一个实际的cacheLine状态】

  • I: invalid,就是cache state的那个invalid的意思
  • UC: Unique Clean
  • UD: Unique Dirty
  • UDP: Unique Partial Dirty
  • SC: shared clean
  • SD: shared Dirty
  • UCE: Unique clean Empty

CHI用的cacheline state就是以上这几个,什么意思看2.2.1应该很清楚了,但是还是详细的举两个例子来说明吧:就来SC以及UCE

1)SC

-CPU0读一个地址0x0010,数据0x1111,那L00里面就有这个数据,状态是UC。

-CPU1也读这个地址,那L00和L01都有数据,状态就都是SC了!

2)UCE

-假设现在CPU2要这个地址,但是不需要这个数据,为什么不需要这个数据呢,因为CPU2即将自己给这个地址赋值,那CPU2就申请说我的L02要这个地址是UCE的,然后要把CPU0和CPU1里面的这个地址的数据invalid掉。

-此时CPU0和CPU1里面这个地址数据就Invalid了,而CPU2就是UCE!

-为什么要这么搞,首先在soc里面知道,CPU2要往地址0x0010这个地址写一个数据进去,L02里面必须要有这个地址的数据。所以如果没有UCE这个状态,CPU2就必须去把地址0x0010的数据读到自己的cache里面去,但CPU2知道他要改写这个地址,你读回来的数据我不用,读了就是浪费时间浪费带宽呀。所以就搞了这个UCE,我只要一个地址,我不需要读数据。

两个例子讲完,其他的也可以自己想一下场景哟。

然后再来问题:为啥说cacheline state是硬的呢,这些cacheline state怎么用呢

这些cacheline state呢,是实实在在在芯片里面对每个地址每个cache记录下来的,记录在哪呢,记录在HN里面,称呼为目录结构“directory”。

这个directory记录着所有RN里面cache的每个cacheline的状态。我猜想,也许大概长这样

CACHEcachelineaddr state
L00addr0UC
L01addr0I

前面说的比如这个cacheline的state由UC变成SC了,诶!其实就是在HN里面把这个cacheline的状态改一下。怎么样,这东西,硬把!

【再借用另一篇文章中的图来描述cacheLine state如下:】

2.2 snoop操作怎么维护一致性

2.1节定义了cache state,还专门的HN搞了个directory来存各个cacheline的cache state,接着要怎么用才能保证一致性呢!

首先还是先介绍一下“单纯”的snoop是一个什么东西呢?按中文的理解呢,我们把它还是叫snoop,对于专用名词不翻译才是最信雅达的翻译。它的作用是这样子的,以下例子不是讲专门chi的,就是普通的soc互联,意思就是其他协议也有snoop:

假设cpu0要读地址addr=0x08的数据,这个数据L01有一份,DDRC里肯定也有一份,但是cpu0不知道这个事情,然后cpu0会发出一个读请求到HN,它会发一个snoop请求给到cpu1,然后cpu1把数据“可以”给HN,然后HN再把数据回给cpu0。

在这里面,按我的理解呢,HN来自cpu0的请求,然后发snoop操作给cpu1的这整个过程叫做snoop。然后HN发给cpu1的请求叫snoop请求,cpu1在这个过程叫做snoopee。

为啥我要强调这不是chi的例子呢,因为上个例子中间有个东西没有讲清楚,HN收到来自cpu0的请求,然后发一个snoop请求到cpu1,如果有cpu2,3,4,HN要不要都发snoop请求呢?

对于soc维持一致性的话,一般(我所知道的)就有两种,一种是hn只要收到一个请求,就snoop到所有的节点,假设cpu1有数据就回,如果snoop到cpu2,cpu2没有数据,那就不用回数据了,优点是HN不用搞个directory记录各个cacheline的状态,当然这不是chi。缺点也很明显,所有的请求你都要完整地snoop到各个节点,带宽啥的,有点笨。这种呢,就适合少节点的,要是2,3个节点那你就随便snoop吧,其实现在一般的消费者级别的芯片都是这种,ACE(协议),啥的。

另一种呢:就是chi这种,HN要搞个directory记录着各个cacheline,所以来了一个请求,我HN是知道哪个cpu有这个地址的数据的,所以每来一个请求,HN就查directory,查到哪个节点有数据,什么状态,就精准的往对应节点发snoop。

所以chi协议,是基于directory和snoop机制来维持cache一致性的一个系统

那就完整了,再来过一遍,chi是怎么保证cache一致性的吧。这一次我们来搞个稍微复杂一点的例子。

开始状态:就是下图啦,对addr0这个地址,cpu0和cpu1有data0数据,ddr有data1数据,cpu2没有这个数据。基于这个基本国情,我们可以看到,ddr里面的数据是比较旧的,cpu0,和cpu1,里的这个addr0应该是一个sc态,一个是sd态,我们假设cpu0是sd,cpu1是sc。不懂啥意思的看这里https://blog.csdn.net/q876507447/article/details/117792539?spm=1001.2014.3001.5501

然后我们想要的操作是:cpu2要在这个addr0这个地址,写一个再新一点的数据data2

保证一致性的目标:cache一致性的意思的,就是要保证不同cpu对同一个地址addr0看到的数据是一样的!

具体怎么操作呢!

cpu2发出一个写请求,然后HN收到这个写请求,开始查directory,然后看到cpu0是sd,cpu1是sc。那就往这两个cpu发snoop,把cpu1的sc直接干掉干成I态,告诉cpu1你cache里的这个地址的数据被干了。然后cpu0里面有新的数据,就HN就把cpu0的数据读给cpu2,然后也把cpu0的cacheline数据干掉,干成I态。(如果CPU2这个时候确定不需要cpu0的addr0的数据data0,也可以直接干掉cpu0的数据)。反正,cpu2想要对一个地址写,是一定要确保整系统中,其他cache都没有这个数据。也就是独占这个地址,才可以操作这个地址。

到现在为止,cpu0和cpu1上的cacheline都被snoop干掉了,然后cpu2有这个cacheline最新的数据(或者这个cacheline的独占的),然后cpu2这个时候再把要写的数据data2给到HN,HN负责merge一下,把之前从cpu0搞到的cacheline里面的地址的addr0对应数据换成data2,写回到ddrc,此时cpu2里的cacheline也是I态的。

ok,最后的结果是所有的cpux上都没有了addr0的最新的数据,最新的ddrc,谁要是想得到addr0的数据,你得重新读。

意思就是,所有cpu看到的addr0的数据现在就是一样的了。

上面讲的是最朴素的一种场景啊,实际中为了考虑性能啊啥的,还有更加花里胡哨的操作。就好比学数学,上面讲的都只有加减的操作啊

2.3 write-back/through和write-invalid/update

有一个疑问就是有的cacheLine是write-back的,也就是说processor修改了cacheline之后,并不会立即写到DDR中,那么HN是如何更新的呢?

这里就涉及到RN-F可以发送的请求了,RN-F不只是发送数据读写请求,还有很多cache 一致性维护请求

为了保证缓存一致性,处理器又提供了写失效(write invalidate)和写更新(write update)两个操作来保证cache一致性。

写失效:当一个CPU修改了数据,如果其他CPU有该数据,则通知其为无效;

写更新:当一个CPU修改了数据,如果其他CPU有该数据,则通知其更新数据;

write-update对带宽要求更高,一般都会使用write-invalidate。结合CHI,该协议中有个Write-Invalidate protocol,,所以CHI支持的是write-invalidate。

对于CHI协议来讲,这个过程可以描述为:

  1. RN-F发送makeUnique或makeInvalid或cleanInvalid请求给HN-F
  2. HN-F查找Directory,HN-F根据查找的结果给其他缓存该cacheLine的core发送snoop请求,snoop请求是根据HN-F接收的RN-F请求类型来确定
  3. snoopee反馈请求结果
  4. HN-F更新对应Directory状态,反馈结果给RN-F

更进一步来讲,其实无论是write-back还是write-through,都需要使用write-invalidate或write-update来保证一致性。换句话说write-back和write-through和一致性没有关系。

因为无论是write-back还是write-through,当前core都要通知其他保存有该cacheline备份的core。

3.CMN600

3.1 CMN600组件介绍

3.1.1 CMN600组件

CMN600是符合CHI协议的一种具体实现,这里着重讲两个点,一个是CMN600对组件的discovery,一个是CMN600的原子事务。

CMN(coherent mesh network)是一种CHI协议的具体实现的一致性维护IP。包含XP及连接到XP上的NODE。

XP:crosspoint是一个交换机或者路由器逻辑模块,它是CMN600传输机制的基本组成部分。

每个XP有四个mesh端口连接到四个相邻的XP,每个XP还有两个用于连接设备的端口:P0和P1。最大尺寸的CMN600网络包含8x8=64个XP

每个XP有且仅有两个设备端口,这些端口可以连接以下设备组件:

RN-F:完全一致的请求节点,包含一致的缓存并将接受和响应监听

RN-I:是一个桥接设备,I/O 一致请求节点( RN‑I) 桥将 I/O 一致的 AMBA master 连接到CMN‑600 系统。

RN-D:具有DVM支持的I/O一致请求节点(RN-Ds),具有与RN-Is相同的功能,还可以接受DVM消息【DVM的master一般是SMMU

HN-F:完全一致的HomeNode,每一个HN-F用来管理部分地址空间,整个DRAM空间通过所有HN-F的组合来管理。完成请求排序和snoop filter。包含System level Cache(SLC),combined PoS/PoC(组合的序列化点/一致性点),和snoopFilter。

HN-I:IO homeNode是针对AMBA从设备的节点。将CHI事务转换为AXI/APB等输出连接到AMBA slaveHN-I不能发出一致性snoop。
HN-D:处理请求节点发送的DVM事务。该设备包含HN-I,DVM node和configuration Node,global configuration Slave和Power/Clock control block(PCCB).也就是说CMN600的配置和时钟功耗控制都在HN-D里面(有时叫杂项HD-M)。一个CMN600只有唯一一个HN-D节点。

SBSX:属于连接SN-F的桥接器,将CHI5转为其他AMBA协议,连接到支持一致性内存的slave设备,比如将CHI5转为ACE5-lite接到CoreLink DMC-400 DDRC

【SN-F:适用于普通内存或外设的从属节点,连接到支持一致内存空间的存储器设备。比如内存控制器】

CXG:用在CHI和CXS设备之间桥接。比如连接支持CCIX的外接PCIE。【我觉得这个CXG可以连接到RN-F和SN-F】

看了上面的组件,我们会问为什么没有SN-I?这个答案会在下一节给出。

3.1.2 什么是IO一致性

上节提到HN-I、HN-D和RN-I/D,都涉及到一个IO一致性设备,那么到底什么是IO一致性设备呢?

I/O coherency的意思是指device能snoop到CPU的cache、但CPU不能snoop到device内的cache

ACE本身是支持Full coherency,ACE-lite是支持IO coherency的。所以HN-I/HN-D可以通过ACE-lite连接一个IO一致性的slave【SN-I】;而RN-I可以通过ACE-lite连接一个IO一致性的master。

回答上一节的问题,为什么没有SN-I,因为IO一致性的slave设备都是直接连在HN-I/D上的,HN-I/D直接充当IO一致性slave设备的桥。相对RN-I/D是专门给IO一致性master设备的桥接器。

RN-I/D可以是某个具有smmu的subsys,根据IO一致性的定义,这个subsystem是可以snoop到CPU的cache,也就是说可以读写cpu内cache一致的数据。但是subsystem不接受HN-F的snoop请求。

HN-I/D连接的比如是R52的mem,那么cpu可以访问R52的mem,但是CPU对R52的mem读写不支持一致性处理

另一个需要注意的是RN-I/D发请求是可以发送到HN-F上的,这个取决于RN-I/D读取的数据地址空间是否支持Snoop。所以RN-I/D和HN-I/D不具有对应关系。

3.1.3 HN-D内部组件

这里单独介绍HN-D内部的configuration node和Power/Clock control block。

  • configuration node

负责处理配置访问、错误报告和信令、中断生成以及集中式调试和性能监控
(PMU) 支持功能。CFG 没有专用的 CHI 端口。它与mesh中的 HN‑D 节点共享一个设备端口【外部接口】。

CFG 包括以下专用端口【内部端口】:

  1. 用于从CMN‑600 内的CHI 组件收集错误信号的端口
  2. 连接到所有节点以处理内部配置寄存器读写的配置总线
     
  • Power/Clock control block

电源/时钟控制块(PCCB) 与 HN‑D 节点位于同一位置,提供单独的通信通道。这些通道在 SoC 和CMN之间传递有关电源和时钟管理的信息。

3.1.4 CMN网络一个实例

上图表明虽然一个XP只有2个port,但是通过CAL可连接超过2个port。CAL是Component Aggregation Layer 组件聚合层的缩写。

3.2 discovery

discovery是一种发现CMN600配置的软件算法。discovery的目标如下:

  1. 识别所有节点的位置和logicID
  2. 识别所发现的节点是外部节点还是内部节点
  3. 掌握全局配置寄存器,每个XP的配置寄存器,HN-F和RN-F对应的RN SAM位置

其实看完cmn600 spec的描述,软件discovery只是配置了PERIPHBASE和ROOTNODEBASE两个基地址。然后其他信息都是在生成CMN mesh的时候按照和软件的约定,组织好所有节点的配置寄存器节点:内含节点位置(X,Y,portID),节点类型,子节点数目,子节点偏移指针。然后利用子节点偏移指针串成节点配置树表

有了所有节点的配置和实现信息,软件按照Level层级去遍历这个Discovery 配置树就知道了mesh的结构。

  • PERIPHBASE:是软件配置给整个CMN600的配置空间的基地址
  • ROOTNODEBASE:可以开始发现过程的根节点的地址。 ROOTNODEBASE 上的配置寄存器包含全局信息和配置,以及系统中组件的第一级发现信息

3.2.1 配置寄存器结构

其中配置寄存器节点结构如下:

nodeInfo:包含16bit的NodeType和CHI node ID

Child info:包含下一级子节点个数child count和第一个child pointer指针地址距离nodeInfo的offset。

implementation define:对应该node的特定的实现信息和配置

Child pointer x(L/H):该node下一级子节点的配置寄存器节点的偏移于PERIPHBASE位置。

3.2.2 完整的配置节点树

节点配置树有三个层次(级别):

  1. Level 1:Root Node 只能是CMN600中唯一的HN-D
  2. Level 2:所有的XP这一层
  3. Level 3:leaf layer

所以Root node的下一级子节点是XP,XP的下一级子节点是HN/RN/SN等设备。

以2x2 mesh结构为例,说明一个完整的Discovery Tree的例子。

上图给出了2x2 mesh的结构,根据上面的结构下面给出了三层的Discovery配置树,每一列对应一个层级。

3.3 原子事务

下面一段话摘自 AMBA CHI协议导论-CSDN博客 第九章。

CMN的原子事务和AXI5的原子事务很像,为了支持Armv8.1架构中添加的原子指令,CHI-B提供了原子事务。互连使用原子事务将原子操作及其操作数从一个设备传输到另一个设备。使用原子操作而不是独占访问可以减少其他代理无法访问数据的时间。

原子操作是在没有另一个请求者干扰的情况下执行的读-修改-写序列。与AXI中的独占访问一样,原子事务允许请求者修改内存的特定区域的数据,同时确保其他请求者的写入不会破坏数据。

AXI3和4以及CHI-A中,请求者获取数据,执行操作,然后将结果写回以完成原子访问。CHI-B包含将原子操作传输到互连的选项,这允许操作更靠近数据所在位置执行。这提高了效率,减少了数据对其他请求者不可访问的时间。

为了执行原子操作,目标需要一个算术逻辑单元(ALU)。也就是说,要使用原子操作,HN、SN或两者都需要一个ALU。来自CHI-B的原子事务支持是可选的,因此HN和SN并不总是需要具有ALU。请求者有一个配置引脚BROADCASTATOMIC,可以用于在下游系统不支持原子事务时阻止请求者生成原子事务。

完整的原子事务结构是:

• 请求者向互连发出原子事务

• HN或SN具有ALU,因此它执行原子操作

• 根据操作,互连可能将地址的原始数据返回给请求者

3.4 Link layer Credit与CHI的发送时序

CHI有REQ,RSP和SNOOP(TX/RX) DAT(TX/RX)共六个通道,发送数据时和AMBA的AXI,ACE和AXI-stream时序不同,这几个传输过程需要valid和ready握手才表示数据被采样。

CHI每个通道有一个FLITV信号和一个LCRDV信号。TX的每一次发送FLIT需要有足够的credit,而TX就是通过接收LCRDV信号来把credit+1,发送一个flit,credit-1.LCRDV来自RX端,RX发送LCRDV就表示RX一定能够接收这么多的flit。

所以RX发送的LCRDV并不是直接和FLITV握手的,只要RX那边有credit就可以给TX发LCRDV脉冲。而TX检查自己要发送的目的地址对应的credit不为0就可以直接发送FLIT

有了Credit才发送trans,保证了各通道不会有反压的情况出现。

4.参考资料

ABMA CHI协议学习 - 知乎

学习了上面第一篇文章,对snoop和cache state有了了解之后在看下面的CHI协议导论就比较能够理解了。当然最后肯定是要多阅读CHI,ARM和Cache的英文原著,这些英文spec在本人的网盘中有整理

AMBA CHI协议导论-CSDN博客

最后最原始及最重要的CHI规格书可以在ARM官网下载,或者本人已收藏到个人网盘。

另外截图中高亮的文档是一篇讲解cache一致性的课件,对ACE/MESI/MOESI讲解的比较透彻。

5.疑问

1.CHI既然是为了一致性,那么为什么还有RN-I/D HN-I/D这种不支持一致性的node?

CHI协议说了,它不只是coherent hub interface同时还是on-chip interconnect。或者用ACE-lite给出的解释更清楚一点【在没有CHI之前,ARM都是使用ACE和ACE-lite】:

ACE-lite明确给出了,为什么要连接没有hardware coherent cache的node。当然也可以参考3.1.2节的IO一致性的定义,就明白为何要连接这些非cache一致性的设备了。

附录1:MESI和MOESI

摘自总线一致性:高性能SoC核心技术_搜狐汽车_搜狐网

ARMv8-缓存一致性(cache coherency)解决方案:MOESI protocol-CSDN博客

表:cache一致性协议之MESI协议

MESI协议的不便之处在于:假设CPU A有个一个M态的cache line,而此时CPU B想获取此cache line,那么总线必须通知CPU A将cache line同步到主存中。在这个过程中,总线与主存的交互会消耗较长的时间,如果可以在不将数据同步回主存的情况,将CPU A的数据通过总线发送给CPU B,将会节省时间,提高效率。

MOESI协议就优化了这一不便之处。MOESI协议允许cache之间共享dirty cache line。Dirty是指cache line相对于主存而言已经发生变化,这样就可以节省与主存交互的时间成本,在cache line不需要写回主存之前,一直在cache之间传输。

MOESI相较于MESI多一个O态,O态代表该cache line与主存中的值不同,至少存在于两个cache中,并由该cache在需要的时刻将cache line刷新到主存中。此外MESI和MOESI的S态有所不同,MESI的S态中的cache line与主存保持一致;而MOESI的S态中的cache line不一定与主存保持一致,可能是共享了dirty cache line,但是没有向主存刷新cache line的义务。

表:cache一致性协议之MOESI协议

附录1.1 MOESI的状态转换

 

附录二:ACE和CHI的对比

ACE协议使用了master/slave之间的信号电平通信,ACE和AXI相比除了AR/R/AW/W/B通道外还增加了snoop的地址/数据/响应通道。ACE的AR/R/AW通道相比AXI也增加了一些一致性的接口。因此互连需要大量的线和增加的通道来进行snoops和响应。总的来说接口还是valid+ready握手的方式。

ACE的spec参见:"IHI0022E_amba_axi_and_ace_protocol_spec.pdf"

随着SOC上集成越来越多的一致性clusters,AMBA5修订版引入了CHI协议。定义了连接完全一致的处理器的接口。它是一种基于数据包的分层通信协议,具有协议、链路和网络层。 

可以说CHI和以往的AXI/ACE是完全不同的架构。

  • 18
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
AMBA (Advanced Microcontroller Bus Architecture) 是 ARM 公司提出的一种片上总线架构,它可以用于连接处理器、存储器、外设和其他系统组件。AMBA 协议提供了一种用于 CPU 和其他系统组件之间的通信方式,其中包括一些机制来实现缓存一致性AMBA 协议对缓存一致性的实现方式主要有两种:ACE (AXI Coherency Extensions) 和 CHI (Coherent Hub Interface)。 1. ACE:ACE 是一种 AXI (Advanced eXtensible Interface) 总线协议的扩展,它增加了一些机制来实现缓存一致性。ACE 协议支持多个处理器和 DMA 控制器之间的缓存一致性,从而提高了系统性能。 ACE 协议的主要特点包括: - 支持多个处理器和 DMA 控制器之间的缓存一致性; - 支持多种缓存一致性协议,包括 MESI、MOESI 和 MOESIF 等; - 支持多级缓存; - 支持数据和指令的缓存一致性。 2. CHICHI 是 ARM 公司推出的一种新的片上总线架构,它是 AMBA 协议的下一代版本。CHI 协议在 ACE 的基础上进行了进一步的优化和改进,从而提高了系统的性能和可扩展性。 CHI 协议的主要特点包括: - 支持多个处理器和 DMA 控制器之间的缓存一致性; - 支持多种缓存一致性协议,包括 MOESI 和 MOESIF 等; - 支持多级缓存; - 支持数据和指令的缓存一致性; - 支持高带宽和低延迟的数据传输; - 支持虚拟化和安全性。 综上所述,AMBA 协议通过 ACE 和 CHI 两种协议来实现缓存一致性,提高了系统的性能和可扩展性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值