• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

缓存一致性

好的,我们来详细、深入地解析 ARM 架构中的缓存一致性机制。这对于理解现代多核处理器(如手机、服务器芯片)如何高效协同工作至关重要。

ARM 的缓存一致性解决方案是其架构的一大特色,它主要通过 “总线监听” 和 “一致性互联协议” 来实现,其中最核心的概念是 ACE 和 CHI。

核心机制:基于监听(Snooping)的 Coherency Fabric

与现代 Intel 或 AMD 处理器采用的“基于目录”的协议不同,传统 ARM 多核系统通常采用基于 监听 的机制。其核心思想是:

  1. 共享互联:所有处理器核心(Cache)、主内存(DDR)和其他能够发起内存访问的主设备(如 DMA、GPU)都连接到一个共享的系统互联总线(Coherency Fabric)上。
  2. 广播与监听:当一个核心(例如 CPU0)要写入一个共享的内存块时,这个写入请求会被广播到互联总线上。
  3. 其他核心响应:总线上所有其他核心(CPU1, CPU2...)的缓存控制器一直在“监听”总线上的事务。如果它们发现广播的地址正好存在于自己的缓存中,它们就会根据协议规则采取行动(例如,将自己的缓存行置为无效状态)。

为了实现这一机制,ARM 定义了一套标准的协议。


关键协议:ACE 和 CHI

ARM 定义了两种主要的协议来规范缓存一致性交互:

1. AMBA ACE (AXI Coherency Extensions)

  • 是什么: ACE 是 AMBA AXI 总线协议的扩展。它为核心间通信定义了一组额外的信号和通道,专门用于传输缓存状态信息和支持监听操作。

  • 参与者角色:

    • Master: 能够发起读写请求的组件,如 CPU 核心。
    • Slave: 响应请求的组件,如内存控制器。
    • Interconnect: 系统互联组件,负责路由请求和响应。
  • 核心状态: ACE 协议基于 MOESI 状态机的增强版。MOESI 比经典的 MESI 多了一个状态,能更高效地处理数据共享。

    状态 全称 描述 与 MESI 的对比
    M Modified 唯一、已修改。缓存中的数据是最新的,内存中的数据是旧的。 同 MESI
    O Owned 共享、已修改。当前缓存和其他一些缓存拥有该数据副本,但当前缓存的数据是最新的(“脏”的),并且有责任在需要时提供数据。内存中的数据是旧的。 ACE 关键增强。允许“脏”数据在缓存间共享,避免立即写回内存,节省带宽。
    E Exclusive 唯一、干净。缓存独占该数据,且与内存一致。 同 MESI
    S Shared 共享、干净。多个缓存有该数据副本,且都与内存一致。 同 MESI
    I Invalid 无效。缓存行数据无效,不可用。 同 MESI
  • 监听操作:

    • 当一个 Master(如 CPU0)要写入数据时,它会通过 Interconnect 向所有其他 Master 广播一个“监听请求”。
    • 其他 Master 的缓存控制器检查自己是否有该数据的副本(即地址是否匹配)。
    • 它们根据自己缓存行的当前状态(M, O, E, S, I)通过“监听响应”来回复。
    • Interconnect 收集所有响应,决定最终操作。例如,如果其他缓存有副本(S状态),则通知它们将缓存行置为 I(Invalid)。

2. AMBA CHI (Coherent Hub Interface)

  • 是什么: CHI 是 ACE 的演进和替代品,专为更大规模、更复杂的多核、多芯片系统设计(如 Neoverse 系列服务器芯片)。它将通信模型从共享总线转变为基于包(Packet-based) 的网络式结构(NoC, Network-on-Chip)。
  • 主要改进:
    • 可扩展性: 共享总线在核心数很多时会成为瓶颈。CHI 的 NoC 结构允许更多的节点和更复杂的拓扑, scalability 更好。
    • 效率: 基于数据包的传输允许更复杂的路由、流量控制和 QoS(服务质量)。
    • 差异化: 分离了请求和响应路径,降低了延迟。
    • 层次化一致性: 更好地支持多颗芯片之间的一致性(例如,通过 CCIX 或 CXL 协议)。

软件视角与注意事项

对应用程序员来说,ARM 的硬件缓存一致性是透明的。你不需要为了一个数据在不同 CPU 缓存之间同步而写任何特殊代码。然而,这不等于你不需要关心同步!

  • 硬件保证的是“最终一致性”: 硬件确保了当一个 CPU 写入数据后,其他 CPU 最终会看到这个新值。但它不保证新值何时会被看到。
  • 内存一致性(Memory Ordering)问题: 这是另一个层面的事情。由于存在指令重排序(编译器优化和处理器乱序执行),一个 CPU 核心看到的多个内存地址的写入顺序,可能和另一个核心看到的顺序不一样。

这就是为什么你仍然需要内存屏障(Barriers)和原子操作(Atomics)的原因。

举例说明:

// Initial: data = 0, flag = 0

// CPU 0
data = 42;
// Without a barrier, the store to `flag` might be seen by CPU1 BEFORE the store to `data`!
flag = 1;

// CPU 1
while (flag == 0) { /* spin */ }
print(data); // Could this print 0? YES, without proper synchronization!
  • 硬件缓存一致性保证了如果 CPU1 看到了 flag == 1,那么它最终一定能看到 data = 42。
  • 但是,内存一致性模型(ARM是弱内存模型)允许 CPU0 的两条写入指令被其他核心以不同的顺序观察到。CPU1 可能先看到 flag=1,然后才看到 data=42,从而导致它打印出旧的 data 值 0。

解决方法:在 CPU0 的写入之间插入一个内存屏障,强制 data=42 的写入必须在 flag=1 的写入之前对其他核心可见。

// CPU 0
data = 42;
__dsb(ishst); // Data Synchronization Barrier: ensure all memory accesses before this complete
flag = 1;

总结:ARM 缓存一致性的要点

  1. 基础机制: 基于 监听(Snooping) 和 一致性互联(Coherency Fabric)。
  2. 关键协议:
    • ACE: 用于中等规模系统,基于增强的 MOESI 状态机,通过总线扩展信号实现。
    • CHI: 用于大规模服务器和高端SoC,基于数据包的网络结构,可扩展性更强。
  3. 对程序员透明: 硬件自动维护单个内存地址在多个缓存中的副本一致性,程序员无需干预。
  4. 不替代同步: 硬件缓存一致性不解决内存操作顺序(Memory Ordering)问题。要保证多个内存地址访问的逻辑正确性,程序员必须使用锁、内存屏障或原子操作等同步原语。

简单来说,ARM 的硬件让你不用担心数据副本的不同步,但你必须自己通过代码来定义操作顺序的规则。

posted on 2025-09-15 21:28  SOC验证工程师  阅读(246)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3