索引和标签切换位置

时间:2020-10-22 13:26:52

标签: caching mips

让我们考虑另一种{Index,Tag,Offset}。每个字段的用法和大小保持不变,例如index用于在高速缓存中定位块,其位长仍由高速缓存块的数量确定。唯一的区别是,我们现在使用MSB位作为索引,使用中间部分作为标记,使用最后一部分作为偏移。

您认为该方案的缺点是什么?

1 个答案:

答案 0 :(得分:0)

这将起作用-如果高速缓存是完全关联的,那将无关紧要(因为没有索引,它的所有标记),但是如果关联性受到限制,它将(大大)降低对高速缓存的使用效率。为什么?

考虑一个对象,该对象足够大以超过缓存块边界。

访问对象时,某些字段与其他字段的地址将不在同一缓存块中。缓存的行为如何?

index位于中间时,缓存块/行索引将发生变化,即使关联性有限,缓存也可以存储附近的其他实体。

index位于开头(最高有效字节)时,标记将在这两个地址之间发生变化,但是索引将相同-因此,索引将发生冲突,将用尽集关联性的一种方式。如果缓存是直接映射的(即1路集关联),则在重复访问同一对象时可能会严重崩溃。

假设我们有12位地址空间,而索引,标签和偏移量均为4位。

让我们考虑一个包含四个32位整数字段的对象,该对象位于0x248位置,以便两个整数字段a,b分别位于0x248和0x24c处,而另外两个整数字段c,d处于以下位置: 0x250和0x254。

请考虑当我们再次访问a或b,然后再访问c或d,再访问a或b时会发生什么情况。

如果标签是高阶十六进制数字,则缓存索引(在中间)将从4变为5,这意味着即使在直接映射的缓存中,a&b字段和c&d字段可以同时在缓存中。

对于相同的访问模式,如果标签是中间的十六进制数字,而索引是高十六进制数字,则高速缓存索引不会更改-它停留在2。因此,在1路集关联缓存中,访问字段a或b后跟c或d将驱逐a&b字段,如果稍后访问a或b时,将导致未命中。

因此,它实际上取决于访问模式,但使高速缓存真正有效的一件事是,程序访问的是之前访问的内容还是与之前访问的块相同的内容。这种情况发生在我们处理单个对象,分配最终相邻的对象以及重复访问数组(例如,数组的第二次循环)时。

如果index位于中间,则由于使用内存的某个块或块或区域内的不同地址,我们会得到更多变化—在我们的12位地址空间示例中,索引每16个字节更改一次,相邻的16个字节的块可以存储在缓存中。

但是,如果index刚开始时,我们需要消耗更多的内存,然后再进入不同的index-索引每256个字节仅更改一次,因此两个相邻的16字节块通常会发生碰撞。

我们的程序和编译器通常是在缓存有利于局部性的前提下编写的-这意味着索引应位于中间,而标记应位于较高位置。

标记/索引位置选项都为同一块中的地址提供了良好的局部性,但是一个比另一个块更喜欢不同块中的相邻地址。