【问题标题】:Does x86 provide instructions to load which data goes into cache?x86 是否提供指令来加载哪些数据进入缓存?
【发布时间】:2018-01-06 09:58:54
【问题描述】:

这里提到了预取指令:https://c9x.me/x86/html/file_module_x86_id_252.html,它允许系统程序提示 cpu 哪些数据应该进入缓存。但是,如果是引导加载程序作为操作系统加载的单个简单程序 - 就像 MikeOS 一样简单 - 那么,这些提示是否可以几乎确定哪些数据位于缓存中,因为只有一个进程在控制 CPU - 或者cpu 还在自己做分支预测吗?是不是表示这个目的首选cpu的内部分支预测?

【问题讨论】:

  • 不这么认为,不。此外,允许它的性能损失可能远远超过任何收益。您将如何确保您的缓存策略对所有 CPU 架构、所有缓存大小等都是最佳的?
  • x86 有 prefetch instruction,但通常 CPU 足够聪明,可以识别访问模式本身,因此您必须仔细测量性能以查看它是否真的有帮助,或者只是将无用的操作码添加到二进制。
  • @fredrik 感谢您的 cmets,但您能否详细说明一下可能会导致的一些性能损失?
  • 因为这是一个非常开放的问题(不是 stackoverflow 问题),所以答案是绝对的。如果您可以控制处理器并了解架构,那么您可以控制缓存中的大部分内容(如果不是全部的话)。即使没有完全控制,您也可以鼓励缓存中的内容,但您正在与其他代码竞争,并且如果您不知道/理解其他代码或它在做什么,它决定了您可能拥有的控制权。
  • 如果这是另一个我崩溃/幽灵的问题,这不是你解决它们的方式。

标签: assembly x86 cpu cpu-architecture cpu-cache


【解决方案1】:

分支目标缓冲区(以及其他分支预测缓存,如分支历史缓冲区)与 L1D / L1I / L2 / L3 内存缓存完全分开。

x86 没有管理分支预测缓存的指令,只有数据/指令缓存(这是大多数人说“缓存”时的意思)。 AFAIK,没有其他架构也没有用于分支预测缓存的缓存控制指令,但您似乎只是在讨论 x86。

我也不确定您是否真的在尝试询问分支预测缓存,或者您是否完全对 CPU 的工作方式感到困惑。请参阅 Ulrich Drepper 的 What Every Programmer Should Know About Memory,以及 2017 年关于一些小问题的更新。 What Every Programmer Should Know About Memory?

除了 cmets 中关于控制数据/指令缓存内容的链接(正如我所说,这是大多数人在谈论将数据加载到缓存中)。

【讨论】:

    猜你喜欢
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 2012-06-14
    • 2012-08-07
    • 1970-01-01
    相关资源
    最近更新 更多