L1d CPU 缓存标记存储在哪里?

Where is the L1d CPU cache tag stored?

我正在阅读 What every programmer should know about memory,我正在为 CPU 缓存标签(第 15 页)的概念而苦苦挣扎。

如果我没理解错的话,每个CPU缓存行都有一个标签,它指定给定行对应于主存中的哪些数据。也就是说,如果您写入特定的行,您可以使用标记来找出您应该将此行的内容写入 RAM 中的哪个位置。相反,如果您将数据从 RAM 读取到 L1 缓存行,您会根据 RAM 地址计算一个标记并将其存储在某个地方,这样您就知道 L1 缓存行中的数据来自哪里。标签就像一个指针。

请问这个tag本身是写在cache line的某处,还是在L1 cache旁边有一些专门的内存用来存放tag?

在我的系统中,L1 行大小是 64 个字节,一个 ponter 是 8 个字节。我的目标是使程序中频繁迭代的对象不超过 64 字节吗?或者,鉴于标签的大小不应大于指针的大小,我应该以 56 字节为目标吗?

缓存小于主内存。因此,您需要一种机制将大量主内存条目映射到较少数量的缓存条目。为了像大多数缓存一样高效且廉价地执行此操作,我会使用地址中的一些最低有效位(比如 10 个)来索引缓存条目。如果您选择至少 10 位地址,则缓存中有 1024 个条目。也很有可能不止一个内存地址具有相同的至少 10 位。因此需要用相同的至少 10 位来区分不同的内存地址。因此,标签开始行动以提供服务。当您要将数据存储在缓存中时,使用至少 10 位来选择条目。并将缓存行视为具有两个要填充的字段的条目,第一个是我们存储剩余地址位的标记,第二个字段是我们存储数据的地方。

当有人说缓存行是 xxx 字节(在您的情况下是 64 字节)时,他们指的只是数据部分。因此,在您的情况下,如果您希望数据与缓存行对齐,则需要将它们填充为 64 字节,而不是 56 字节!

尺寸也一样。当引用缓存的大小时,它通常表示整个数据部分的大小,由于额外的簿记,如标签、有效位等,实际大小要大一些