【发布时间】:2020-05-03 02:33:31
【问题描述】:
我这里有一道测试题。
哪些指令可能会减慢处理器的工作速度,那么 管道不预测(分支预测)进一步的执行方式?
可能的答案: JGE |添加 |子 |推 | JMP |新西兰 |穆尔 | JG |打电话
如果我们谈论分支预测,JGE、JMP、JNZ 和 JG 是要走的路吗?
【问题讨论】:
-
无条件 JMP 不能被错误预测,因为它是无条件跳转的。
-
@ecm 所以,因为 JMP 无条件跳转,管道总是预测结果?
-
差不多。
-
@ecm 等等,但是间接分支和间接调用呢,比如
JMP EAX/CALL EAX?当EAX在现场使用一些顶级公式计算时,间接跳转和调用肯定会产生管道气泡。 -
@ecm: 是的,
ret很有趣,因为它通常与call匹配,因此 CPU 通常有一个特殊的预测器堆栈(如 16 或 24 个条目)专用于 ret,预测它比将其视为 BTB 的任何其他间接分支要好得多。例如对于 x86 blog.stuffedcow.net/2018/04/ras-microbenchmarks。高性能 ARM 微架构为bx lr做类似的事情。但无论如何,对我来说更令人惊讶的事实是,即使是直接无条件分支也需要在获取阶段进行预测,甚至在它们被解码之前。ret更明显是一个间接分支。
标签: assembly x86 cpu pipeline branch-prediction