【问题标题】:Line size of L1 and L2 cachesL1 和 L2 缓存的行大小
【发布时间】:2013-01-20 09:30:03
【问题描述】:

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

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

架构是否真的会为刷新两条线而烦恼,或者它只是维护具有相同线大小的 L1 和 L2 缓存。

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

【问题讨论】:

  • L1 和 L2 是否有不同线宽的处理器?
  • 原来的 Pentium 4 显然有 64 字节的 L1 缓存线和 128 字节的 L2 缓存线。
  • 有人可以评论 nehalem 架构吗?我浏览了一篇关于“英特尔 Nehalem 计算机架构的缓存组织和内存管理”的论文。这里他们只提到一次缓存行大小(64 字节)??
  • @PaulR:Pentium 4 有独立的 L1 和 L2 缓存。我会想象需要 L1 缓存是 L2 缓存子集的设计将保持行大小相同。
  • 如果您在 x86 上运行,CPUID 指令会返回明确的高速缓存行大小信息。谷歌的 CPUID 和缓存行大小有一些很好的例子。

标签: caching memory-management cpu-architecture cpu-cache


【解决方案1】:

Cache-Lines 大小(通常)为 64 字节。

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

您将找到以下章节:

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

【讨论】:

  • +1 链接。我通常不关注 SO 答案中的链接,而是更喜欢在线冷凝。幸运的是,这次我确实遵循了它,绝对值得!
【解决方案2】:

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

参见第 10 页:https://www.aristeia.com/TalkNotes/ACCU2011_CPUCaches.pdf

【讨论】:

【解决方案3】:

通常,在一次访问主存储器时,会访问 64 个字节的数据和 8 个字节的奇偶校验/ECC(我不记得具体是哪个)。在不同的内存级别维护不同的高速缓存行大小是相当复杂的。您必须注意,缓存行大小与该架构上的字对齐大小的相关性比其他任何因素都高。基于此,高速缓存行大小与内存访问大小几乎不可能不同。现在,奇偶校验位供内存控制器使用——因此高速缓存行大小通常为 64 字节。除了寄存器之外,处理器实际上控制的很少。计算机中发生的所有其他事情更多是关于安装硬件以优化 CPU 性能。同样从这个意义上说,通过在不同的内存级别设置不同的缓存行大小来引入额外的复杂性确实没有任何意义。

【讨论】:

    【解决方案4】:

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

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

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

    需要注意的是,英特尔使用“缓存行”来指代较小的单元,而“缓存扇区”则指代较大的单元。 (这是我在解释中使用“高速缓存块”的原因之一。)使用英特尔的术语,高速缓存行的大小在高速缓存级别之间变化是非常不寻常的,无论级别是严格包含、严格排他还是使用其他一些包容性政策。

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

    【讨论】:

      猜你喜欢
      • 2021-11-27
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 2011-04-11
      • 2015-06-29
      • 2014-07-04
      • 1970-01-01
      • 2017-09-24
      相关资源
      最近更新 更多