【CHI】CHI协议,transaction事务汇总

2023-10-22 00:04

本文主要是介绍【CHI】CHI协议,transaction事务汇总,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

        CHI协议最难的是什么,就是那一堆各种各样的事务,你不知道什么场景应该使用什么合适的事务,收到X事务又该回复什么事务。相当于CHI给你制定了很多种(尽可能覆盖完全)场景及事务,你需要去了解,去认可,然后遵循,这就是协议。

        所以,我们在这里对事务做个汇总,便于查看。

注:

  1. 部分事务分为ptl/full ,这里不做区分。
  2. 事务名基本可以“望文生义”,也就是我们代码所推荐的“命名即注释”。
  3. 部分事务的行为并不完全确定,个人推测。
  4. 针对request type,response type的待补充。
  5. 若有遗漏/错误,欢迎补充/指正。
  6. 更多内容,参见《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事务具有以下共同特征:

  1. 数据必须包含在对请求者的完成响应中,但MakeReadUnique除外,数据响应是可选的,可以在HNF处根据SF判断自己的cacheline是否还在,如果还在的话就不需要返回一个copy。
  2. 返回的数据响应中的数据可以来自HNF、RNF、SNF。
  3. 在Allocating Read事务中,接收到的数据,如果进行缓存,则必须满足系统一致性。
  4. 在Non-allocating Read事务中,即ReadNoSnp和ReadOnce*中,接收到的数据一般不会被缓存。如果被缓存,数据也不会加入到系统一致性。
  5. 读请求可能会导致请求者处的cacheline状态更改。具体状态变化后面再讨论。
  6. 读请求可能导致系统中其他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事务具有以下共同特征:

  1. 数据不能包含在完成响应中。
  2. 该请求可能导致系统中其他代理之间的数据移动。
  3. 该请求可能导致请求者的缓存状态更改。
  4. 该请求可能导致系统中其他请求节点的缓存状态更改。

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独占的读和写。

通过使用原子事务:

  1. 可以为原子操作估算出更确定的延迟。
  2. 访问被修改的内存位置的阻塞期减少了,从而减少了其他代理对内存访问进程的影响。
  3. 在访问内存位置的不同请求者之间提供公平性变得更简单,因为原子操作对内存位置的访问是在序列化点(PoS)或一致性点(PoC)进行仲裁的。

AtomicStore  

        发送包含要执行的地址和原子操作的单个数据值。

        目标节点,即HNSN,对由原子事务中提供的数据指定的地址位置执行所需的操作。

        目标返回一个没有数据的完成响应。

        所支持的操作数为8个,具体操作见协议。

AtomicLoad

        同AtomicStore,但是完成响应会返回数据,该数据是这个地址上的原始数据。

AtomicSwap

        发送单个数据值,即交换值,以及要进行操作的位置的地址。

        目标HNSN将地址位置的值与事务中提供的数据值交换。

        目标将返回带有数据的完成响应。数据值是在被寻址位置上的原始值。

        所支持的操作数为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基于几个条件进行选择:

  1. 在请求者和监听节点上所要求的预期或允许的最终缓存状态。
  2. 避免丢失被监听缓存中的任何dirty tag。
  3. 如果存在*FWD,则用等效的Forwarding snoop替换 Non-forwarding。
  4. 一个Forwarding snoop只允许发送到一个RN-F。
  5. 一个stash snoop只允许发送到一个RN-F。
  6. 对于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状态的缓存行的副本,同时使任何缓存副本无效:

  1. HNF用于ReadPreferUnique的响应。
  2. snoopee的行为取决于它是否执行一个独占序列。

SnpUniqueStash

Snoop请求使Snoopee上的缓存副本无效,并建议Snoopee以唯一状态获得缓存行的副本:

  1. 允许Snoop响应包含DataPull。
  2. Snoop响应中的DataPull请求被视为ReadUnique。

SnpCleanShared 

        Snoop请求移除Snoopee上cacheline的任何脏副本。不能使cacheline保持为dirty状态。

SnpCleanInvalid

        Snoop请求无效Snoopee上的缓存行并获得任何脏副本。即使没有相应的请求,也可以由互连ICN生成。必须将cacheline更改为无效状态。

SnpMakeInvalid 

Snoop请求无效化Snoopee上的缓存行并丢弃任何脏副本:

  1. 不使用Snoop响应返回数据,脏数据将被丢弃。
  2. 必须将cacheline更改为无效状态。

SnpMakeInvalidStash

Snoop请求使缓存行的副本无效,并建议Snoopee获得处于唯一状态的缓存行的副本:

  1. Snoopee不能返回具有Snoop响应的数据,必须丢弃脏数据。
  2. 允许Snoop响应包含一个DataPull
  3. Snoop响应中的DataPull请求被视为ReadUnique

SnpQuery 

SnpQuery探测在请求节点处的缓存行的状态:

  1. HNF可以发送SnpQuery snoop,无需收到来自请求者任何相应的请求。
  2. snoop响应必须包含目标snoopee的缓存行的精确状态。
  3. Snoopee不能返回带有数据的Snoop响应。
  4. SnpQuery snoop不能更改Snoopee处的缓存行的状态。

SnpDVMOp

在互连ICN处生成,由DVMOp请求发起:

  1. 单个DVMOp请求生成两个snoop请求。
  2. 两个Snoop请求返回一个Snoop响应。

三、汇总

亿图地址:(主页资源,免费获取)

这篇关于【CHI】CHI协议,transaction事务汇总的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/257803

相关文章

MYSQL事务死锁问题排查及解决方案

《MYSQL事务死锁问题排查及解决方案》:本文主要介绍Java服务报错日志的情况,并通过一系列排查和优化措施,最终发现并解决了服务假死的问题,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录问题现象推测 1 - 客户端无错误重试配置推测 2 - 客户端超时时间过短推测 3 - mysql 版本问

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

SpringBoot嵌套事务详解及失效解决方案

《SpringBoot嵌套事务详解及失效解决方案》在复杂的业务场景中,嵌套事务可以帮助我们更加精细地控制数据的一致性,然而,在SpringBoot中,如果嵌套事务的配置不当,可能会导致事务不生效的问题... 目录什么是嵌套事务?嵌套事务失效的原因核心问题:嵌套事务的解决方案方案一:将嵌套事务方法提取到独立类

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A