格式有点乱,原文地址:
【CHI】CHI协议,transaction事务汇总
前言
CHI协议最难的是什么,就是那一堆各种各样的事务,你不知道什么场景应该使用什么合适的事务,收到X事务又该回复什么事务。相当于CHI给你制定了很多种(尽可能覆盖完全)场景及事务,你需要去了解,去认可,然后遵循,这就是协议。
所以,我们在这里对事务做个汇总,便于查看。
注:
1.部分事务分为ptl/full ,这里不做区分。
2.事务名基本可以“望文生义”,也就是我们代码所推荐的“命名即注释”。
3.部分事务的行为并不完全确定,个人推测。
4.针对request type,response type的待补充。
5.若有遗漏/错误,欢迎补充/指正。
6.更多内容,参见《AMBA®5 CHI Architecture Specification》。
一、概述
CHI协议中将请求事务分了几种大类,如下所示:
后文将具体描述各个事务。
二、事务详细描述
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响应。
三、汇总
亿图地址:CHI协议,transaction事务汇总