ARM架构中顺序执行和顺序执行之间的区别

roh*_*hit 0 architecture arm sequential

根据我对ARM处理器的理解,以下是按顺序执行的功能(1)按顺序执行指令(2)在当前指令完成之前,它将不执行下一条指令。(3)执行速度较慢。

乱序执行与乱序相反。(1)以非顺序顺序执行指令(2)即使当前指令未完成,它也会执行下一条指令。(仅当下一条指令不取决于当前指令的结果时才执行此操作)(3)更快的执行速度。

除上述功能外,还有其他功能差异吗?

Sea*_*ane 6

架构与此无关,在 ARM 中,更显着的差异之一是内存排序可以相当宽松(可能在用户的控制下)。即使是有序的 3 级管道 Cortex-M 也有需要使用ISB和的场景DSB

按顺序执行指令

这是始终呈现给程序员的视图,因此它并没有真正描述太多。

在当前指令执行完毕之前,不会执行下一条指令。

不正确。所有现代处理器都是流水线式的,并且获取/解码/分支预测都可以在有序机器中发生,而早期指令仍在运行中。可能有一些地方会缓存状态,以备需要恢复时使用。

执行速度较慢。

不保证。宽有序机器可以比无序机器具有更高的 IPC。但构建它不一定有意义。

以非连续顺序执行指令

这称为“无序调度”或“推测执行”(这是不同的事情,在更高级别上工作)。在实际的 ARM 内核中,“乱序完成”更为常见。这是计算加载和存储,然后发送到一组缓冲区的地方。即使是具有单个存储器接口的单个​​发行机也可以具有多个存储缓冲区,以允许存储排队,同时 ALU 操作在处理器中继续进行。如果有多个内存接口(或像 AXI 这样的总线),则可能会在完成任意数量的其他事务的同时进行缓慢的加载。乱序完成比任何形式的乱序分派更容易实现,并且在 ARM 架构中通过“精确中止”(发生在程序顺序中的逻辑位置)和“不精确中止”(晚发生)来实现当内存系统最终无法解决事务时)。

排序的另一个示例是有 2 个整数管道和 1 个浮点管道的场景。不仅管道的长度可能不同,而且没有什么可说的,它们必须以设定的顺序映射到传入的指令 - 只要处理了依赖关系。

即使当前指令未完成,也会执行下一条指令。(仅当下一条指令不依赖于当前指令的结果时才执行此操作)

对于所有流水线处理器来说通常都是如此。当任何阶段依赖于某些早期指令的进展时,它都可能停滞。

更快的执行速度。

也许吧,取决于限制。值得注意的是,编译器将受益于理解最佳排序,并且如果二进制文件需要针对单个目标设备或广泛的设备进行优化,它会产生影响。


小智 5

就是这样。乱序执行会“贪婪地”执行它可以尽快执行的每条指令,而无需等待先前的指令完成,除非它们依赖于尚未完成的指令的结果。

如果一条指令等待读取内存,这显然最有用。有序实现只会暂停直到数据可用为止,而无序实现则可以(如果前面有不能独立执行的指令)在处理器等待从中传递数据时完成其他操作。记忆。

请注意,无论是编译器还是(如果编译器不够聪明)程序员都可以通过将内存中可能昂贵的读取移动到远离实际使用数据的位置来利用此优势。这对于有序实现没有什么影响,但是可以帮助在无序实现中隐藏内存延迟,从而使代码运行更快。

不利的一面当然是,由于涉及所有簿记工作,乱序的实现往往更复杂且更耗电。

  • 按顺序执行只是指指令按程序顺序“开始”。现代有序 ARM CPU 会跟踪传入的负载,并且在尝试读取尚未准备就绪的负载结果寄存器之前不会真正停止。这允许内存级并行性,这对于现代 CPU 的性能至关重要,因为 DRAM 具有数百个周期的延迟。(就像 Hit-under-miss 隐藏一次缓存未命中,miss-under-miss 隐藏多个缓存未命中一样。)乱序执行可以隐藏(某些)内存延迟,即使结果在加载后立即使用,所以它在实际代码中仍然非常强大。 (2认同)