CPU cache 即 CPU 高速缓存。例如 Intel Core i9-7980XE 的 cache 就有辣么大

本篇文章为复习性质的文章。

cache 的基本工作原理

主存和 cache 都按同样的大小划分为不同的区域。其中,主存中的这些区域称之为“块”,而 cache 中存放一个主存块的区域称为“行”,或“cache 行”。

每个 cache 行都需要一个有效位以说明该 cache 行中的信息是否有效。

cache 的访问过程

缺失处理

Title: 带 cache 的 CPU 的访存操作过程
st=>start: 开始
e=>end: 结束
op1=>operation: CPU 给出主存地址 AD
cond1=>condition: AD 所在块在 cache 中?
st->op1->cond1
op2=>operation: 从 cache 中取信息送 CPU
cond1(yes)->op2->e
op3=>operation: 从内存中取出 AD 单元所在块
op4=>operation: 在一个 cache 行中找到一个对应的空闲行
op51=>operation: 将 AD 单元内容送 CPU
op52=>operation: 将主存块复制到 cache 中
cond1(no)->op3->op4
op4->op51->op52(left)->e

cache 命中(hit)、命中率(hit rate)

不命中(miss)、缺失率(miss rate)

命中时间(hit time)

所用时间开销为主存访问时间 $$T_{m}$$ 和 cache 访问时间 $$T_{n}$$ 之和。

通常把从主存读入一个主存块到 cache 的时间 $$T_{m}$$ 称为缺失损失(miss penalty)

cache 行和主存块的映射

直接映射(模映射)

其基本思想是把主存的每一块映射到固定的一个 cache 行中,其映射关系如下:

$$ cache 行号 \equiv 主存行号\ (mod\ cache 行数) $$

主存分为三个字段:

标记   cache 行号  块内地址
+-----+----------+---------+

设 cache 共有 $$2^{c}$$ 行,主存共有 $$2^{m}$$ 块,主存块大小占 $$2^{b}$$ 字节,按字节编址,则 cache 行号占 c 位,主存块号占 m 位,块内地址有 b 位。由于 m 位主存块号被分解成标记字段和 cache 行号字段,因此标记字段占 t = m - c 位。

全相联映射

其基本思想是一个主存块可以装入 cache 的任一行中。每行有一个标记用于指出该行取自主存的哪个块。主存块可能在任意一行中,查找时需要比较所有 cache 行的标记,也因此主存地址中无需 cache 行索引,只有标记和块内地址两个字段。

 标记  块内地址
+----+--------+

为了加快比较速度,通常每个 cache 行都设置一个比较器,比较器位数等于标记字段的位数。

组相联映射

$$ cache 组号\ \equiv \ 主存块号\ mod\ cache组数 $$

其主要思想是将 cache 分成大小相等的组,每个主存块被映射到 cache 固定组中的任意一行,也即组相联采用组间模映射、组内全映射的方式。

组相联方式下,主存地址被划分为标记、 cache 组号和块内地址三个字段。

  标记  cache 组号  块内地址
+-----+-----------+--------+

假设 cache 共有 $$2^{c}$$ 行,被分成 $$2^{q}$$ 组,则每组有 $$2^{c}/2^{q}=2^{c-q}$$ 行。设 $$s=c-q$$ ,则 cache 映射方式称为 $$2^{s}$$ 路组相联映射。若主存共有 $$2^{m}$$ 块,主存块大小占 $$2^{b}$$ 字节,按字节编址,则块内地址共有 $$b$$ 位,cache 组号有 $$q$$ 位,标记和 cache 组号共 $$m$$ 位,因而标记占 $$t=m-q$$ 位。

cache 中主存块的替换算法

淘汰策略

先进先出 (First- In- First- Out, FIFO)

最近最少用 (Least- Recently Used, LRU)

采用 LRU 算法的每个 cache 行有一个计数器,记录主存块的使用情况。这个计数值称为 LRU 位,其位数与 cache 组大小有关。2-路组相联时有 1 位 LRU 位,4-路组相联时有 2 位 LRU 位。

最不经常用 (Least- Frequency Used, LFU)

和 LRU 类似,但不完全相同

随机替换

cache 一致性问题

全写法

(write through)

CPU 执行写操作时,若写命中,同时写 cache 和主存,写不命中有以下两种处理方式。

写分配法

(write allocate)

非写分配法

(not write allocate)

写缓冲

回写法

(write back)

CPU 执行写操作时,若写命中,则信息只被写入 cache 而不被写入主存;若写不命中,则在 cache 中分配一行,将该主存块调入该 cache 行中并更新 cache 中相应单元的内容。因此在写不命中时,通常采用写分配法进行写操作。

每个 cache 行有一个修改位(dirty bit)。

标签: none

添加新评论