Files
final-exam/计算机系统结构/重点复习/小题6-组相联映射与标识存储器.md

146 lines
5.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags:
- 计算机系统结构
- 重点复习
- Cache
- 组相联
- 标识存储器
create time: 2026-06-16 21:21
---
# 小题 6 — 组相联映射与标识存储器
## 概述
本题考查**组相联映射方式**下标识存储器(Tag Memory)的两种实现方法——**相联存储器**(Content-Addressable Memory, CAM)和**单体多字存储器**,以及所需的**比较器个数**。这是理解 Cache 硬件实现的关键知识点。
> [!tip] 考试重点
> 重点掌握组相联映射中两种标识存储器实现方案的比较器个数计算。相联存储器方案用 $n$ 个比较器($n$ 为相联度),单体多字存储器方案用 1 个比较器但需要多体并行读取。
## 正文
### 一、组相联映射回顾
$n$ 路组相联($n$-way Set Associative)是直接映像和全相联的折中:
| 特征 | 直接映像 | $n$ 路组相联 | 全相联 |
|:----:|:--------:|:----------:|:------:|
| 映射关系 | 一块对一行 | 一块对一组(组内 $n$ 行) | 一块对任意行 |
| 查找范围 | 1 个位置 | $n$ 个位置 | 所有位置 |
| 比较次数 | 1 | $n$ | 全部行数 |
> [!question] 为什么组相联需要标识存储器?
> 组相联映射中,一个主存块可以映射到一组内的**任意一行**。处理器发出的地址需要与该组内**所有行的 Tag**进行比较,才能确定是否命中。存储这些 Tag 并进行比较的硬件就是**标识存储器**。
### 二、标识存储器的两种实现方法
#### 2.1 方法一:相联存储器(CAM)
**相联存储器**是一种特殊的存储器,它不是通过地址访问,而是通过**内容匹配**来查找。每个存储单元都内置了一个比较器。
```mermaid
graph LR
subgraph CAM["CAM Implementation"]
T1["Tag Entry 1"] --> C1["Comparator 1"]
T2["Tag Entry 2"] --> C2["Comparator 2"]
T3["Tag Entry 3"] --> C3["Comparator 3"]
T4["Tag Entry n"] --> C4["Comparator n"]
end
ADDR["Input Tag"] --> C1
ADDR --> C2
ADDR --> C3
ADDR --> C4
C1 --> M["Match Logic"]
C2 --> M
C3 --> M
C4 --> M
```
| 项目 | 说明 |
|------|------|
| 存储结构 | 每个 Tag 条目自带比较器,**并行比较** |
| 比较器个数 | $n$ 个($n$ = 相联度/路数) |
| 速度 | **快**——所有路同时比较,一个时钟周期完成 |
| 硬件开销 | **大**——每个条目都需要一个比较器 |
> [!example] 示例:4 路组相联的 CAM 实现
>
> 每组有 4 个 Tag 条目,每个条目配一个比较器:
>
> | 组内行号 | Tag 存储 | 比较器 | 输出 |
> |:--------:|:--------:|:------:|:----:|
> | 行 0 | Tag₀ | CMP₀ | Hit₀ |
> | 行 1 | Tag₁ | CMP₁ | Hit₁ |
> | 行 2 | Tag₂ | CMP₂ | Hit₂ |
> | 行 3 | Tag₃ | CMP₃ | Hit₃ |
>
> **比较器个数 = 4 个**(每个时钟周期 4 路同时比较)
#### 2.2 方法二:单体多字存储器
将一组内所有行的 Tag 存在一个**单体多字存储器**中。每次读出该组所有行的 Tag,再用**一个比较器**逐个比较(或用一个多位比较器一次比较)。
```mermaid
graph LR
SET["Set Index"] --> MEM["Multi-Word Memory"]
MEM --> T["All n Tags in the Set"]
T --> CMP["1 Comparator (or sequential)"]
ADDR["Input Tag"] --> CMP
CMP --> HIT["Hit Signal"]
```
| 项目 | 说明 |
|------|------|
| 存储结构 | 一个存储器存所有 Tag,一次读出一组的所有 Tag |
| 比较器个数 | **1 个**(但位宽较大,需比较 Tag 的全部位) |
| 速度 | **较慢**——需要先读出再比较,可能需要多拍 |
| 硬件开销 | **小**——只需 1 个比较器 |
> [!question] 单体多字存储器方案真的只用 1 个比较器吗?
> 严格来说,如果要用**一拍**完成比较,需要用 $n$ 个比较器(读出 $n$ 个 Tag 同时比较)。如果允许**多拍**完成,可以只用 1 个比较器逐个比较。实际设计中通常在面积和速度之间折中。考试中需要根据题意判断。
### 三、两种方案的比较器个数总结
> [!abstract]- 答案
>
> | 实现方案 | 比较器个数 | 速度 | 硬件开销 |
> |----------|:----------:|:----:|:--------:|
> | **相联存储器(CAM)** | $n$ 个($n$ = 相联度) | 快(并行比较) | 大 |
> | **单体多字存储器** | 1 个(逐个比较)或 $n$ 个(并行比较) | 较慢 | 小 |
> [!note] 关键计算
>
> **$n$ 路组相联**标识存储器实现方案对比:
>
> | 参数 | CAM 方案 | 单体多字方案 |
> |:----:|:--------:|:----------:|
> | 存储器数量 | $n$ 个独立存储体 | 1 个多字存储体 |
> | 每个存储体宽度 | Tag 位宽 | $n \times$ Tag 位宽 |
> | 比较器个数 | **$n$ 个** | **1 个**(串行)或 **$n$ 个**(并行) |
> | 比较延迟 | 1 拍 | 1 拍(并行)或 $n$ 拍(串行) |
> | 适用场景 | 高速 L1 Cache | 面积受限的场景 |
### 四、数值化示例
> [!example] 完整示例
>
> **已知**:32 位地址,Cache 容量 16KB,块大小 64B,4 路组相联。
>
> - Offset = $\log_2(64) = 6$ 位
> - 组数 = $(16\text{KB} / 64\text{B}) / 4 = 64$ 组
> - Set Index = $\log_2(64) = 6$ 位
> - Tag = $32 - 6 - 6 = 20$ 位
>
> | 方案 | 存储器数量 | 每个体位宽 | 比较器个数 | 比较器位宽 |
> |:----:|:----------:|:----------:|:----------:|:----------:|
> | CAM | 4 | 20 位 | **4** | 20 位 |
> | 单体多字 | 1 | 80 位(4×20) | **1** | 20 位 |
> [!warning] 考试注意
> 题目问"比较器个数"时要明确是哪种方案。如果是 CAM 方案,答案是**相联度 $n$**;如果是单体多字方案串行比较,答案是 **1**。考试中如果题目没明确说明方案,通常默认是 **CAM 方案**(因为这是 Cache 最常用的高速实现)。
## 关联笔记
- [[计算机系统结构/复习文档/存储系统与Cache]]
- [[小题7-Cache不命中与3C模型]]
- [[大题4-Cache性能计算]]