这里有一个测试问题。
当流水线无法预测进一步执行方式(分支预测)时,哪些指令可能会潜在地减缓处理器的工作?
可能的答案: JGE | ADD | SUB | PUSH | JMP | JNZ | MUL | JG | CALL
如果我们谈论分支预测,JGE、JMP、JNZ和JG是可行的吗?
这里有一个测试问题。
当流水线无法预测进一步执行方式(分支预测)时,哪些指令可能会潜在地减缓处理器的工作?
可能的答案: JGE | ADD | SUB | PUSH | JMP | JNZ | MUL | JG | CALL
如果我们谈论分支预测,JGE、JMP、JNZ和JG是可行的吗?
像mul
这样的指令没有特殊对EIP的操作,当然不会出现错误预测,但每一种跳转/调用/分支在流水线设计中都可能发生某种程度的错误预测,即使是简单的call rel32
。这种影响在像现代x86 CPU这样高度流水线化的乱序执行设计中会非常严重。
是的,jcc
条件分支总是需要预测;在解码时无法获得FLAGS的值,只能在执行时才能获取。
有趣的事实: ret
也可能会出现错误预测; 它基本上是一种间接分支 (pop eip
)。但是有些特殊的预测器利用了调用和返回指令之间的常规配对,保持最近调用记录的内部堆栈,以反映在内存中调用堆栈的使用情况。http://blog.stuffedcow.net/2018/04/ras-microbenchmarks/
JMP EAX
/CALL EAX
?当EAX
在现场使用某些过度公式进行计算时,间接跳转和调用肯定会产生流水线气泡。 - hidefromkgbjmp rel32
(和call
),也可能在前端早期被错误预测,需要重新指引。请参见Slow jmp-instruction。但是,间接的jmp/call肯定需要分支预测,并且可能一直到后端才能检测到错误预测,因此只有寄存器或内存间接形式需要在后端回滚uops。 - Peter Cordes