【问题标题】:What is L1/L2 cache behavior for LUTs and the alike?LUT 等的 L1/L2 缓存行为是什么?
【发布时间】:2010-12-02 22:11:37
【问题描述】:

假设一个 512KB 的 64 位双精度类型的 LUT。一般来说,CPU是如何缓存L1或L2中的结构的呢?

例如:我访问中间元素,它是尝试缓存整个 LUT 还是只缓存其中的一部分 - 比如中间元素,然后是 n 个后续元素?

CPU 使用什么样的算法来确定它在二级缓存中保存的内容?它是否遵循某种前瞻性策略

注意:我假设是 x86,但我想知道其他架构如何工作 POWER、SPARC 等。

【问题讨论】:

  • 通常它会在那个位置加载一个cache line字节。在大多数 x86 处理器上,它是 64 字节。

标签: c++ caching lookup-tables cpu-cache


【解决方案1】:

这取决于您用于 LUT 的数据结构(查找表?)

缓存在内存中连续布局(例如,作为数组或 std::vectors)而不是分散在各处的东西处于最佳状态。

简单来说,当您访问内存位置时,一块 RAM(在 x86 上为 64 字节的“缓存行”)被加载到缓存中,可能会清除一些以前缓存的数据。

一般来说,缓存有好几级,形成一个层次结构。每个级别都会增加访问时间,但容量也会增加。

是的,有前瞻功能,它受到相当简单的算法和无法跨越页面边界的限制(在 x86 上,内存页面的大小通常为 4KB。)

我建议你阅读What Every Programmer Should Know About Memory。它有很多关于这个主题的重要信息。

【讨论】:

    【解决方案2】:

    缓存通常形成为缓存行的集合。每个缓存线的粒度与缓存线的大小对齐,因此,例如,具有 128 字节缓存线的缓存将其缓存数据的地址与 128 字节对齐。

    CPU 缓存通常使用一些 LRU 逐出机制(最近最少使用,如在缓存未命中时逐出最旧的缓存行),以及从内存地址到特定缓存行集的一些映射。 (如果您尝试读取对齐在 4k 或 16M 边界上的多个地址,这会导致 x86 中的许多错误共享错误之一。)

    因此,当您发生高速缓存未命中时,CPU 将读取包含未命中地址范围的内存高速缓存行。如果您碰巧跨缓存行边界进行读取,则意味着您将读取两个缓存行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-11
      • 2013-01-20
      • 2020-08-04
      • 2019-09-23
      • 2015-06-29
      • 2017-09-24
      • 2010-11-09
      • 2020-05-19
      相关资源
      最近更新 更多