常用的数据,为什么放在手边?
做作业时,把常用资料放在手边,能少跑几趟书架。缓存也把数据复制到靠近处理器的小存储里,方便很快再用。
跟住一个地址:手边已有正确副本,就直接取;没有,就从下一层拿来,并留下附近数据的副本。原来的数据并没有被搬走。
手边的位置有限。 缓存还得核对“这是谁的副本”,决定可以放哪里,满了换谁。不同安排会影响命中次数,却不是把缓存加大就能解决一切。
保持同一串地址,只改变一个条件
- 连续读取相邻地址,看看哪些数据跟着一次取回,之后可以直接命中。
- 反复读取同一小片,观察副本怎样被再次使用。
- 选“两个地址互相争位”,再增加可放的位置,比较同一串访问的结果。
容量、位置和替换规则是三件事
进一步操作与数值核对
- 选择“连续的八个地址”,逐个读取 0–7。第一次取来 0–3,地址 1、2、3 都命中;到 4 才取第二行。结果是六次命中、两次未命中,共搬运八字节。
- 选择“反复读同一小片”。再次出现的地址 0、2、3 仍使用缓存里的副本。访问邻居体现空间局部性,隔一小会儿再访问同一地址体现时间局部性;同一程序可以同时具有两者。
- 选择“两个地址互相争位”,采用“1 路,4 组”。0 与 16 来回出现,每次都未命中,其他三组仍空着。把它改为“2 路,2 组”,输入序列保留、缓存重新清空;同样 16B 容量,现在后四次都命中。
- 在二路模式下选择“最近使用与替换”。读取
0, 16, 0, 32,观察最后使用编号:32 替换的是 16,而不是更早装入但刚刚用过的 0。 - 选择“跨步读取四个远处地址”,观察一次次取回的邻居有没有被请求。需要整行搬运,并不保证程序会使用整行。
“访问进度”允许停在检查、复制和返回这几个教学阶段。计数与缓存更新发生在返回阶段,动画进度不是硬件时间。“下一次要读的地址”可以接在当前已完成状态后,替换尚未执行的后续地址;序列最多保留 32 次手动访问。切换相联度会对同一序列从空缓存重新计算。
想核对技术细节?
做作业时,把常用的几页资料放在手边,就能少跑几趟书架。缓存也把可能马上要用的数据复制到靠近处理器的小存储里。手边的位置有限,所以还得知道:这是谁的副本、能放哪里、满了换掉谁。
程序请求的是某个地址里的数据。缓存命中时,这份数据已经在小而近的存储中;未命中时,需要从下一层取来。这里把整个过程缩成一张 64 字节内存地图和 16 字节数据缓存,方便逐个看清身份,而不是模拟某款真实芯片。
默认每个缓存行包含四个连续字节。读取地址 1,未命中时复制的是对齐的地址 0–3,返回其中偏移为 1 的字节,其余邻居也留在缓存。主内存中的原件仍然存在。地图的范围标签是十进制地址,小格内的两位数字是十六进制数据,两者不要混淆。
一次命中必须同时满足两个条件:有效位为一,标签与请求相符。 组号只告诉我们去哪一组找;多个内存块可以映射到同一组,标签负责辨别到底缓存了哪一个。初始有效位为零,即使显示的标签恰好也是零,也不能算命中。
怎样从地址算出标签、组号和偏移?
设数据容量为 C,每行字节数为 B,每组路数为 W。本篇只使用二的整数次幂,组数为 S = C / (B × W)。对于字节地址 a:
默认 C=16, B=4, W=1,所以有四组。地址 18 的六位二进制为 01 | 00 | 10:标签 1、组号 0、偏移 2,对应地址 16–19 中的第三个字节。改变路数会改变组数,也会改变地址字段的分界;没有组索引位的全相联配置仍有标签与偏移。
Cornell 的缓存参数练习使用容量、行大小与相联度这三个量推导地址字段。
为何有空位,还会冲突?二路又为何仍需替换?
默认直接映射中,0 和 16 的块号分别为 0、4,除以四组都余零。各组只有一路,它们不能任意借用旁边的空组。六次交替读取产生六次未命中、五次替换,搬运 24B。改为二路两组后,总行数仍是四;两块可同时留在零号组,只有最初两次未命中,搬运 8B。
本模型在组内优先使用无效位置;组满时采用精确 LRU,换走最近一次访问最早的那行。命中也会刷新使用记录,所以 LRU 不等于先入先出。它只观察历史,并不知道下一个请求。在 0,16,0,32,16 中,后两次依次替换 16、0 所在的行。
Cornell 缓存讲义讨论了有效位、标签、映射、组相联和替换策略。
行越大越好吗?这里的计数代表什么?
公平比较行大小时,数据容量保持 16B。每行 1B 可以放十六行;每行 4B 只能放四行。读取相同的 0–7,前者八次填充,后者两次填充,实际搬运总量都是八字节。如果改成跨步序列 0,16,32,48,0,16,32,48,两种直接映射都八次未命中,但 4B 行搬来 32B,1B 行只搬来 8B。较大的行可能带来未使用的邻居。
Intel 的局部性说明讨论连续访问与重复使用怎样帮助利用缓存;本篇用极小的行和容量把这种关系展开,不沿用某款处理器的实际参数。
这里只模拟只读请求、空缓存启动和精确 LRU。容量仅计算数据字节,不包括标签、有效位和替换记录,因此相同数据容量不代表相同硬件成本。没有写回、预取、多级缓存、缓存一致性、虚拟寻址或时间模拟。H/M 与搬运字节数描述这串请求的结果,不能直接换算成处理器性能。