目录
一、什么是CHI
CHI(Coherent Hub Interface)协议是AMBA的第五代协议,是ACE协议的进化版,将所有的信息传输采用包packet的形式来完成,用于解决多个CPU(RN)之间的数据一致性问题。
CHI 旨在实现可扩展性,能够构建小型、中型或大型系统。这些系统使用多个组件,范围从处理器集群、图形处理器和内存控制器,到 I/O 桥、PCI Express(PCIe)子系统和互联本身。
二、cache一致性协议MOESI
我们在学习CHI之前,需要先了解cache一致性协议(MOESI)
MOESI认为cache有5种状态位:
M(modified)位。当前cache行中的数据跟处理其中的不一样,并且只有当前cache保存这个cache行数据,其他cache没有该副本。当对这个cache进行替换的时候,不要现将cache行中的数据协会到存储器中。
E(exclusive)位。只在该cache中有副本,其他cache中没有该cache行副本。该cache行内容跟存储器中的一样。
I(invalid)位。I位为1表示当前cache行没有有效数据,或者cache行没有使能。
O(owned)位。当存在O位为1 的cache行的时候,该cache行数据一定在多个cache有副本,并且cache行中的内容跟存储器的内容不一样,各个cache行副本中的内容是一样的。
S(shared)位,S位为1表示该cache行在多个cache中存在副本,但是cache行内容是否跟存储器内容一样要视情况而定,如果该cache行存在O位为1的副本,那么cache行内容跟存储器内容不同,如果不存在O位为1的副本,cache行内容跟存储器内容一致。
它们的转换关系如图所示:
存储器写,cache命中时
写命中的时候,cache行的状态可能是M, O, E, S四种:
为M和E时候,直接将数据写入cache行,cache行的状态变为M。
为S时候,直接将数据写入cache行,cache行状态改为M,并且其他cache中保存该副本的cache行,从S或O改为I。
为O时候,直接将数据写入cache行,cache行状态改为M,并且其他cache中保存该副本的cache行,从S改为I。
存储器写,cache未命中时
如果CPU A对存储器的写操作没有在本地cache中命中,而是在其他CPU,比如CPU B中命中,那么CPU B 中该cache行的状态可能是M, O, E, S四种:
当为M时候,CPU B将cache 行数据写会存储器,当且将cache行状态改为I,CPU A从存储器中取数据,并在本地cache申请一个cache行保存数据,cache行状态为M。
当为O时候,CPU B将将cache 行数据写回存储器,当且将该cache行和其他保存该副本的cache行状态改为I,CPU A从存储器中取数据,并在本地cache申请一个cache行保存数据,cache行状态为M。
当为E时候,CPU B中cache行状态改为I,CPU A从存储器中取数据,并在本地cache申请一个cache行保存数据,cache行状态为M。
当为S时候,将CPU B中该cache行和其他cache中保存该副本的cache行状态改为I,CPU A从存储器中取数据,保存在本地cache行中,状态为M。
存储器读,cache命中时
如果CPU在本地cache中命中,那么直接从本地cache中读取。
MOESI协议,存储器读,cache未命中
如果CPU A没有在本地cache中命中,而是在CPU B cache中命中,CPU B cache行状态可以是M, O, E, S:
为M时候,CPU B cache行状态改为O,CPU B将数据传给CPU A新申请的cache行中。CPU B不需要将数据写会存储器。这是MOESI比MESI最大的优点,提高了cache利用率。
为O时候,CPU B cache状态不变,CPU B将数据传给CPU A新申请的cache行中。
为E时候,CPU B cache行状态变为S,CPU B将数据传给CPU A新申请的cache行中。
为S时候,CPU B cache状态不变,CPU B将数据传给CPU A新申请的cache行中。
下面的网站用动画生动的展示了cache的状态跳转:
CHI协议也对cache状态进行了定义:
cache state | cache line characteristics |
Valid / Invalid | Valid表示该cache line存在于cache中,Invalid表示该cache line没有放在cache中 |
Unique / Shared | Unique表示cache line单独存放于该cache中,Shared表示其它cache中也可能存在该cache line,但不保证一定有 |
Clean / Dirty | Clean表示该cache不用更新主存数据,Dirty表示该cache line数据相对于主存已经发生了改变,该cache必须确保最终主存的数据被更新 |
Full / Partial / Empty | Full 表示cache line所有byte有效;Partial表示可能只有部分byte有效,不是全部有效;Empty表示没有byte有效; |
它们和MOESI之间的对应关系如表中所示:
cache state | cache line characteristics |
Invalid (I) | 对应MOESI中I态 |
Unique Clean (UC) | 对应MOESI中E态 |
Shared Dirty (SD) | 对应MOESI中O态 |
Unique Dirty (UD) | 对应MOESI中M态 |
Shared Clean (SC) | 对应MOESI中S态(也可能为O态:如果该cache行存在O位为1的副本,那么cache行内容跟存储器内容不同,如果不存在O位为1的副本,cache行内容跟存储器内容一致。) |
Unique Dirty Partial (UDP) | 部分数据被修改且有效,在收到snoop请求时,该缓存行必须返回数据给HN,但不能直接将数据给Requester; |
Unique Clean Empty (UCE) | 该cache line的数据只在当前cache中,但是所有的数据都是无效的,可以不知会其它RN就对该cache line的数据进行修改。在收到snoop请求时,该cache line不能返回数据给HN或RN; |
三、拓扑结构
CHI并不规定拓扑结构,常用的有以下三种:
Crossbar : 这种结构相对简单,互连部分延时小,多用于数量不多的组件互连;缺点是如果互连组件太多,这种结构的内部走线会非常多,不利于物理实现
Ring :折中考虑了互连组件数量和延时,有利于中等规模的SoC设计
Mesh :可以提供更大的带宽,而且是可以模块化,通过增加网格的行或列来增加更多的节点
四、snoop 方式
在cache一致性协议那一节中我们知道,每一条cache line的状态,和其他CPU中同一地址的cache line有关,那么我们如何知道其他CPU中的cache line状态呢?
这就需要snoop
snoop的方式有2种:snoop filter、snoop directory
snoop filter:
Snooping机制采⽤⼴播的形式,当⼀个master修改了cache line之后,将⼴播通知到总线上其它所有的master。 ⼴播的⽅式虽然简单,但要时刻监听总线上的⼀切活动,然而master之间共享的内存数据毕竟只占少数,snoop filter用于过滤,看自己的 master有没有对应的cache line
snoop directory:
所有master的cache line信息,都被记录在directory里, Directory机制采用的是点对点的方式进行传播,只发给拥有这个transaction所涉及内存位置对应的cache line
directory的记录方式不做规定,ARM并没有公布如何实现,我在查资料的过程中查到2个图,工参考:
图一我认为的不对的,因为directory在ICN中,cache line在master或者是main memory中,两者一定是不会在一起的。大家主要看红色部分就行。
图2也有一定的缺陷,总之,share list部分我认为是没错的。
五、CHI层次
CHI分为协议层,网络层和链接层
CHI在协议层规定了各种transaction;在网络层规定了packet;对于具体的信号,放到了链路层
Transaction:一个transaction执行一个单独的操作,如一个transaction可以是读memory或写memory
Message :协议层术语,用于定义两个组件之间交换信息的粒度,如:Request、Data response、Snoop request一个数据响应message可能由多个packets组成
Packet :端到端跨越interconnect的传输粒度,一个message可能由一个或多个packets组成,例如一个data response可以由1-4个packet组成
Flit : 最小流控单位,对于同一个packet的所有flits在interconnect上传输必须遵循同样的路径,对于CHI,所有的packets都是由一个flit组成
Phit :物理层传输单位,phit定义为两相邻网络设备之间的一个传输,对于CHI,所有的flits都是由一个phit组成
名称 | 描述 | 举例 |
Transaction | 一个transaction执行一个单独的操作,如一个transaction可以是读memory或写memory | Read、write、dataless、Combined Write 、Atomic 、Other、Snoop |
Message | 协议层术语,用于定义两个组件之间交换信息的粒度, 一个数据响应message可能由多个packets组成 | Request、Data response、Snoop request |
Packet | 端到端跨越interconnect的传输粒度,一个message可能由一个或多个packets组成,例如一个data response可以由1-4个packet组成 | REQ、WDAT、TDAT、SNP、SRSP、CRSP |
Flit | 最小流控单位,对于同一个packet的所有flits在interconnect上传输必须遵循同样的路径 | 对于CHI,所有的packets都是由一个flit组成 |
Phit | 物理层传输单位,phit定义为两相邻网络设备之间的一个传输 | 对于CHI,所有的flits都是由一个phit组成 |
flit举例: