前言
CHI协议最难的是什么,就是那一堆各种各样的事务,你不知道什么场景应该使用什么合适的事务,收到X事务又该回复什么事务。相当于CHI给你制定了很多种(尽可能覆盖完全)场景及事务,你需要去了解,去认可,然后遵循,这就是协议。
所以,我们在这里对事务做个汇总,便于查看。
注:
- 部分事务分为ptl/full ,这里不做区分。
- 事务名基本可以“望文生义”,也就是我们代码所推荐的“命名即注释”。
- 部分事务的行为并不完全确定,个人推测。
- 针对request type,response type的待补充。
- 若有遗漏/错误,欢迎补充/指正。
- 更多内容,参见《AMBA®5 CHI Architecture Specification》。
一、概述
CHI协议中将请求事务分了几种大类,如下所示:
CHI事务 | Read | allocate | 读回来的数据可以被分配到cacheline中 |
non-allocate | |||
Dataless | - | 无数据传输的事务 | |
Write | Immediate Non-CopyBack Write | 将数据从RN传输到HN,而无需最初获得数据的一致性所有权。也用于将数据从HN传输到SN | |
copyback | 将一致性数据从cache移动到下一级cache或memory | ||
Combined Write | - | 写事务与cache维护的结合 | |
atomic | - | 原子:不可分割,一气呵成的完成; 原子事务将原子操作以及执行原子操作所需的数据值从系统中的一个代理传递到另一个代理 | |
Others | DVM | 虚拟内存系统的维护 | |
prefetch | 预取:推测性地从主存中获取数据 | ||
Snoop | - | 对RN-F上缓存的数据进行操作 |
后文将具体描述各个事务。
二、事务详细描述
2.1 Read transaction
Read事务具有以下共同特征:
- 数据必须包含在对请求者的完成响应中,但MakeReadUnique除外,数据响应是可选的,可以在HNF处根据SF判断自己的cacheline是否还在,如果还在的话就不需要返回一个copy。
- 返回的数据响应中的数据可以来自HNF、RNF、SNF。
- 在Allocating Read事务中,接收到的数据,如果进行缓存,则必须满足系统一致性。
- 在Non-allocating Read事务中,即ReadNoSnp和ReadOnce*中,接收到的数据一般不会被缓存。如果被缓存,数据也不会加入到系统一致性。
- 读请求可能会导致请求者处的cacheline状态更改。具体状态变化后面再讨论。
- 读请求可能导致系统中其他RNF的cacheline状态更改。
2.1.1 non-allocate read transaction
ReadNoSnp
RN对Non-snoopable地址区域的读请求。或者,从HN到任何地址区域,以获得一个被寻址数据的副本。
ReadNoSnpSep
HN到SN的读请求,只返回数据响应。
ReadOnce
对snoopable地址区域的读请求,以获得一致性数据的snapshot。
CPU只是读取一次数据临时用一下,无需保存到本地的cache中。
ReadOnceCleanInvalid
ReadOnce + CleanInvalid
CleanInvalid:将所有的cacheline无效掉,状态变为invalid,如果cacheline是dirty,则需要将dirty数据写回内存。
ReadOnceMakeInvalid
ReadOnce + MakeInvalid
MakeInvalid:将所有的cacheline无效掉,状态变为invalid,如果cacheline是dirty,直接丢弃。
2.1.2 allocate read transaction
ReadClean
到snoopable地址区域的读请求,以获得cacheline的干净副本。如果请求者正在将该行分配给不支持dirty cacheline的缓存,例如指令缓存,则可以使用此方法。数据必须仅在UC或SC中提供给请求者。
ReadNotSharedDirty
到snoopable地址区域的读请求,执行从cacheline的load操作。数据只能以UC、UD或SC状态返回给请求者。不允许使用SD。
ReadShared
相比于ReadNotSharedDirty,支持SD。
ReadUnique
到snoopable地址区域的读请求,执行从cacheline的load操作。数据必须仅在UC或UD状态下提供给请求者。
获取数据以及unique权限。
ReadPreferUnique
访问snoopable地址,获取唯一副本:最好是unique,但是shared也行。
MakeReadUnique
访问snoopable地址,获取唯一副本。典型的用法是,请求者拥有cacheline,并希望获得写cache line的权限。
注:因为MRU可以保证返回一份数据,所以即使请求者在收到使cacheline无效掉的 Invalidating snoop,也不需要再次发起一个读请求以获取数据。
2.2 Dataless transaction
Dataless事务具有以下共同特征:
- 数据不能包含在完成响应中。
- 该请求可能导致系统中其他代理之间的数据移动。
- 该请求可能导致请求者的缓存状态更改。
- 该请求可能导致系统中其他请求节点的缓存状态更改。
CleanUnique
到snoopable地址区域的请求,以将请求者处的cache line状态更改为“唯一”,以便对该cache line执行写操作。
典型的用法是,请求者拥有cache line的共享副本,并希望获得cache line的写权限。
dirty cacheline必须写回内存。
MakeUnique
同CU,但是dirty cacheline直接无效掉。
Evict
用于指示该RNF不再缓存这个干净的缓存行。
CPU通知HNF,某条cacheline已经被“逐出”了,本地没有了。
cache stash :一种投机行为,通过在其未来的使用点附近分配一个cacheline来提高系统性能,因为可以减少使用数据时的内存访问延迟。
StashOnceUnique,StashOnceSepUnique
到snoopable地址区域的请求,以尝试将被寻址的cacheline移动到目标缓存,以使目标能够存储该行。
换句话说,如果你知道CPU将要修改某条cacheline数据,在unique的数据准备好后,你(RN)就可以用此请求通知该CPU去取数,并且获取unique权限。
StashOnceShared,StashOnceSepShared
同上,只是不需要unique权限。
CleanShared,CleanSharedPersist,CleanSharedPersistSep
cache维护,将所有的dirty数据写回主存或PoP,保证所有的cacheline都是non-dirty的。
PoP:Point of Persistence,系统中用于持久性存储的特定位置或机制。它表示数据在系统中的存储状态,以确保数据在断电或重启后仍然可用。通常是将易失性存储(如cache)复制到非易失性存储(如硬盘)。
CleanInvalid
将所有cache line都无效掉,dirty数据写回主存。
CleanInvalidPoPA
CleanInvalidPoPA确保所有在PoPA之前的cacheline都被无效掉了。这使得对一个物理地址空间(PAS)中的位置的写入对其他物理地址空间可见。
PoPA :Point of Persistence of allocation
MakeInvalid
将所有cache line都无效掉,dirty数据丢弃。
2.3 Write transaction
写入事务将数据从请求者移动到完成者,这可能是下一级缓存、内存或外围设备。根据事务类型,正在传输的数据可以是一致性的或非一致性的。
2.3.1 Immediate transactions
WriteNoSnp
RNF写non-snoopable地址空间,或者HNF(system level cache)写数据到SN(主存)。
WriteUnique
RNF写snoopable地址空间,当RN处的cacheline是I态,将full cache line数据写入下一级缓存或内存。
WriteZero
WriteNoSnpZero,WriteUniqueZero,因为是写0,那么就不需要再次发起数据传输,完成者处直接将数据更新为0即可。
WriteUnique(Full/Ptl)Stash
当请求者处的缓存行无效时,将完整的缓存行数据写入下一级缓存或内存。还包括对stash目标节点的请求,以获取被寻址的缓存行。
2.3.2 CopyBack transactions
WriteBack(Full/Ptl)
将dirty数据的完整缓存行写回下一级缓存或内存。
WriteCleanFull
将dirty数据的完整缓存行写回下一级缓存或内存。并把本地cacheline状态改为Clean。
WriteEvictFull
将UC状态的完整缓存行写回下一级缓存或内存。并把本地cacheline状态改为Invalid。
WriteEvictOrEvict
把UC/SC的cacheline刷到下一级cache中。
这个请求类型是将WriteEvictFull和Evict合并到一个请求中。这允许HN确定它是否发送数据。
2.4 Combined Write requests
当两者位于相同的地址时,此规范支持将写事务与缓存维护事务相结合。当CMO或PCMO事务到达系统中必须完成写操作才能启动CMO或PCMO事务的点时,将两个请求组合到相同地址的能力非常有用。使用单一的组合写事务避免了序列化写和CMO或PCMO事务的需要。这两个请求组合的点可以是RN或HN。
下表列出了允许的write和CMO组合的事务:
更多内容,参见协议,这里不再展开。
2.5 Atomic transactions
原子事务允许请求者向互联器(ICN)发出带有内存地址和要在内存地址上执行的操作的事务。这种事务类型使操作更接近数据所在位置,有助于以原子方式执行操作和更新内存位置,性能更加高效。
如果没有原子事务,原子操作必须通过一系列内存访问来执行。这些访问访问依赖于exclusive独占的读和写。
通过使用原子事务:
- 可以为原子操作估算出更确定的延迟。
- 访问被修改的内存位置的阻塞期减少了,从而减少了其他代理对内存访问进程的影响。
- 在访问内存位置的不同请求者之间提供公平性变得更简单,因为原子操作对内存位置的访问是在序列化点(PoS)或一致性点(PoC)进行仲裁的。
AtomicStore
发送包含要执行的地址和原子操作的单个数据值。
目标节点,即HN或SN,对由原子事务中提供的数据指定的地址位置执行所需的操作。
目标返回一个没有数据的完成响应。
所支持的操作数为8个,具体操作见协议。
AtomicLoad
同AtomicStore,但是完成响应会返回数据,该数据是这个地址上的原始数据。
AtomicSwap
发送单个数据值,即交换值,以及要进行操作的位置的地址。
目标HN或SN将地址位置的值与事务中提供的数据值交换。
目标将返回带有数据的完成响应。数据值是在被寻址位置上的原始值。
所支持的操作数为1。
AtomicCompare
发送两个数据值,即比较值和交换值,以及要进行操作的位置的地址。
目标HN或SN将寻址位置的值与比较值进行比较:
——如果值匹配,目标会将交换值写入寻址位置。
——如果值不匹配,则目标不会将交换值写入寻址位置。
2.6 Others
2.6.1 DVM
DVM事务用于虚拟内存系统的维护。
DVMOp
DVM操作。操作包括在分布式虚拟内存系统中的组件之间传递消息。
2.6.2 PreFetch
预取目标事务用于推测地从主存中获取数据。
PreFetchTgt
对snoopable地址的请求,从RN直接发送到SN,没有响应。
2.7 Snoop
互连ICN生成一个Snoop请求,以响应来自请求节点的请求,或由于一个内部触发器,如cache或SF维护操作。除SnpDVMOp外,Snoop事务在RN-F上对已缓存的数据进行操作。SnpDVMOp事务在目标节点上执行DVM维护操作。
Home发送的snoop基于几个条件进行选择:
- 在请求者和监听节点上所要求的预期或允许的最终缓存状态。
- 避免丢失被监听缓存中的任何dirty tag。
- 如果存在*FWD,则用等效的Forwarding snoop替换 Non-forwarding。
- 一个Forwarding snoop只允许发送到一个RN-F。
- 一个stash snoop只允许发送到一个RN-F。
- 对于Non-snoopable地址区域,snoop是允许的,但不是必须的。
SnpOnceFwd, SnpOnce
Snoop请求获取缓存行的最新副本,最好不更改在Snoopee上的缓存行状态。
snoopee:接收snoop的RN-F。
SnpStashUnique
Snoop请求,建议Snoopee获得处于唯一状态的缓存行的副本。
SnpStashShared
Snoop请求,建议Snoopee获得处于共享状态的缓存行的副本。
SnpCleanFwd, SnpClean
Snoop请求获取处于clean状态的缓存行的副本,同时将任何缓存副本保持在shared状态。不能使cacheline保持在unique状态。
SnpNotSharedDirtyFwd, SnpNotSharedDirty
Snoop请求获取处于SC状态的缓存行的副本,同时将任何缓存副本保持在shared状态。不能使cacheline保持在unique状态。
SnpSharedFwd, SnpShared
Snoop请求获取处于S状态的缓存行的副本,同时将任何缓存副本保持在S状态。不能使cacheline保持在unique状态。
SnpUniqueFwd, SnpUnique
Snoop请求获取处于U状态的缓存行的副本,同时使任何缓存的副本无效。必须将cacheline更改为无效I状态。
SnpPreferUniqueFwd, SnpPreferUnique
Snoop请求获取处于U状态的缓存行的副本,同时使任何缓存副本无效:
- HNF用于ReadPreferUnique的响应。
- snoopee的行为取决于它是否执行一个独占序列。
SnpUniqueStash
Snoop请求使Snoopee上的缓存副本无效,并建议Snoopee以唯一状态获得缓存行的副本:
- 允许Snoop响应包含DataPull。
- Snoop响应中的DataPull请求被视为ReadUnique。
SnpCleanShared
Snoop请求移除Snoopee上cacheline的任何脏副本。不能使cacheline保持为dirty状态。
SnpCleanInvalid
Snoop请求无效Snoopee上的缓存行并获得任何脏副本。即使没有相应的请求,也可以由互连ICN生成。必须将cacheline更改为无效状态。
SnpMakeInvalid
Snoop请求无效化Snoopee上的缓存行并丢弃任何脏副本:
- 不使用Snoop响应返回数据,脏数据将被丢弃。
- 必须将cacheline更改为无效状态。
SnpMakeInvalidStash
Snoop请求使缓存行的副本无效,并建议Snoopee获得处于唯一状态的缓存行的副本:
- Snoopee不能返回具有Snoop响应的数据,必须丢弃脏数据。
- 允许Snoop响应包含一个DataPull
- Snoop响应中的DataPull请求被视为ReadUnique
SnpQuery
SnpQuery探测在请求节点处的缓存行的状态:
- HNF可以发送SnpQuery snoop,无需收到来自请求者任何相应的请求。
- snoop响应必须包含目标snoopee的缓存行的精确状态。
- Snoopee不能返回带有数据的Snoop响应。
- SnpQuery snoop不能更改Snoopee处的缓存行的状态。
SnpDVMOp
在互连ICN处生成,由DVMOp请求发起:
- 单个DVMOp请求生成两个snoop请求。
- 两个Snoop请求返回一个Snoop响应。
三、汇总
亿图地址:(主页资源,免费获取)