【问题标题】:How does CPU reorder instructionsCPU如何重新排序指令
【发布时间】:2016-12-27 23:25:18
【问题描述】:

我最近阅读了有关 CPU 指令重新排序以提高效率的文章。但我无法理解 CPU 如何重新排序其指令。我的意思是编译时重新排序是可以考虑的,因为编译器可以预见即将到来的代码。但是对于一个接一个读取指令的 CPU,它如何看待即将到来的指令来重新排序它们

【问题讨论】:

  • 与阅读句子时看到即将出现的单词的方式相同:向前看一点。
  • 它的读取速度比执行速度要快,因此它可以看到即将执行的指令窗口。有关详细信息,请参阅 x86 tag wiki 中的一些链接,例如 Agner Fog 的 microarch pdf,以及 David Kanter's writeup of Intel's Haswell design。当然,如果您只是简单地在 Google 上搜索“乱序执行”,您会找到 the wikipedia article,您应该阅读它。
  • 我的意思是,我对汇编代码了解不多,但据我记得,每条指令基本上都在内存中,所以如果如上所述,CPU 的读取速度比它更快执行,它可以只是跟随指令的内存位置,并期待。这不是事实,这只是我的假设,我自己也没有想过。
  • 我写了an answer on another question,详细介绍了像 Haswell 这样的现代 x86 CPU 内核如何发现和利用乱序执行的指令级并行性。

标签: multithreading assembly cpu


【解决方案1】:

指令按程序顺序被提取到指令队列中;他们从队列中被解码并移动到预订站。这些保留站有效地进行重新排序:指令在参数可用时被分派到执行单元执行,并且所有参数可用的时间通常与指令队列/内存中的顺序不对应。

例如,使用Tomasulo Algorithm,请看以下两个视频:

问题(和注册重命名): https://youtu.be/I2qMY0XvYHA?list=PLAwxTw4SYaPkNw98-MFodLzKgi6bYGjZs

派送/重新排序: https://youtu.be/bEB7sZTP8zc?list=PLAwxTw4SYaPkNw98-MFodLzKgi6bYGjZs

【讨论】:

    【解决方案2】:

    指令按顺序解码,然后进入“进行中”指令的集合。如果满足它们的依赖关系,指令可以向前推进。

    例如,假设说明是:

    1. 从内存中加载寄存器 A。
    2. 从内存中加载寄存器 B。
    3. 递增寄存器 A。
    4. 递增寄存器 B.

    可能是最后两条指令同时在执行,如果寄存器 B 的内存读取首先完成(可能它已经在 L1 缓存中),那么寄存器 B 的增量将发生在寄存器 A 的增量。(当然,在解码该指令之后。)

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 1970-01-01
      • 2023-03-05
      • 2016-03-29
      • 2019-05-19
      • 1970-01-01
      • 2011-05-01
      • 2019-01-15
      • 1970-01-01
      相关资源
      最近更新 更多