vault backup: 2026-06-16 21:34:37
This commit is contained in:
@@ -0,0 +1,145 @@
|
||||
---
|
||||
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性能计算]]
|
||||
Reference in New Issue
Block a user