Cache Line的状态必须是这四个中的一种。前三种状态均是数据有效下的状态。Cache Line有两个标志-脏(dirty)和有效(valid)。脏代表该数据和内存不一致。只有干净的数据才能被多个Cache Line共享。

Intel维护Cache一致性使用的是MESIF协议,在MESI的基础上又增加了一个forward,允许有shared cache line的CPU进行cache和cache之间的数据传输。forward指定shared中的一个cache line响应数据请求,cache line有多个shared,但是有一个forward。MESIF主要通过snoop协议完成,但也添加了directory协议的支持,用于调高带宽和效率。

  1. Core A​ 读取数据X,缓存行状态为 ​Exclusive(E)​
  2. Core B​ 也读取X,此时Core A的缓存行降为 ​Shared(S)​,Core B的缓存行同样为S。
  3. Core A​ 修改X,需向总线发送“写请求”(BusRdX),其他核心的X缓存行变为 ​Invalid(I)​,Core A的缓存行升为 ​Modified(M)​
  4. 当Core B再次读取X时,需从Core A或主存获取最新数据。

将临界区代码标记为“事务”,若执行期间无冲突则原子提交,否则回滚。

RTM(Restricted Transactional Memory)​

  • 使用XBEGIN/XEND指令显式定义事务范围。
  • 若事务失败(冲突或容量溢出),跳转到XBEGIN指定的回滚代码路径。
  1. HLE(Hardware Lock Elision)​

    • 通过XACQUIRE/XRELEASE前缀优化锁操作,尝试无锁执行临界区。
    • 若成功,避免锁竞争;失败则退化为传统锁机制。

多核之间存在三条线,SHARED负责状态的更新

当要读取a0时

首先应该snop其它核中是否有状态为M或E,

        如果有,那么应该让它们先把数据写回到内存当中

然后使其的状态变为S,再

CXL.cache 协议将 Device 和 Host 之间的交互定义为每个具有至少一个关联响应消息的请求的数量,有时是数据传输。 该接口由每个方向的三个通道组成:请求、响应和数据。 通道以其方向命名,D2H 表示Device to Host 和 H2D for Host to Device,以及它们携带的交易、请求、响应和数据

Valid : 说明此请求有效
Opcode : 请求的操作码,表示这个请求的主要功能,重点
Address : 携带的一致性请求的物理地址,因为要对内存进行操作,所以要有对应的地址信息
CQID : 命令队列ID, 这部分包含与请求相关的跟踪者ID, 当请求的响应和数据返回的时候,其中的 CQID 向设备表明哪一个请求的跟踪索引。就是一个唯一标识,用来请求者接收到响应之后,能够区分是响应的哪一个请求
NT :对于可缓存的读,这个区域被作为一个提示,用来向主机表示它应该如何被缓存

  1. RspIHit

    • 含义:缓存行在 Device 中不存在(Invalid 状态)。
    • 用途:表示缓存行未命中,无需进一步操作。
  2. RspSHit

    • 含义:缓存行在 Device 中处于 Shared(共享) 状态。
    • 用途:表示缓存行是干净的,无需写回主存。
  3. RspSHitSE

    • 含义:缓存行在 Device 中处于 Shared 或 Exclusive(独占) 状态。
    • 用途:表示缓存行是干净的,无需写回主存。
  1. SnpInvOwn

    • 功能:查询 Device 缓存行的状态,使其无效化,并将所有权转移到 Host。
    • 用途:用于独占写操作前的缓存行清理和所有权转移。

Hit 后的字母(后缀)
  • SE:组合状态,表示缓存行在响应后的状态可以是 Shared 或 Exclusive。具体取决于 Host 的 Snoop 请求类型和后续操作:
    • 若 Host 发起 SnpData 请求获取数据,Device 返回 RspSHitSE 后,缓存行仍可能保持 Shared 或 Exclusive
    • 若 Host 发起 SnpInv 请求使缓存行无效化,Device 需将状态转为 Invalid,并返回不同的响应(如 RspIHitI)。
特性 RspSHit RspSHitSE
缓存行状态 仅 Shared Shared 或 Exclusive
数据状态 Clean(与主存一致) Clean(Shared)或 Clean(Exclusive)
适用 Snoop 请求 需要确认缓存行是否为 Shared 状态 需要兼容 Shared 和 Exclusive 状态的查询
典型场景 Host 需要共享数据且无需写回 Host 需要获取数据但允许 Device 保留独占权

Snoop 交互流程

  1. Host 发起 Snoop 请求(如 SnpDataSnpInv 等)。
  2. Device 根据缓存行状态返回对应的 Snoop 响应(如 RspSHitSERspSHitM 等)。
  3. Host 根据响应更新全局一致性状态,并可能触发数据写回或共享。

什么是“所有权”(Ownership)?

在缓存一致性协议中,所有权(Ownership)​​ 表示某个核心或设备对特定缓存行的数据拥有唯一修改权最新版本。其技术本质是:

  • Modified 状态(MESI 中的 M)​:拥有者持有最新数据,其他缓存中该行的副本均为无效(Invalid)。
  • Exclusive 状态(MESI 中的 E)​:拥有者独占数据,但未修改(与主存一致),可直接写入。

所有权的转移意味着将这种“唯一修改权”从一个实体(如设备)转移到另一个实体(如 Host CPU)。

SnpInvOwn(Snoop Invalidate and Transfer Ownership)是一种缓存一致性指令,常见于异构系统(如 CPU 与 GPU、DMA 设备共享内存)。其功能分两步:

  1. 使设备的缓存行无效化(Invalidate)​:强制设备放弃该缓存行的副本。
  2. 将所有权转移到 Host:确保 Host 获得该缓存行的独占控制权(Exclusive 或 Modified 状态)。

假设一个 DMA 设备正在向内存写入数据,完成后需通知 Host 读取最新数据:

  1. DMA 设备完成写入,缓存行处于 ​Modified​ 状态。
  2. Host 发起 SnpInvOwn 请求:
    • 无效化:DMA 设备的缓存行被标记为 ​Invalid,强制其将数据写回主存(若未完成)。
    • 所有权转移:Host 的缓存行获得 ​Exclusive​ 或 ​Modified​ 状态,确保后续操作由 Host 独占

缓存行状态转换
  • 设备侧:收到 SnpInvOwn 请求后:
    • 若缓存行状态为 ​Modified:将数据写回主存,并标记为 ​Invalid
    • 若状态为 ​Exclusive/Shared:直接标记为 ​Invalid
  • Host 侧:在总线事务完成后:
    • 若数据已写回主存:Host 缓存行状态为 ​Exclusive​(与主存一致)。
    • 若设备未写回(由协议决定):Host 可能直接从设备获取数据,状态为 ​Modified

DMA 写入完成:设备通过 SnpInvOwn 将数据所有权转移给 Host,Host 无需手动刷新缓存即可读取最新数据。

内存屏障(也称内存栅栏、屏障指令)是一类同步屏障指令,强制CPU或编译器在屏障点之前的所有读写操作完成后,才能执行屏障点之后的操作

其核心作用包括:

  1. 阻止指令重排序:现代处理器和编译器为了提高性能会进行指令乱序执行(Out-of-Order Execution),内存屏障通过强制顺序执行避免由此引发的逻辑错误

保证内存可见性:确保一个线程对共享内存的修改能被其他线程及时观察到,避免读取到“脏数据

内存屏障主要应对以下两类问题:

  1. 缓存一致性问题
    多核系统中,每个CPU核心有自己的缓存(Cache),可能导致不同核心看到同一内存地址的值不一致。例如:

    • Store Buffer延迟写入:CPU的写操作可能先存入Store Buffer而非直接写入缓存,其他核心无法立即感知变化

 ​Invalidate Queues延迟失效:缓存行失效请求可能被暂存而未及时处理,导致读取旧数据

SnpInvOwn(Snoop Invalidate Own)​是缓存一致性协议(如MESI)中的一种操作,用于标记某个核心独占缓存行并使其在其他核心中失效。此操作通常伴随内存屏障的原因如下:

  1. 保证失效操作完成:内存屏障强制将Store Buffer中的数据刷入缓存,并确保Invalidate消息被其他核心处理完毕,避免后续操作读取到失效前的旧数据

 

CXL.cache​(缓存一致性协议):使CPU与加速器(如GPU/FPGA)共享缓存行级数据,支持原子操作和细粒度同步,消除传统PCIe架构中数据复制的开销

在多数情况下,为了提高系统性能,内存操作策略被配置为write back,write back策略大大减少了数据写到Memory的频率,大部分情况数据只保留在Cache中并在Cache中被更新。

CXL将硬件形式的Cache agent和Home agent内置于CPU之中,Host即可利用Cache agent和Home agent直接通过CXL BUS访问外设的Cache和Memory

但这需要BUS上每个处理器都要每时每刻监听总线上的变化,这无疑加深了处理器的负载

CXL的非对称协议(Asymmetric Protocol)是解决异构计算场景下缓存一致性问题的核心机制之一。其核心思想是通过主机集中管理缓存一致性,降低设备侧的设计复杂度,从而实现CPU与加速器、内存扩展设备之间的高效协作

  • CXL.io协议:继承并扩展PCIe 5.0/6.0的I/O协议,负责设备发现、配置和传统DMA操作。
  • CXL.cache协议:定义设备与主机之间的缓存一致性交互,支持请求-响应机制(如缓存行状态查询、更新通知)。
  • CXL.mem协议:允许主机以Load/Store指令直接访问设备内存,实现内存池化

这三个协议通过Flex Bus机制共享PCIe物理层(PHY),链路层动态复用数据流

减少设备侧负担
设备仅需实现轻量级的缓存代理(Cache Agent),无需处理复杂的全局一致性逻辑。例如,当GPU修改缓存数据时,只需通知主机侧的Home Agent,由主机完成全局状态更新和广播

主机集中控制一致性
在非对称架构中,缓存一致性代理(Home Agent)仅部署在主机(CPU)侧,由主机统一管理所有外设(如GPU、FPGA)的缓存状态

  • Modified:数据被设备修改且未写回内存时,主机通过Snooping机制广播失效信号。
  • Exclusive:数据仅存在于一个设备缓存中,允许直接修改。
  • Shared:数据存在于多个设备缓存,需通过主机协调写操作。
  • Invalid:缓存行无效,需从主机或其他设备获取最新数据。

CCIX(对称)​

  • 对等一致性:所有设备(如CPU、加速器)均需实现Home Agent和Cache Agent,平等参与缓存一致性管理

加速器可直接访问其他设备的缓存,但需通过复杂的侦听协议(Snoop Protocol)维护一致性

共享虚拟内存模型:数据通过虚拟地址(VA)在设备间自动同步,无需软件干预,但需要所有设备支持一致性代理 

CXL

  • 简化设备端设计:设备仅需支持CXL.cache或CXL.memory协议,无需独立的一致性代理,适合异构加速器(如GPU、FPGA)低成本接入

协议分层复用:基于PCIe 5.0/6.0物理层,兼容现有PCIe生态,支持动态复用CXL.io(I/O)、CXL.cache(缓存访问)、CXL.mem(内存访问)协议

CXL

  • 统一内存池:主机可透明访问设备内存(CXL.mem协议),支持内存扩展和池化,例如将多个设备的DRAM整合为逻辑统一内存

  • CXL.cache 允许设备缓存主机内存,使用MESI一致性协议,这对于需要频繁访问主机内存的加速器(如GPU或FPGA)非常重要。
  • CXL.mem 使得主机可以像访问本地内存一样访问设备的内存,支持主机管理的设备内存(HDM)

Type 3设备的核心功能是扩展内存带宽和容量,例如连接DRAM、持久内存或其他存储介质。这类设备的主要角色是提供附加的存储资源,而非作为计算密集型加速器(如GPU或FPGA)执行需要缓存主机内存的操作。

CXL.cache协议的核心是允许设备主动缓存主机内存(例如通过MESI一致性协议优化访问效率)。而Type 3设备作为被动存储扩展单元,其内存由主机直接管理(通过CXL.mem协议),自身不需要主动缓存主机内存或维护复杂的缓存一致性状态。

  1. Type 3设备支持多级内存(如高性能DRAM与高容量持久内存混合使用),其设计目标是通过灵活的物理拓扑提供存储资源,而非与主机共享缓存。主机通过CXL.mem协议直接管理设备内存,无需设备端缓存介入。

总结:Type 3设备的功能专注于内存扩展,不涉及需要缓存主机内存的场景,因此无需实现CXL.cache协议。这种设计权衡降低了复杂性,使其更高效、低成本地满足存储扩展需求。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐