2. 缓存基础:Cache层次结构(L1/L2/L3)、Cache Line概念、Cache命中与缺失
在ARM多核系统中,缓存(Cache)是弥合处理器核心与主存(DRAM)之间速度差距的关键硬件结构。理解缓存的层次结构、基本存储单元(Cache Line)以及命中/缺失行为,是后续分析缓存一致性协议(如MESI/MOESI)和性能调优的基石。
2.1 Cache层次结构(L1 / L2 / L3)
现代ARM Cortex-A系列处理器(如Cortex-A76、Cortex-X系列)通常采用三级缓存架构,每一级在容量、延迟和共享方式上各有不同:
| 层级 | 典型容量 | 延迟(CPU周期) | 关联性 | 共享范围 |
|---|---|---|---|---|
| L1 Cache | 32KB - 64KB(指令/数据分离) | 2 - 4 cycles | 4路 - 8路组相联 | 每个核心私有 |
| L2 Cache | 256KB - 1MB(统一) | 8 - 12 cycles | 8路 - 16路组相联 | 每个核心私有(部分SoC支持共享L2簇) |
| L3 Cache | 2MB - 8MB(统一) | 30 - 50 cycles | 16路 - 24路组相联 | 所有核心共享(DSU内) |
性能调优要点: L1延迟极低但容量有限,是热数据(hot data)的最佳驻留地。L3虽然容量大,但访问延迟是L1的10倍以上。调优时应优先确保频繁访问的数据集能装入L2甚至L1。
下图展示了典型ARM big.LITTLE或DSU(DynamIQ Shared Unit)架构下的三级缓存拓扑:
2.2 Cache Line 概念
Cache Line(缓存行)是缓存与主存之间数据交换的最小单位。ARM架构中,Cache Line的大小通常为 64字节(部分实现支持128字节)。这意味着即使CPU只访问一个4字节的int变量,缓存控制器也会将包含该变量的连续64字节数据一次性加载到Cache Line中。
空间局部性原理: Cache Line机制利用了程序访问的空间局部性——访问一个地址后,邻近地址很可能被后续访问。例如,遍历数组时,连续访问相邻元素会命中同一个Cache Line,大幅提升效率。
Cache Line 的内部结构:
- Tag(标签): 用于标识该Cache Line对应主存中的哪个地址块(高位地址)。
- Index(索引): 用于定位Cache Line在缓存中的组(Set)位置。
- Offset(偏移量): 用于在64字节的Cache Line内定位具体的字节地址(低6位)。
- Flag Bits(标志位): 包括有效位(Valid)、脏位(Dirty)以及缓存一致性协议状态位(如MESI的Modified/Exclusive/Shared/Invalid)。
下图展示了ARM Cortex-A系列处理器中,虚拟地址到Cache Line的映射关系:
2.3 Cache 命中与缺失
当CPU发起内存访问请求时,缓存控制器会依次检查L1、L2、L3缓存中是否存在所需数据。根据查找结果,分为以下三种情况:
- Cache Hit(缓存命中): 所需数据已在某级缓存中找到,CPU直接从缓存读取,无需访问主存。这是最理想的情况。
- Cache Miss(缓存缺失): 所需数据不在任何缓存中,必须从主存(或更慢的缓存层级)加载。缺失会引入数十到数百周期的停顿。
- Hit Under Miss / Miss Under Miss: 现代ARM处理器支持在等待缺失数据加载时,继续处理后续的缓存命中请求(非阻塞缓存),以隐藏部分延迟。
缺失的三种类型(“3C”模型):
| 缺失类型 | 英文全称 | 触发原因 | 调优方向 |
|---|---|---|---|
| 强制缺失 | Compulsory Miss | 数据首次被访问,从未加载到缓存中 | 预取(Prefetch)机制、软件预取指令(PRFM) |
| 容量缺失 | Capacity Miss | 工作集(Working Set)超过缓存容量,导致缓存行被逐出 | 优化数据结构大小、分块(Tiling)算法 |
| 冲突缺失 | Conflict Miss | 多个地址映射到同一个Cache Set,导致频繁替换 | 调整数据对齐、使用更大的关联度(如16路替代8路) |
伪共享(False Sharing)预警: 在多核环境下,即使两个核心访问的是不同变量,但如果它们位于同一个Cache Line内,其中一个核心的写入会导致另一个核心的Cache Line失效(Invalidation),引发不必要的缓存一致性流量和性能下降。这是后续章节的重点调优内容。
Cache 缺失的典型惩罚(Penalty):
- L1 Miss 到 L2 Hit:约 8-12 周期
- L2 Miss 到 L3 Hit:约 30-50 周期
- L3 Miss 到主存(DRAM):约 100-300 周期(取决于内存频率和延迟)
下图展示了CPU访问数据时,缓存命中与缺失的完整决策流程:
2.4 本章小结
- ARM多核系统采用 L1(私有)→ L2(私有)→ L3(共享) 的三级缓存层次,延迟逐级增加,容量逐级增大。
- Cache Line(64字节) 是缓存与主存交换的最小单元,包含Tag、Index、Offset及状态标志位。
- Cache Hit 提供极低延迟访问;Cache Miss 分为强制、容量、冲突三种类型,是性能调优的主要攻击点。
- 理解缓存层次和Cache Line结构,是后续分析缓存一致性协议(MESI/MOESI)和伪共享问题的基础。