gpt4 book ai didi

cpu - 乱序指令执行: is commit order preserved?

转载 作者:行者123 更新时间:2023-12-02 02:49:13 26 4
gpt4 key购买 nike

一方面,维基百科写了乱序执行的步骤:

  1. Instruction fetch.
  2. Instruction dispatch to an instruction queue (also called instruction buffer or reservation stations).
  3. The instruction waits in the queue until its input operands are available. The instruction is then allowed to leave the queue before earlier, older instructions.
  4. The instruction is issued to the appropriate functional unit and executed by that unit.
  5. The results are queued.
  6. Only after all older instructions have their results written back to the register file, then this result is written back to the register file. This is called the graduation or retire stage.


类似的信息可以在《计算机组织与设计》一书中找到:

To make programs behave as if they were running on a simple in-order pipeline, the instruction fetch and decode unit is required to issue instructions in order, which allows dependences to be tracked, and the commit unit is required to write results to registers and memory in program fetch order. This conservative mode is called in-order commit... Today, all dynamically scheduled pipelines use in-order commit.



因此,据我了解,即使指令执行是以乱序方式完成的,它们的执行结果也会保存在重新排序缓冲区中,然后以确定的顺序提交到内存/寄存器。

另一方面,众所周知,现代 CPU 可以重新排序内存操作以提高性能(例如,可以重新排序两个相邻的独立加载指令)。维基百科对此进行了报道 here .

您能否解释一下这种差异?

最佳答案

TL:DR:内存排序与乱序执行不同。它甚至发生在有序流水线 CPU 上。
有序提交对于精确的异常是必要的1,这些异常可以回滚到出错的确切指令,而在该指令已经退出之后没有任何指令。乱序执行的基本规则是不要破坏单线程代码。如果您在没有任何其他机制的情况下允许乱序提交(退出),则可能会发生页面错误,而稍后的一些指令已经执行一次,和/或一些较早的指令尚未执行。这将使以正常方式处理页面错误后无法重新启动执行。
(按顺序发出/重命名和依赖跟踪负责在正常情况下正确执行,没有异常(exception)。)
内存排序与其他内核所见有关。另请注意,您引用的只是将结果提交到寄存器文件,而不是内存。
( 脚注 1 : Kilo-instruction Processors: Overcoming the Memory Wall 是一篇关于检查点状态的理论论文,允许在发生异常之前的某个时间点回滚到一致的机器状态,从而允许更大的无序窗口而没有巨大的 ROB AFAIK,没有主流商业设计使用过它,但它表明除了严格按顺序退休之外,理论上还有其他方法来构建可用的 CPU。
据报道,Apple 的 M1 的乱序窗口比它的 x86 同时代产品大得多,但我没有看到任何明确的信息表明它使用了非常大的 ROB 之外的任何东西。)

由于每个内核的私有(private) L1 缓存与系统中的所有其他数据缓存一致,内存排序是指令何时读取或写入缓存的问题 .这与他们从无序核心退休时是分开的。
当负载从缓存中读取数据时,它们变得全局可见。这或多或少在他们“执行”时,而且绝对是在他们退休(又名提交)之前。
存储在其数据被提交到缓存时变得全局可见。这必须等到它们被认为是非推测性的,即没有异常或中断会导致必须“撤消”存储的回滚。因此,存储可以早在从乱序核心退出时就提交到 L1 缓存。
但即使是有序 CPU 也使用存储队列或 store buffer隐藏 L1 缓存中未命中的存储的延迟。一旦知道它肯定会发生,乱序机器就不需要继续跟踪存储,因此存储 insn/uop 甚至可以在提交到 L1 缓存之前退出。存储缓冲区保留它,直到 L1 缓存准备好接受它。即当它拥有缓存行时(the MESI cache coherency protocol 的独占或修改状态),并且内存排序规则允许存储现在全局可见。
另请参阅我对 Write Allocate / Fetch on Write Cache Policy 的回答
据我了解,当商店的数据在乱序核心中“执行”时,它会被添加到商店队列中,这就是商店执行单元所做的事情。 (存储地址写入地址,存储数据将数据写入分配/重命名时为其保留的存储缓冲区条目,因此这些部分中的任何一个都可以首先在这些部分单独调度的 CPU 上执行,例如英特尔。 )
负载必须探测存储队列,以便他们看到最近存储的数据。

对于像 x86 这样具有强排序的 ISA,存储队列必须保留 ISA 的内存排序语义。即商店不能与其他商店重新排序,并且商店不能在更早的加载之前成为全局可见的。 (LoadStore reordering isn't allowed (nor is StoreStore or LoadLoad), only StoreLoad reordering)。
大卫坎特的 article on how TSX (transactional memory) could be implemented in different ways than what Haswell does提供了对内存顺序缓冲区的一些见解,以及它是如何与跟踪指令/微指令重新排序的重新排序缓冲区 (ROB) 分开的结构。他首先描述了当前的工作方式,然后介绍了如何对其进行修改以跟踪可以作为一个组提交或中止的事务。

关于cpu - 乱序指令执行: is commit order preserved?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39670026/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com