CPU 缓存系统


缓存中的 Tag 是用于识别缓存中的数据是否与当前请求的数据匹配的一个标记。它是缓存结构的重要组成部分,尤其在 直接映射缓存组相联缓存 设计中,Tag 主要用于解决 缓存命中缓存未命中 的问题。

1. 缓存的基本结构

缓存(Cache)是一个高速的中间存储器,它存储从主内存中读取的数据,目的是减少访问内存的延迟。它通过把主内存中的数据复制到缓存中,并在随后的请求中尽可能从缓存中读取数据来加速访问。

缓存的基本结构可以分为以下几个部分:

  • 数据块(Cache Line):缓存中存储的最小单位,一般为 32 字节、64 字节或更大。
  • 索引(Index):用于定位缓存中的具体位置(如缓存行)。
  • 标记(Tag):用于识别当前缓存行中存储的主内存地址范围。
  • 有效位(Valid Bit):表示当前缓存行中的数据是否有效。

2. Tag 的作用

在主存储器中,数据是按 地址 来定位的。在缓存中,由于缓存的容量远小于主存储器,不可能存储所有的内存数据。因此,缓存系统通过 Tag 来跟踪当前缓存中的数据块来自主存储器的哪个位置。

Tag 是主存储器地址的高位部分,用于唯一标识缓存中存储的数据块是否与当前请求的数据块一致。每当 CPU 访问数据时,缓存系统会执行以下步骤:

  1. 使用内存地址中的部分位来找到缓存中的一个特定位置(通过 Index 定位缓存行)。
  2. 检查缓存行中存储的 Tag,与内存地址的高位部分进行比较,判断这个缓存行中存储的数据是否是请求的数据。

3. Tag 的工作原理和比较过程

内存地址分解

一个内存地址可以分为三部分:

  1. Tag:高位,用于标识数据块的源内存地址。
  2. Index:中间部分,用于选择缓存中的具体缓存行或 set(在组相联缓存中)。
  3. Block Offset:低位,用于定位数据块中的具体字节。

举个例子,假设有 32 位地址空间,64 字节的 cache line 和 256 行的缓存,内存地址可以这样分解:

  • Tag(20 位):用于识别主内存中的数据块。
  • Index(8 位):用于选择缓存行。
  • Block Offset(6 位):用于选择缓存行中的具体字节。

缓存命中的步骤

当 CPU 发起对某个内存地址的数据请求时,缓存会执行以下操作:

  1. Index 查找

    • 通过地址的中间部分(即 Index),缓存系统可以快速找到对应的缓存行。在直接映射缓存中,Index 直接指向唯一的缓存行;在组相联缓存中,Index 选择一个缓存组(set),然后在这个组内进行进一步匹配。
  2. Tag 比较

    • 找到对应的缓存行后,缓存系统会查看该缓存行中存储的 Tag,并与请求地址的高位(即 Tag 部分)进行比较。如果存储的 Tag 与请求地址的 Tag 匹配,且有效位为 1,则说明缓存命中。
    • 如果 Tag 不匹配,则表示缓存未命中,需要从主存加载数据。
  3. 数据访问

    • 如果缓存命中,系统通过地址的低位(即 Block Offset)找到缓存行中的具体字节,返回数据给 CPU。
    • 如果缓存未命中,缓存系统将从主存读取数据,并将数据存储到缓存中,更新相应的 Tag 和有效位。

示例:

假设 CPU 访问一个 32 位地址,地址为 0xABCDEF12,缓存是直接映射的,具有 256 行,每行缓存大小为 64 字节。

  • 地址 0xABCDEF12 可以拆解为:

    • Tag(高 20 位):0xABCDE
    • Index(中 8 位):0xDF
    • Block Offset(低 6 位):0x12
  • CPU 首先使用 Index 部分 0xDF 来找到缓存中的第 223 行。

  • 然后比较该行的 Tag,看看是否为 0xABCDE。如果 Tag 相同且有效位为 1,表示缓存命中。

  • 如果命中,使用 Block Offset0x12)定位 64 字节缓存行中的具体字节并返回数据。

  • 如果未命中,缓存系统从主存读取数据,并用新的 Tag 0xABCDE 更新缓存行。

4. Tag 在不同缓存结构中的作用

  • 直接映射缓存:每个缓存行只有一个可能的存储位置(通过 Index 决定),所以在这个缓存结构中,Tag 非常重要,因为它是判断缓存命中与否的唯一依据。

  • 全相联缓存:在全相联缓存中,没有 Index,每个地址都可以映射到缓存中的任何行。因此,Tag 是唯一判断是否命中的条件。每次访问都要比较缓存中所有行的 Tag。

  • 组相联缓存:组相联缓存是直接映射缓存和全相联缓存的折中。多个缓存行被组织成一个组(set),一个地址通过 Index 选择一个 set,而 set 内的行用 Tag 进行比较。这样提高了命中率,同时减小了全相联缓存中的 Tag 比较开销。

5. Tag 比较的硬件实现

在硬件实现上,Tag 通常存储在与缓存行关联的元数据中(即 Tag 存储区)。当访问内存时:

  • Tag 比较逻辑:硬件会从请求的地址中提取 Tag,并与缓存行中存储的 Tag 进行比较。这个过程是通过专用的比较器(comparator)并行执行的,以确保比较速度足够快,通常在一个时钟周期内完成。

  • 多路组相联缓存:在多路组相联缓存中,可能需要对一个组内的所有缓存行同时进行 Tag 比较,因此会有多个比较器并行工作,以确定请求的地址是否命中缓存。

总结

Tag 是缓存系统中用于标识缓存行对应主存数据块的高位地址信息。它用于与内存地址的高位部分进行比较,判断当前缓存行中的数据是否是 CPU 请求的数据。Tag 的比较过程是缓存命中与否的核心,直接影响缓存性能。


Author: Yixiang Zhang
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Yixiang Zhang !
评论
  TOC