2路组相联缓存

2路组相联缓存(2-Way Set-Associative Cache)是组相联缓存的一种形式,在这种缓存结构中,每个缓存组中有两个缓存行(也称为“路”),这意味着,每个内存地址可以映射到两个不同的缓存行中的任何一个,而不是像直接映射缓存那样只能映射到一个特定位置。

1. 基本结构

Set 0 [Way 0] [Way 1]
Set 1 [Way 0] [Way 1]
Set 2 [Way 0] [Way 1]
... ... ...
Set N [Way 0] [Way 1]

N是组数,每一个组内有2路;
举例说明:
在一个16KB的2路组相联的缓存中,缓存被分成多个组(Set),每个组有两个缓存行(Way 0 和 Way 1), 如果缓存的块大小(即一个缓存行的大小)为 64 字节,那么一共有:
16KB/(64B∗2) = 128个组。

2. 工作原理

2路组相联缓存的基本原理是将缓存分成若干组,每组有两条缓存行,其工作流程如下:

地址分解:将内存地址分解为三部分:
    块内偏移(Block Offset):用于定位缓存行中的具体字节,位于最低比特位置,例如,如果块大小为64字节,则块内偏移量将为6位(2^6 = 64字节)。
    组索引(Index):用于选择缓存中的哪一个组,位于中间比特位置,如果缓存有2^N个组,则组索引长度为N位。
    标签(Tag):用于与组内缓存行的标签比较,判断是否缓存命中,位于最高的比特位置。
    例如: Tag |  Index | Block Offset
组选择:处理器根据内存地址中的组索引选择对应的组。

标签匹配:处理器会将该地址的标签与组内两条缓存行的标签进行比较。
    如果标签匹配且缓存行有效,则缓存命中,处理器直接从该缓存行中读取指令或数据。
    如果两条缓存行的标签都不匹配,则发生缓存未命中(Cache Miss),处理器需要从主存加载数据,并将其存入缓存组中的一个缓存行。

替换策略:在缓存未命中的情况下,如果目标组中两条缓存行都已经满了,缓存需要使用替换策略决定将哪一条缓存行替换掉。常见的替换策略包括:
    LRU(Least Recently Used,最近最少使用法):替换最久未使用的缓存行。这是最常见的一种替换策略。
    随机替换(Random Replacement):随机选择一个缓存行进行替换。
    FIFO(First-In-First-Out,先进先出法):替换最早进入缓存的缓存行。

3. 优点

  1. 较低的缓存冲突:相比于直接映射缓存,2路组相联缓存允许每个内存块映射到两个缓存行中的任意一个,减少了缓存冲突的可能性。
  2. 较好的性能平衡:2路组相联缓存在性能和硬件复杂度之间达到了良好的平衡。相比全相联缓存,其硬件开销较低,查找速度也更快。

4. 一个疑问

如果一个2路组相联指令缓存的大小是16KB,而实际的指令大小只有8KB不到,那么是不是只用到其中1路,另外一路根本用不到?
答:不是,如果指令的内存地址分布非常集中,可能会出现其中一条路(如Way 1)不被使用,但如果指令的内存地址分布非常分散,有的跳转指令之间的地址跨度非常大,那么就算指令总的大小不超过8KB,也需要用到2路。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容