【问题标题】:How does a processor fetch cache lines?处理器如何获取缓存行?
【发布时间】:2013-09-15 08:26:28
【问题描述】:

当处理器预取数据的缓存行时,它是从该地址预取最多字节数,还是从该地址预取最多缓存行的一半并向后最多缓存行的一半?

例如假设缓存行是 4 个字节并且从地址 0x06 预取。它会在 0x06 0x07 0x08 0x09 处获取字节还是从地址 0x04 0x05 0x06 0x07 中预取。

我需要此信息用于我正在编写并需要优化的程序。

【问题讨论】:

  • 我绝对认为这是高度依赖于实现的。也许添加细节会有所帮助...
  • 高速缓存行大概是 64 字节,它从最低六位全为零的地址开始。您可以通过屏蔽地址的最低六位来找到地址的高速缓存行。 (或者任何你的缓存线大小的二次幂。)
  • @KerrekSB 请将此评论作为答案。
  • @KerrekSB 您的评论刚刚回答了我的问题。好的,就像在我给出的示例中一样,假设缓存行是 4 个字节,并且我在地址 0x06 处获取我将在缓存中获得的内容将是 0x04、0x05、0x06 和 0x07 处的字节。下一个高速缓存行将位于 0x08。所以假设我想获取 0x0A 的字节,然后我会将 0x08、0x09、0x0A、0x0B 预取到缓存中!
  • See this question 用于查找实际大小。看起来它在旧 Intel 上是 32 字节,而在现代 Intel 上是 64 字节。

标签: caching optimization assembly processor


【解决方案1】:

根据this(这自然是英特尔特有的)

"高速缓存行大小为 32 字节或 256 位。 高速缓存行由处理器 64 位数据总线上的四次读取突发填充。”

这意味着 8 个字节是从主内存中并行获取的,在这 8 个字节中没有第一个或最后一个,它们同时到达,因为这些字节是通过 64 位宽的总线获取的。

由于填充缓存行需要 4 次读取,英特尔似乎没有指定这 4 次读取的顺序 - 这意味着您有一些选择,例如

  • 假设没有特定的顺序
  • 假设从最低到最高获取地址,反之亦然。

第一个假设当然是最安全的——因为我能找到的订单是无证的(所以它可能取决于模型或其他因素)

【讨论】:

    【解决方案2】:

    缓存行必须对齐,因此如果您的第一个读取或第一个事务有未命中导致缓存行获取,它位于缓存行的中间,它将返回并读取整个缓存行(所以你的地址之前的部分和之后的部分)。

    一般来说,缓存使用地址的一部分来确定命中/未命中。因此,如果说高速缓存行是 256 字节,那么用于确定命中/迷雾的地址位将从第 8 位开始,并且取决于高速缓存的大小(深度和方式)将确定要查看多少位。因此,使用我的示例,如果地址 0x123 的访问产生了未命中,则将读取 0x100-0x1FF 的缓存行。

    如果是另一种方式会带来更多的逻辑、工作和混乱,如果您可以在任何字节上开始缓存行,则更难确定命中/未命中,和/或您将/可能有重叠的缓存行(某些数据项位于多个位置),必须对其进行整体管理,从而使缓存变慢。

    【讨论】:

      猜你喜欢
      • 2018-09-22
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 2013-06-14
      • 1970-01-01
      • 2013-09-11
      • 2018-07-14
      相关资源
      最近更新 更多