RetToSrc
return to source的缩写,是Home Node在发送侦听请求时设置的一个属性,属于Snoop request的一个field。如果设置了RetToSrc, 就是告诉被侦听的节点:"如果你有数据,请不要把数据发给我,请直接把它发回给最初的请求者。"
ExpCompAck
它是一种由请求节点使用的机制,用于 明确地向系统确认,它已经安全地收到了一个完成响应,并且相关资源已经释放。
简单来说,它是在说:"我之前请求的那个事务,你(HN)已经告诉我完成了,我现在正式确认,我已经处理完毕,你可以彻底清理掉所有相关信息了。"
为什么需要 ExpCompAck?------ 解决一个关键问题
要理解 ExpCompAck
,必须先理解它要解决的问题:HN 的资源管理困境。
在没有 ExpCompAck
的普通事务中:
-
RN 发出请求,HN 为其分配资源(如缓冲区条目、跟踪记录)。
-
HN 处理事务,并向 RN 发送
Comp
或CompData
。 -
HN 在发送完
Comp
后,就立即释放其内部资源。
这看起来合理,但实际上存在一个风险:RN 可能由于各种原因(如缓冲区满、内部拥塞)未能成功处理这个 Comp
响应。如果 HN 已经释放了资源,当 RN 最终反应过来并试图重试或采取其他行动时,HN 可能已经"忘记"了这个事务,导致协议错误或死锁。
为了解决这个问题,CHI 引入了 持久性完成 的概念,而 ExpCompAck
就是其核心组成部分。
工作机制:持久性事务流程
ExpCompAck
通常与 Comp
响应中的 Persistent
属性配合工作。整个流程如下:
-
请求阶段:
- RN 发起一个请求(例如
ReadNoSnp
),并在请求包中设置ExpCompAck
位。这等于告诉 HN:"这是一个需要显式确认的事务,在我明确确认之前,请你为我保留资源。"
- RN 发起一个请求(例如
-
Home Node 处理:
-
HN 识别出
ExpCompAck
位。它为此事务分配资源,并 将其标记为"持久性"的,意味着该资源的释放将等待一个明确的信号。 -
HN 处理该请求,并准备发送完成响应。
-
-
完成响应阶段:
- HN 向 RN 发送完成响应(
Comp
或CompData
)。在这个响应包中,HN 会设置Persistent
位 ,作为对 RN 初始ExpCompAck
的回应,意思是:"好的,我知道你需要显式确认,这是我给你的完成信号,但我会把资源保持住,直到收到你的ExpCompAck
。"
- HN 向 RN 发送完成响应(
-
请求者确认阶段:
-
RN 收到带
Persistent
位的完成响应。 -
RN 内部安全地处理了这个完成(例如,将数据交付给核心,释放内部的
TxnID
和DBID
)。 -
一旦 RN 确定事务已完全处理完毕 ,它会向 HN 发送一个
ExpCompAck
事务 。这是一个独立的事务,其中包含原始事务的TxnID
和SrcID
。
-
-
Home Node 最终释放:
-
HN 收到
ExpCompAck
。 -
HN 现在可以 安全地释放 所有为该事务分配的宝贵资源。
-
LikelyShared
请求节点在发起读请求时提供的一个属性。向接收者(通常是Home Node)表明,请求者预测所请求的数据很可能被系统中的多个代理所共享,即告诉HN:我需要读这个数据,但我猜测其他组件可能也会读它,所以在处理我的都请求时,可以做一些优化来方便后续的访问。HN可以不做任何处理,即忽略LikelyShared的提醒;如果不忽略,可以做一些优化处理
PrefetchTgtHint
请求节点发出transaction的一个field。允许一个请求节点向系统发出一个预期请求,并指定数据在返回后应该在哪个特定的缓存层次或位置。简单来讲,不仅仅是读取一个数据,而是:请把数据取回来,并直接放在我设置的这个位置。例如,CPU告诉HN将数据放在GPU中。
DEEP persistent
请求节点发出transaction的一个field。一个相对高级且专门针对 持久化内存(Persistent Memory, PM) 的特性。
DEEP persistent 的核心运作依赖于两个关键概念:
1. Persistent Point
这是一个由 请求者 发起的特殊事务。它不是一个数据事务,而是一个 屏障 或 标记。
-
作用 :在事务流中创建一个"点"。请求者通过这个点要求:所有在此 Persistent Point 之前发出的、目标为 DEEP 持久化域的 写操作,都必须在该点被确认之前,完成持久化。
-
类比:就像在快递分拣中心设置一个检查点,要求所有在这个检查点之前收到的包裹,必须全部装车发走后,才能确认这个检查点已完成。
2. Persistent Acknowledge
这是系统对 Persistent Point 的响应。
-
作用 :当 Home Node 确保所有先前的写操作已经真正到达持久化介质(例如,已经刷新了内存控制器中的写持久队列并到达 PMEM)后,它会向请求者返回一个
CompAck
响应,作为对Persist
事务的确认。 -
意义 :一旦请求者收到这个
Persistent Acknowledge
,软件就可以确信:所有在Persist
点之前的写操作都已经安全了。如果此时发生断电,数据也不会丢失。
StashNID
Stash Node ID。Stash与 缓存预取 和 数据局部性 优化相关的独特且强大的功能。一个RN发出的读请求,可以设置StashNID和StashLPID(Stash Logical Processor Identifier)。HN除了将数据返回给RN外,还会发出一个SnpStash,将数据发送给StashNID+StashLPID
NS和NSE
Non-secure、Non-secure Extension,用来支持Trust-Zone
PBHA
Page-based Hardware Attribute,属于Data packet中一个field。它允许软件通过页表项中的特定比特位,向硬件传递微架构优化的提示 。简单来说,它让你可以在操作系统的内存管理层面,为不同的内存页"打上标签",然后硬件(如 CPU 缓存、互连网络)可以识别这些标签,并对这些页的访问采取不同的优化策略。
例如:PBHA = 2 :标记为 高优先级 数据。硬件可能会将其分配在靠近命中端的缓存位置,使其保留更长时间。
PBHA只是提示,而不强制实现。
FwdState
Forward State 是 Home Node 在其 目录 中为某个缓存行维护的一种特殊状态。当一条缓存线处于 Forward State 时,意味着 HN 知道系统中有一个或多个节点的缓存中持有该数据的有效副本,并且授权其中一个特定的节点作为"转发源",未来其他节点的读请求可以直接从这个"转发源"获取数据,而无需再访问主内存。
简单来说,HN 在此时扮演了一个"交通指挥员"的角色,它不再自己去内存取数据,而是告诉请求者:"数据不在我这儿,你去某某节点那里拿,它那儿有最新的副本。"
DBID
Data Buffer ID。CHI的数据和resp可能乱序返回,为了数据和resp的匹配,RN对发出的读请求分配一个RN内唯一的DBID,**后续返回给RN的数据,会贴上这个 DBID 标签(**包括数据和resp)。
RN 通过管理一个有限的 DBID 池,可以实施背压机制。如果 DBID 用尽,它将停止发出新的需要数据返回的请求,从而防止自身缓冲区溢出
PCrdReturn和PrefetchTgt不会返回retry的原因
PCrdReturn用来返回一个之前消耗的credit,不能retry,否则可能死锁;PrefecthTgt是提示性的,因此无需retry
RN-F & RN-I & RN-D
3类请求节点。区别在于是否参与数据的一致性维护;
RN-F完全参与数据一致性维护,比如CPU集群、GPU等;
RN-I是一个 I/O 一致性 的请求节点。它 不维护缓存一致性 ,但需要感知系统的一致性,依赖HN进行一致性管理;主要发起 ReadNoSnp
和 WriteNoSnp
等 不触发侦听 的请求。它不能发起 ReadUnique
这类会改变其他节点缓存状态的请求。RN-I不会接收或处理Snoop请求。比如网络控制器、存储控制器、USB/PCIe 控制器
RN-D 是一个 直接数据访问 的请求节点。这是三种类型中 最简单、能力最弱 的一种。RN-D 不能发起读操作 。它是一个纯粹的数据生产者。不处理任何Snoop请求。用于将数据直接写入内存或其他节点的缓存。例如DMA控制器、图像传感器接口等。
CompData
RN发出的读请求,如果HN本地cache有目标数据,则直接返回CompData(包含和response和read data)
RespSeqData & DataSeqResp
如果HN不能及时提供read data,可以先发送RespReqData,再发送DataSeqResp。RespReqData和DataSeqResp可由不同的组件发出,比如HN发出RespReqData,SN发出DataSeqResp。HN收到RespSeqData时,可提前发出CompAck,而不用等待DataSeqResp