请阅读【ARM Cache 系列文章专栏导读】
文章目录
- Cache 组相联映射
- 组相联映射原理
- 多路组相连缓存的优势
- 多路组相连缓存的代价
- 关联度(Associativity)
上篇文章:【ARM Cache 系列文章 11.1 – ARM Cache 全相连 详细介绍】
Cache 组相联映射
ARM核心的主要缓存总是使用一组多路组相连缓存实现的。这显著降低了与直接映射缓存相比出现的缓存抖动(Cache Thrashing)的可能性,从而提高了程序执行速度并使执行更加具有确定性。这种缓存组织方式以增加硬件复杂性和因每个周期比较多个标签而略增加功耗为代价。
直接映射和全相联映射其实很好理解, 直接映射是找车方便,全相联映射是停车方便。而组相联映射正是直接映射和全相联映射的组合解决方案。如下图所示,为一个组相联映射的停车场示意图。组相联映射有set 和way的概念,我们先简单理解为set就是行,way就是列。
组相联映射的停车规则如下:
当2号车停在了set2+way1的位置,102号车按照规则必须停在set2,所以102号车可以停在way0、way2和way3中的任意位置。
不同于直接映射的停车场,同一个set中甚至可以把所有way都填满,才会发生驱逐现象。如下图所示,72号车会根据替换策略,随机选择一个way,将这个way上的车子驱逐出去,然后停进来。
当要找车时,2号车的车主,根据直接映射规则直接去set2里找,虽然他不知道车子在哪个way中,但是即使是最坏的情况,车主也只需比较4次(停车场的列数)即可发现自己的2号车在不在当前停车场(hit 或者miss)。
组相联映射原理
如下图所示,为一个组相联cache的结构,其中有三个概念需要理解:
- way: 组相联cache 将cache分成几个大小相等的几片,每一片称为一个way,下图为一个 4-way的cache。
- index:cache 的index其实就是cache line的行号。
- set:index相同的cache line的集合称为一个set。比如way0、way1、way2和way3中index等于0的cache line称为set0。
上文组相联映射停车场示例中提到过,组相联映射实际上是直接映射与全相联映射的组合实现。也需要将一个地址分成如下三部分,其中地址的 index部分就是该地址在cache中所在的set 号。主存中index相同的地址将映射到同一个set(直接映射),但是一个set内有多个位于不同way的cache line,地址上的数据可以放入任意一个way中的cache line(全相联映射)。
如下图所示为一个2 way的cache结构。假设主存中地址0x00
、0x40
、0x80
的index都为0
,按照组相联映射规则,0x00
、0x40
、0x80
上的数据必须要存放在set0,但是可以在way0和way1中任意选择:
多路组相连缓存的优势
- 降低缓存抖动:通过允许每个内存位置可以映射到多个位置而非单一位置,多路组相连缓存降低了多个热点数据争用同一缓存行的几率。
- 提高程序执行速度:减少缓存未命中的几率意味着处理器可以更快地访问数据和指令,从而加快了程序的执行速度。
- 更确定性的执行:缓存的行为更加可预测,有助于实现更加一致的性能,特别是在实时系统中非常重要。
多路组相连缓存的代价
- 硬件复杂性增加:实现多路组相连缓存需要更复杂的硬件逻辑来管理多个“路”的数据和标签的比较。
- 功耗略增:由于每个访问周期都需要比较多个标签,这增加了功耗。
关联度(Associativity)
- 关联度指的是缓存中每个集合包含的行数。关联度高意味着每个内存地址有更多的缓存行可以映射到,从而降低冲突和提高缓存命中率。
- L1、L2和L3缓存的关联度可能不同,通常更高层级的缓存(如L3)具有更高的关联度以优化性能和容量。
提高缓存的关联度可以降低抖动(Thrashing)的概率。理想情况下是全相连(Fully Associative)缓存,任何主存储器(Main Memory)位置都可以映射到缓存中的任何位置。然而,除了非常小的缓存之外(例如,与MMU的TLBs(Translation Lookaside Buffers)相关联的缓存),构建这样的缓存在实践中是不切实际的。
在实践中,当关联度超过8路时,性能提升是最小的,而16路关联度对于更大的L2缓存来说更加有用。这意味着,虽然增加缓存的关联度确实可以提高缓存效率和减少冲突的可能性,但关联度的增加并不总是带来线性的性能提升。达到一定的关联度后,继续增加关联度所带来的性能提升将变得较小,同时硬件成本、复杂性和功耗可能会显著增加。