在乱序处理器中分别执行相同指令的操作

3

假设我们有一条指令被分成了3个微操作,而且我们有一个乱序处理器。我的问题是:这3个微操作必须按顺序执行,还是处理器可以将这些微操作与其他指令的微操作交替执行?

我的意思是,在乱序处理器中,您可以无序地执行指令,但如果我们将一条指令分成若干微操作,这些微操作能否非顺序执行?

例如,我们有3个指令:A、B和C。 A和C被划分为1个uop:A1和C1,而B被划分为3个uop:B1、B2、B3。OoO处理器是否可以执行B1-A1-B2-C1-B3,或者必须按顺序执行B1-B2-B3?


3
可以独立重新排序微操作。 - prl
1个回答

3
每个uop都有独立的计划安排,只需要等待其输入准备好即可(并且在乱序后端发出时需要等待执行端口上的空闲周期)。指令边界对RS调度器不相关。对于许多多uop指令,uop与之前的指令存在数据依赖关系。但有时先前的uop只需要一个输入准备好,因此每个输入到输出都有单独的最小延迟时间。
例如,add eax,[rdi] 只需要在load uop完成后准备好EAX。因此,通过EAX的关键路径延迟仅为1个周期。但是,如果RDI没有准备好或者RDI指向的内存没有准备好,那么add ALU uop无法执行。但是,这正是将解码转换为uops的重点,与P5 Pentium不同,后者必须在其按顺序流水线中同时执行负载和添加操作1
(或者以 Intel CPU上变量计数移位为例,额外的uops仅用于FLAGS 输出; GP-integer部分具有1个周期的延迟,但是FLAGS结果稍后才准备好。产生GP-integer结果的uop基本上与BMI2 shlx 解码为的唯一uop相同。)

但是有些指令确实具有ILP(实际上是顶级并行性)。例如,在英特尔CPU上,xchg eax,ecx解码为3个寄存器复制uop,我们可以分别测量EAX->ECX和ECX->EAX方向的延迟时间,分别为1和2个周期。 为什么在现代英特尔架构中XCHG reg, reg是一个3微操作指令?

另一个例子是phaddd; 它的解码方式与两个shufps uops(2个输入洗牌)和一个paddd uop几乎相同,这取决于这两个洗牌操作。 两个洗牌操作都读取两个输入以提供洗牌操作。 Ice Lake在2个端口上具有洗牌单元,并且实际上可以并行运行洗牌uops,使其延迟为2个周期(uops.info),比早期Intel的3个周期要少,因为单个洗牌端口存在资源冲突。(Ice Lake的额外洗牌端口仅运行某些整数洗牌操作,因此haddps在Ice Lake上仍然像以往一样糟糕)
请注意,我们无法“证明”每个uop正在做什么,但是考虑到测量的延迟和每个端口的总uop计数,对于许多指令,只有一个合理的设计可以解释其行为。例如,对于phaddd,我们知道CPU具有SIMD整数加执行单元和整数洗牌单元,因此将phaddd实现为3个uop最明显的方法是将其解码为两个硬连线洗牌模式和一个普通的paddd uop。

注脚1: 优化 P5 显然涉及使用 x86 的 RISC 子集,例如避免除 mov 外的内存源操作数,绝对避免内存目的地指令。这是因为它是一个按顺序执行的流水线,并且不能将多个 uop 指令分开以独立调度。

有关 P5 与后来的微架构的进一步阅读:https://agner.org/optimize/。 另外 https://www.realworldtech.com/sandy-bridge/ 很好。

http://www.lighterra.com/papers/modernmicroprocessors/ 是一个很好的介绍,如果你还没有阅读过它,但它不会深入到你问题的细节层面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接