我无法找到特定于上述两种情况的信息, 虽然听到了你的专家意见。
第一件事是:我知道间接jmps会伤害分支预测,即使间接结果是常量,它仍然需要预测维护缓冲区和东西,所有这些都与绝对jmp相比。
我的问题是,如果有人知道是否:
mov rax, 1234567812345678h;
jmp rax;
仍被处理器的分支预测器视为间接,或者在这种情况下是否进行数学运算。 我这样做是因为x64没有“jmp absolute 64”指令:/
其次,就此而言,jmp 0x1234和调用0x1234之间是否有任何真正的区别(就处理器优化而言(指令缓存,预取器和它的提示,分支预测))? (vc2012“速度优化”产生调用,“min_size opt”产生jmp,“混合优化”产生jmp for x64,调用x86)
提前谢谢大家!
答案 0 :(得分:2)
英特尔的分支机构目标(和分支机构)预测既非常复杂,也是一个密切关注的商业秘密。没有一种算法,也就是说,您可以预期CPU的预测机制会有所不同;这取决于英特尔希望为给定处理器解决问题的晶体管数量。当然,除了英特尔之外,还有其他x86和x64处理器制造商。
历史分支目标预测机制 - 使用相同指令的过去运行来预测后续执行的目标 - 几乎可以肯定地预测该分支的正确目标,因为只有一个。因此,如果重新执行该代码序列(例如,在循环中)并且它在指令高速缓存中停留一段时间,则可能会很好地处理它。 (但是,在某些处理器上,如果其他地方发生另一个分支导致哈希冲突,则分支目标预测机制可以通过类似的效果抵消高速缓存行冲突。)
一个更大的问题可能是,如果在新加载到缓存中的代码中出现这样的序列,它将如何处理,这将转到处理器的非基于历史记录的目标预测功能。这样的(非历史的)分支目标预测可以容易地确定给定该代码序列的分支位置,但是它完全取决于制造商是否认为它对于任何给定处理器而言是否值得管芯上的不动产。做出这种决定的因素包括功耗,权衡其他性能改进(即可能更好地使用相同芯片面积),以及预期这种和各种其他代码序列的频率。