caching - 缓存内存: What is the difference between a tag and an index?

标签 caching cpu cpu-architecture memory-address

我读了很多文章并观看了解释缓存概念的视频,但我仍然不明白地址格式中的索引和标签之间有什么区别。他们都说我们需要一个索引,因为否则多个位置将被散列到缓存中的同一位置。但我不明白。有人可以解释一下吗? 谢谢。

最佳答案

作为简单数字的地址,通常视为无符号整数:

+---------------------------+
|          address          |
+---------------------------+

相同的地址(相同的总数)被缓存分解为称为字段的片段:

+----------------------------+
|    tag    | index | offset |
+----------------------------+

对于任何给定的缓存,标记宽度、索引宽度和偏移宽度都以位为单位并且是固定的,并且对于任何给定的地址,每个字段当然都有一个我们可以确定的值,前提是我们知道地址以及给定缓存的字段宽度。

缓存将主内存的复制存储在称为 block 的 block 中。要查找某个地址的 block 地址,请保持其标记和索引位不变,但将 block 偏移位设置为零。


假设有两个地址:A 和 B。A 有标签、索引和偏移量,B 也有标签、索引和偏移量。

我们想知道 A 和 B 是否与内存块的级别匹配 - 这意味着我们关心标记和索引位匹配,而不关心偏移位。

从上面可以看出,两个地址可以不同,但​​具有相同的索引 - 许多地址将共享相同的索引,但具有不同的标记或不同的偏移位。

现在,假设 B 是已知要缓存的地址。这意味着B的标签和B的索引的内存块在缓存中。整个 block 都在缓存中,其中所有地址都具有相同的标记和索引,以及任何可能的偏移位。

假设 A 是程序想要访问的某个地址。缓存的作用是确定 A 和 B 是否引用同一 block 内存,如果是,则由于 B 在缓存中,因此 A 的访问在缓存中命中,而如果 A 和 B 不引用同一 block 内存内存块,则缓存中存在未命中。

缓存采用数组的概念。他们使用数组元素的索引位置来简化操作。简单(直接映射)缓存将在数组中的每个索引位置存储一个 block (其他缓存将在数组中的每个索引位置存储多个 block :这是指缓存的设置关联性级别,“路数”) “,如 2 路或 4 路等)。为了找到所需的元素 A,我们需要在缓存中查找。这是通过获取 A 的索引位置并将其用作缓存数组中的索引来完成的。如果该元素已经有一个地址 B 的 block ,并且存储在其中的 B 标记与 A 的标记值相同,则索引位置和标记都匹配 - 索引匹配是因为我们在正确的位置查找,而标记匹配是因为缓存存储B 的标签,我们拥有 A 的全部,因此可以将 A 的标签与 B 的标签进行比较。

这样的高速缓存永远不会将地址 block 存储在与其地址的索引位置值不同的索引位置处。因此,只有一个索引位置可供查看,以查看缓存是否存储与地址 A 关联的 block 。


They all say that we need an index because otherwise multiple locations would get hashed to the same location within the cache

缓存架构中存在一种退化情况,其中索引大小为 0 位宽。这意味着无论实际地址 A 是什么,所有地址都存储在同一个索引位置。比如缓存是“全关联的”并且不使用索引字段(或者索引字段的宽度为零)。

索引(当存在于缓存架构中时)的好处是硬件的简化:它只需查看存储在 A 索引处的 block ,而不必查看存储在缓存内其他索引处的 block 。

不使用索引的好处是一个地址永远不会仅仅因为具有相同的索引而驱逐另一个地址;全关联缓存受到的缓存抖动较少。

关于caching - 缓存内存: What is the difference between a tag and an index?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72889337/

相关文章:

java - Spring Cache Evict 不起作用

ios - HTTP GET 请求的缓存不适用于 iOS 6

c++ - 我可以更改 CPU 模式以读取内存吗?

git - 删除 Git 凭据-osxkeychain

javascript - 如何重用缓存的ajax请求?

c - pthread_cond_wait() 不会让 CPU 休眠吗?

cpu - Sandy-Bridge CPU 规范

x86 - amd和intel程序员模型兼容性

c++ - 在 Linux 上以编程方式获取准确的 CPU 缓存层次结构信息

cpu-architecture - 目标文件体系结构是否独立?