根据我对ARM处理器的理解,以下是按顺序执行的功能 (1)按顺序执行指令 (2)在当前指令完成之前,它不会执行下一条指令。 (3)执行速度较慢。
乱序执行与In-order的行为正好相反。 (1)以非连续顺序执行指令 (2)即使当前指令未完成,它也将执行下一条指令。 (仅当下一条指令不依赖于当前指令的结果时才会这样做) (3)执行速度更快。
除了上面提到的吗?
还有其他任何功能差异吗?答案 0 :(得分:5)
几乎就是这样。无序执行"贪婪"尽可能快地执行它可以执行的每条指令,而不必等待先前的指令完成,除非它们依赖于尚未完成的指令的结果。
如果指令等待读取内存,这显然非常有用。有序实现只会在数据可用之前停止,而无序实现可以(前提是可以独立执行前面的指令)在处理器等待数据时完成其他操作从记忆中传递出来
请注意,两个编译器和(如果编译器不够聪明)程序员可以通过从内存中移动可能昂贵的读取尽可能远离实际使用数据的点来利用这一点。这对于有序实现没有任何影响,但可以帮助隐藏无序实现中的内存延迟,从而使代码运行得更快。
缺点当然是由于所涉及的所有簿记,无序实施往往更复杂,更耗电。
答案 1 :(得分:0)
还可以提到,乱序执行的proccessors在传入的字节单元指令上有一个“窗口”。它自然是由于指令无序化造成的。如果以下字母是进程通过的字节... CBDAEF,最佳方式是做AB CD EF - 并且处理器只有3个字节的窗口,它会做CB DE AF代替。它无法看到总的指令传入。这个窗口是构成优秀过程的众多品质之一。
(在我的例子中,彼此附近的信件可以同时完成 - 因为它们是无关的 - 而其他人则不能)。
答案 2 :(得分:0)
该体系结构与它无关,在ARM中,最重要的区别之一是可以非常轻松地进行内存排序(可能在用户的控制下)。甚至有序的3级管道Cortex-M都具有必须使用ISB
和DSB
的情况。
按顺序执行指令
这是始终显示给程序员的视图,因此它并没有描述太多。
直到当前指令完成,它才会下一步执行 指令。
不正确。所有现代处理器都已流水线化,并且取回/解码/分支预测都可以在有序机器中进行,而较早的指令仍在执行中。在某些情况下,可能需要缓存状态以备不时之需。
执行速度较慢。
不保证。较有序机器比无序机器具有更高的IPC。尽管构建它不一定有意义。
以非顺序顺序执行指令
这称为“乱序发送”或“投机执行”(这是另一回事,在更高级别上工作)。 在实际的ARM内核中,“乱序完成”更为常见。在这里计算装载和存储,然后将其发布到一组缓冲区。即使是具有单个内存接口的单发行机,也可以具有多个存储缓冲区,以允许存储在处理器中继续执行ALU操作的同时排队。使用多个内存接口(或诸如AXI之类的总线),可以进行缓慢的加载,同时完成许多其他事务。乱序完成比任何形式的乱序调度要容易得多,并且在ARM体系结构中通过“精确中止”(在程序顺序中的逻辑位置发生)和“不精确中止”(在后期发生)来促进当内存系统最终无法解决事务时。
排序的另一个示例是一个场景,其中有2个整数管道和一个浮点管道。不仅管道的长度可能不同,而且无话可说,它们必须按设置的顺序映射到传入的指令上,前提是要处理依赖项。
即使当前指令没有完成,它也会在下一条执行 指令。 (只有在下一条指令没有 取决于当前指令的结果)
这通常适用于所有流水线处理器。取决于早期的指令制作进度,任何阶段都可能停止。
执行速度更快。
也许,取决于约束条件。重要的是,编译器将从了解最佳顺序中受益,并且如果二进制文件对于单个目标设备或广泛范围的设备而言是最佳的,则可以有所作为。