假设我们有一条指令被分成了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个微操作,而且我们有一个乱序处理器。我的问题是:这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?
add eax,[rdi]
只需要在load uop完成后准备好EAX。因此,通过EAX的关键路径延迟仅为1个周期。但是,如果RDI没有准备好或者RDI指向的内存没有准备好,那么add ALU uop无法执行。但是,这正是将解码转换为uops的重点,与P5 Pentium不同,后者必须在其按顺序流水线中同时执行负载和添加操作1。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上仍然像以往一样糟糕)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/ 是一个很好的介绍,如果你还没有阅读过它,但它不会深入到你问题的细节层面。