L1和L2缓存的行大小

时间:2013-02-05 12:39:39

标签: caching memory-management computer-architecture

从这个论坛上的前一个question,我了解到在大多数内存系统中,L1缓存是L2缓存的子集意味着从L2中删除的任何条目也都从L1中删除。

所以现在我的问题是如何在L1缓存中为L2缓​​存中的条目确定相应的条目。存储在L2条目中的唯一信息是标签信息。根据此标记信息,如果我重新创建addr,如果L1和L2缓存的行大小不相同,它可能会跨越L1缓存中的多行。

架构是否真的打扰了两条线路,或者它只维护具有相同线路大小的L1和L2缓存。

我知道这是一项政策决定,但我想知道常用的技术。

4 个答案:

答案 0 :(得分:67)

缓存行大小(通常)为64字节。

此外,请看一下有关处理器缓存的这篇非常有趣的文章: Gallery of Processor Cache Effects

您将找到以下章节:

  1. 内存访问和性能
  2. 缓存行的影响
  3. L1和L2缓存大小
  4. 指令级并行
  5. 缓存关联性
  6. 虚假缓存行共享
  7. 硬件复杂性

答案 1 :(得分:64)

在核心i7中,L1,L2和L3中的线路大小相同:即64字节。 我想这简化了维护包容性和连贯性。

参见第28页:https://www.scss.tcd.ie/Jeremy.Jones/CS3021/5%20caches.pdf

答案 2 :(得分:20)

在严格包含的缓存层次结构中处理缓存块大小的最常用技术是对强制包含属性的所有级别的缓存使用相同大小的缓存块。与更高级别的高速缓存使用更大的块相比,这导致更大的标签开销,这不仅使用芯片面积而且还可以增加等待时间,因为更高级别的高速缓存通常使用分阶段访问(其中在访问数据部分之前检查标签)。但是,它还在一定程度上简化了设计,并减少了未使用数据部分的浪费容量。在128字节高速缓存块中不占用大部分未使用的64字节块来补偿额外32位标记的区域代价。此外,通过相对简单的预取可以提供利用更广泛的空间局部性的更大的高速缓存块效果,其优点是如果没有加载附近的块,则没有未使用的容量(以节省存储器带宽或减少冲突存储器上的等待时间)读取)并且邻接预取不必限于更大的对齐块。

一种不太常见的技术将缓存块划分为扇区。具有与较低级别高速缓存的块大小相同的扇区大小避免了过度反向无效的问题,因为较高级别高速缓存中的每个扇区具有其自己的有效位。 (为每个扇区提供所有一致性状态元数据而不仅仅是有效性可以避免在块中的至少一个扇区不被脏/修改和一些一致性开销时使用过多的回写带宽[例如,如果一个扇区处于共享状态而另一个扇区处于共享状态在独占状态下,对独占状态扇区的写入可能不涉及连贯性流量 - 如果使用snoopy而不是目录一致性。)

当标签位于处理器芯片上但数据是片外时,扇区缓存块的面积节省尤为显着。显然,如果数据存储占用的面积与处理器芯片的大小相当(这不是不合理的),那么具有64字节块的32位标签将占用处理器区域的大约16(~6%),而128-字节块占用的一半。 (IBM的POWER6 +,于2009年推出,可能是使用处理器芯片标签和处理器外数据的最新处理器。将数据存储在较高密度的嵌入式DRAM和低密度SRAM中的标签中,如IBM做了,夸大了这种效果。)

应该注意的是,英特尔使用"缓存行"引用较小的单元和"缓存扇区"对于较大的单位。 (这就是为什么我在我的解释中使用"缓存块"的原因之一。)使用英特尔的术语,缓存行在缓存级别之间的大小变化是非常不寻常的,无论级别如何严格包容,严格排他性或使用其他一些包容政策。

(严格排除通常使用较高级别的缓存作为受害者缓存,其中较低级别缓存的驱逐被插入较高级别缓存。显然,如果块大小不同并且未使用扇区,则需要逐出驱逐如果存在于较低级别的缓存中,那么中某些较大块的其余部分将被读取。[理论上,严格排除可以使用不灵活的缓存绕过其中L1驱逐将绕过L2并转到L3并且L1 / L2缓存未命中将仅分配给 L1 L2,绕过L1进行某些访问。最接近于此实现我所知道的是Itanium绕过L1进行浮点访问;但是,如果我没记错的话,L2包含了L1。])

答案 3 :(得分:2)

通常,在对主存储器的一次访问中,访问64字节数据和8字节奇偶校验/ ECC(我不记得确切地记住哪些)。在各种内存级别维护不同的缓存行大小相当复杂。您必须注意,缓存行大小与该体系结构上的单词对齐大小的关联性要高于其他任何内容。基于此,高速缓存行大小不太可能与存储器访问大小不同。现在,奇偶校验位用于使用内存控制器 - 因此高速缓存行大小通常为64字节。处理器实际上对寄存器的控制非常小。计算机中发生的所有其他事情更多的是让硬件进入以优化CPU性能。从这个意义上说,通过在不同的内存级别上使缓存行大小不同来导入额外的复杂性真的没有任何意义。