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

时间:2017-01-27 15:41:17

标签: memory cpu-architecture cpu-cache

我正在阅读What every programmer should know about memory,我正在努力解决 CPU缓存标记(第15页)的概念。

如果我理解正确,每个CPU缓存行都有一个标记,它指定给定行对应的主存储器中的哪些数据。也就是说,如果您写入特定行,则使用该标记来查找RAM中应该写入此行内容的位置。相反,如果从RAM读取数据到L1缓存行,则从RAM地址计算标记并将其存储在某处,以便您知道L1缓存行中的数据来自何处。标签就像指针一样。

我想问一下这个标签本身是写在缓存行的某个地方,还是L1缓存旁边有一些特殊的内存来存储标签?

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

1 个答案:

答案 0 :(得分:3)

缓存小于主内存。因此,您需要一种机制将大量主内存条目映射到较少数量的缓存条目。为了有效和廉价地做到这一点,大多数高速缓存都可以使用来自地址的一些数字(比如说10个)最低有效位来索引高速缓存条目。如果您选择地址的至少10位,则缓存中有1024个条目。此外,存在多个具有相同至少10位的存储器地址的可能性很高。因此,您需要使用相同的至少10位区分不同的内存地址。因此标签开始运作以便为此服务。如果要将数据存储在缓存中,则使用至少10位选择条目。并将高速缓存行视为具有两个要填充的字段的条目,第一个是我们存储其余地址位的标记,第二个字段是我们存储数据的位置。

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

与尺寸相同。当引用缓存的大小时,它通常表示整个数据部分的大小,由于额外的簿记(例如标记,有效位等),实际大小稍大一些