Assembly 在OoO处理器中分别执行相同指令的操作
假设我们有一条被分成3个微操作的指令,我们有一个无序的处理器。我的问题是:这3个UOP必须按顺序执行,或者处理器是否可以将这些UOP与其他指令中的其他UOP替换 我的意思是,在OoO处理器中,你可以无序地执行指令,但是如果我们把一条指令分成一些微操作,这些微操作可以非顺序地执行吗Assembly 在OoO处理器中分别执行相同指令的操作,assembly,x86,cpu-architecture,instructions,micro-architecture,Assembly,X86,Cpu Architecture,Instructions,Micro Architecture,假设我们有一条被分成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?是的,每
例如,我们有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都是独立调度的,只需等待其输入就绪即可。(对于执行端口上的一个空闲周期,它是在发送到无序后端时分配的。)指令边界与RS aka调度程序无关 对于许多多uop指令,uop对早期的指令具有数据依赖性。但有时早期的uop只需要准备一个输入,因此每个输入到输出都有单独的最小延迟 e、 g.
添加eax,[rdi]
仅需要在装载uop完成后准备好eax。因此,通过EAX的关键路径延迟仅为1个周期。但是如果RDI没有准备好,或者RDI指向的内存没有准备好,那么add ALU uop就无法执行。但这仍然是UOP解码的重点,不像P5 Pentium必须按照顺序管道1进行加载和添加
(或者,例如,额外的uop仅用于标志输出;GP integer部分准备就绪,延迟时间为1个周期,但标志结果稍后准备就绪。生成GP integer结果的uop基本上与唯一的uop BMI2shlx
解码为相同。)
但有些确实有一些(实际上uop级别的并行性)。例如,xchg eax,ecx
在英特尔CPU上解码为3个寄存器拷贝UOP,我们可以分别测量eax->ecx和ecx->eax方向在1和2个周期(分别)的延迟
另一个例子是phaddd
;它的解码非常类似于两个shufp
uop(两个输入洗牌)和一个padd
uop,这取决于两个洗牌。这两个随机播放都在读取两个输入来为随机播放提供信息。Ice Lake在2个端口上有随机播放单元,实际上可以并行运行随机播放UOP,使其延迟2个周期(),低于早期Intel上的3个周期,因为单个随机播放端口的资源冲突。(Ice Lake的额外shuffle端口只运行一些整数shuffle,因此,haddps
在Ice Lake上仍然和以往一样糟糕)
请注意,我们无法确切证明每个uop都在做什么,但考虑到测量的延迟和每个端口的总uop计数,对于许多指令,只有一种合理的设计可以解释这种行为。e、 g.对于phaddd
我们知道CPU有SIMD integer add执行单元和整数洗牌单元,因此将phaddd
实现为3个uop最明显的方法是解码为两个硬连线洗牌模式和一个普通的paddd
uop
脚注1: 针对P5的优化显然涉及使用x86的RISCier子集,比如避免使用除
mov
之外的内存源操作数,以及明确避免使用内存目标指令。这是因为它是一个有序的管道,并且无法将多个uop指令分开单独调度
进一步阅读:p5与后来的微体系结构:。也很好
如果你没有读过它,它是一个很好的工具,但是它没有深入到你的问题所涉及的细节层次。是的,微操作可以独立地重新排序。