在 OoO 处理器中单独执行同一指令的操作



想象一下,我们有一个指令,它被分成了3个微操作,我们有一个乱序处理器。我的问题是:这 3 个 uop 必须按顺序执行,或者处理器可以将这些 uop 与其他指令中的其他 uop 交替执行?

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

例如,我们有 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?

是的,每个 uop 都是独立调度的,只需要等待其输入准备就绪。(对于执行端口上的自由循环,它在发送到无序后端时被分配。 x86 uops 究竟是如何安排的? 指令边界与 RS 又名调度程序无关。

对于许多多 uop 指令,uop 对早期指令具有数据依赖性。但有时早期的 uops 只需要其中一个输入即可准备就绪,因此输出的每个输入都有单独的最小延迟。 多个值或范围作为单个指令的延迟意味着什么?

例如add eax, [rdi]只需要在加载 uop完成后准备好EAX。 因此,通过 EAX 的关键路径延迟仅为 1 个周期。 但是,如果 RDI 尚未准备就绪,或者 RDI 指向的内存尚未准备就绪,则无法执行添加 ALU uop。 但是,这仍然是解码为 uops 的重点,不像 P5 Pentium 必须执行加载并在其顺序管道1中加在一起。

(或者,例如,对于英特尔 CPU 上的可变计数偏移,额外的 uop 仅用于 FLAGS输出;GP 整数部分已准备就绪,延迟为 1 个周期,但 FLAGS 结果稍后准备就绪。 生成 GP 整数结果的 uop 与shlx解码到的唯一 uop BMI2 基本相同。

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

另一个例子是phaddd;它的解码非常像两个shufpsuop(2输入洗牌(和一个paddduop,这取决于两个洗牌。 两个随机播放都读取两个输入以馈送随机播放。 Ice Lake 在 2 个端口上有随机单元,实际上可以并行运行随机 uops,使其具有 2 个周期延迟 (uops.info(,低于早期英特尔的 3 个周期,因为单个随机端口的资源冲突。 (Ice Lake的额外shuffle端口只运行一些整数shuffle,所以haddps仍然和Ice Lake一样糟糕(

请注意,我们无法确切地证明每个 uop 在做什么,但考虑到测量的延迟和每个端口的总 uop 计数,对于许多指令,只有一个合理的设计可以解释这种行为。 例如,对于phaddd我们知道 CPU 具有 SIMD 整数添加执行单元和整数随机单元,因此phaddd实现为 3 uops 最明显的方法是解码为两个硬连线随机模式和一个普通paddduop。


脚注1:针对 P5 进行优化显然涉及使用 x86 的 RISCier 子集,例如避免使用除mov之外的内存源操作数,并且绝对避免内存目标指令。 那是因为它是一个有序的管道,并且无法将多uop指令分开以独立调度它们。

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

如果您没有阅读过它,http://www.lighterra.com/papers/modernmicroprocessors/是一个很好的选择,但它没有涉及您的问题所涉及的详细程度。

最新更新