9

我有点卡住了,因为我找不到任何涵盖缓存“数据”部分的东西,我用谷歌搜索的所有内容都涉及 99.9% 的缓存寻址。我被问到的问题是这样写的

对比“数据位”容量和“开销位”大小的区别
对于两个缓存。

我不想要答案,所以我不会发布实际的集合大小,我只是在寻找一个可能是网站的方向或如何“对比”两者的解释。非常感谢任何可能的帮助!

4

3 回答 3

2

我不确定你是否为这个问题提供了足够的背景信息,但这里有。

缓存不仅必须存储实际缓存的数据,而且——对于每条数据——它所引用的“索引”。因此,当您查找记录 N 时,缓存不仅要保存记录 N 的值,还要保存 N - 这样您才能真正查找数据。这是一种非常简单的看待它的方式。缓存可能有其他元数据来指示有效性和最后访问时间等。

示例 #1:32 位地址空间中的字节缓存

每个缓存条目必须存储数据值(8 位)加上地址(32 位)= 40 位,

示例 #2:32 位地址空间中的 32 位字高速缓存

每个缓存条目必须存储数据值(32 位)加上地址(32 位)= 64 位,

您可以看到示例 #1 的开销明显更高。

与往常一样,维基百科可能会有所帮助。http://en.wikipedia.org/wiki/Cache_ (计算)

于 2012-07-05T19:41:42.393 回答
2

缓存存储数据,通常像数据阵列一样在 SRAM 中,但也有开销。我并不特别喜欢术语“数据位大小”和“开销位大小”,因为 (a) 存在不是存储位单元的开销,并且 (b) 并非所有位单元都同样昂贵。但是,让我们暂时接受这些条款。

我的看法是,“开销位大小”可能是指为了访问缓存而需要存储的标记位的数量。通常这些存储在不同的数组中,一个与数据数组分开的标签数组。比较数据位数。

下面是三个简单的例子:

考虑一个 32 KiB(千字节)缓存,以及 64 B(字节)缓存行。通常,我们会让地址的 0-5 位作为缓存行偏移量。

32 KiB / (64 B/line) => 2^(5+10) / 2^6 => 2^9 => 512 缓存行。

---++ 示例 1:直接映射

让我们想象它是一个直接映射的缓存。然后我们可以将接下来的 9 位,即地址的 6-14 位作为缓存线数组的“索引”。

到目前为止,一切都很好。现在,要找出标签,我们需要知道完整的地址宽度。假设它是 64 位(尽管截至 2012 年大多数“64 位”机器仅实现 40 或 48 位)。为了区分缓存行与映射到缓存中同一条目的任何其他缓存行,我们需要将地址的剩余位(位 15-63、49 位)存储为标记。

对这种直接映射缓存的访问然后通过提取索引、读取带有该索引的标签和数据、将读出的标签与我们正在查找的地址的标签进行比较、如果它们匹配则声明命中和未命中来进行如果没有,依此类推。

开销:每 64B(512 位)数据有 49 位标签。

总计:* 标签或“开销”:512 * 49 位 * 数据位:512*512 = 32KiB = 256 Kib(kibi 位)。

---++ 示例 2:8 路集合关联

现在让我们假设缓存是 8 路关联的。这意味着 512 行将分为 512/8 = 64 组,每组包含 8 行。

高速缓存行内的偏移量仍然是位 0-5。

但是,我们现在只需要 6 位作为索引,来确定集合数。位 6-11。

标签需要是所有剩余的位,位 12-63,总共 52 位。

因此,8 路关联高速缓存的标记开销是 52 位标记对应 512 位数据。

总计:* 标签:512 * 52 位 * 数据:512 Kib

比较直接映射的 49 位标记。8-way set associative 基本上将 log2(8) 更多位移动到标签中;通常,N-way set associative 将 ceil(log2(N)) 位移动到标签中。

---++ 示例 3:完全关联

这是直接映射频谱的远端。每个高速缓存行仍然有 512 位数据,但现在整个 64 位地址,除了 6 位偏移量,都是标记。58 位标记用于完全关联,而 52 位用于 8 路,而 49 位用于直接映射。

但还记得我说过我不喜欢“开销位”这个词吗?完全关联缓存中的标记位通常不仅是普通的存储位,而且还必须有比较器——基本上是 XOR 门。这种“CAM(内容可寻址存储器)”位通常比普通位更昂贵。

----+ 结论

所以,我认为这就是你的老师想要的:数据位与标签位的直接比较。这是开销的下限。

从直接映射到 N 路集合关联到完全关联的频谱提供了一个示例。但是缓存设计的其他方面也会影响开销。例如:

  • 如果您使用不同的地址大小,则百分比开销会发生变化。例如,在 diredt 映射示例中,32 位地址只有 17 位标记,而 64 位地址则为 49 位。

  • 如果您更改缓存索引功能,您可能必须更改标签大小。例如,在高速缓存中具有素数的高速缓存行或集合有一些好处,例如,对于直接映射高速缓存,511 行而不是 512 行。像这样的素数减少了共振问题。但简单来说,它们需要将标签宽度增加到全宽 58 位。

  • 像扇区缓存这样的方案允许共享标记位的某些部分。

等等。

至于教程网站:

  • 对不起,我不知道这样的初学者的东西。但我会用谷歌搜索许多大学的课堂笔记。

  • 我的网站http://comp-arch.net涵盖了计算机体系结构的高级主题。但是这种东西太基础了,太初级了,我不能放在 comp.arch 上。尽管我想我应该先写一些对基础知识的简单解释,然后再讨论高级主题。偶尔会写这样的教程,比如这里,但是我没有收集到。

  • USEnet 新闻组 comp.arch 可能有用。

---+ 为什么这对stackoverflow 上的程序员很重要?

这主要是一个硬件话题。

但是程序员调整代码需要理解这样的东西,以获得最佳性能。

于 2012-09-20T04:02:23.940 回答
1

由于您已经标记了计算机体系结构和 C,因此我假设这是一项任务,要求您在 C 或类似的东西中制作缓存“模拟器”。并且问题中的“两个缓存”指的是两种不同类型的缓存(全关联,n路,直接映射..)。在该范围内,问题是要求您讨论两种类型的缓存之间的区别,主要是“开销位”大小之间的比率,这里是缓存条目(有效位、偏移量、标记)和“数据位”,它是存储在高速缓存行中的实际数据。我希望这有帮助。

于 2012-07-05T19:42:26.120 回答