乱序执行

在计算机工程领域，乱序执行（错序执行，英语：out-of-order execution，简称OoOE或OOE）是一种应用在高性能微处理器中来利用指令周期以避免特定类型的延迟消耗的范式。在这种范式中，处理器在一个由输入数据可用性所决定的顺序中执行指令，而不是由程序的原始数据所决定。在这种方式下，可以避免因为获取下一条程序指令所引起的处理器等待，取而代之的处理下一条可以立即执行的指令。

历史

乱序执行是一种受限的数据流架构计算的方式，在20世纪70年代至80年代数据流架构计算是计算机架构的重要研究领域。在这个课题上重要的学术研究是由Yale Patt以及他的HPSm模拟器所领导。一篇由James E. Smith和A.R. Pleszkun在1985年所发表的论文通过精确的描述了在乱序执行的机器上会发生的异常行为，从而完善了该模式。
通常认为第一台使用乱序执行的计算机是CDC 6600（1964），使用了scoreboard来处理冲突。在现代的实现方式中，这种的记分板被认为是顺序执行的组成部分，而不是乱序执行，尽管这样的机器等待第一个写后读的冲突。严格的说，这样的机器启动在顺序执行的方式下，但是有可能结束于乱序执行之中。
大约三年后，IBM的360/91（1966）引入了Tomasulo算法，从而支持了完全的乱序执行。
在1990年，IBM发布了第一个支持乱序执行的微处理器，POWER1，尽管乱序执行被限制于浮点数计算上。
在整个20世纪90年代中，乱序执行变得更加普遍并且在IBM/Motorola PowerPC 601（1993）, Fujitsu/HAL SPARC64（1995）, Intel Pentium Pro（1995）, MIPS R10000（1996）, HP PA-8000（1996）, AMD K5（1996）和DEC Alpha 21264（1998）中被使用。较为知名的未采用乱序执行的处理器有Sun UltraSPARC, HP/Intel Itanium, Transmeta Crusoe, Intel Atom，以及IBM POWER6。
乱序执行模式的逻辑复杂度是造成该技术在20世纪90年代之前没有成为计算机的主流的原因。许多低端的处理器受限于市场成本仍然未采用该范式，因为制造乱序执行的计算机需要大型的硅片。低能耗是另一种难以用乱序执行设计所实现的目标。

发送以及分配的分离实现了乱序执行

一个由新的范式所造成的区别是发送步骤从分配步骤中分离的序列的产生和毕业周期从执行周期中分离的产生。这种范式的一个早期的名称是"分离架构"。在早期的顺序执行处理器中，这些周期在一种相对固定的，管道化的方式中被执行。
为了避免错误的运算对象造成的指令乱序的减少，一种被称作寄存器重命名的技术被采用了。在这种模式中，将会有更多的寄存器被架构所定义。物理寄存器被加上标签从而不同架构的寄存器可以同时存在。

执行和写回的分离允许程序重新开始

结果序列是解决分支预测错误以及异常/中断的必要部分。结果序列允许程序程序在一个异常后重新开始，这需要指令在程序顺序中被完成。结果序列允许结果由于一个错误的分支预测以及发在在旧代码上的异常被丢弃。
把指令分配到过去的分支的能力解决了预测执行。