是Mov Rax,0x12345678;JMP RAX仍然杀死分支的预测



我找不到针对上述两个情况的信息,尽管听到您的专家意见。

第一件事是:我知道间接JMP会伤害分支的预测,即使间接结果恒定,它仍然需要预测维护缓冲区和其他内容,所有这些都与绝对JMP相比。

我的问题是,如果有人知道是否:

mov rax, 1234567812345678h;
jmp rax;

仍然被处理器的分支预测变量考虑间接,或者在这种情况下它可以进行数学。我这样做是因为X64没有直接的" JMP绝对64"。指示,只有间接。:/(如何使用64位绝对地址执行呼叫指令?如果您不能将跳跃放置足够靠近目标并使用jmp rel32。)


其次,在某种程度上,JMP 0x1234和CALL 0x1234(就处理器优化而言(指令缓存,prefetcher及其提示,分支预测))是否有任何真正的区别)?(vc2012"速度优化"收益"呼叫"呼叫," min_size opts opts opts jmp,"混合优化" x64的jmp jmp for x64,请致电x86)

英特尔的分支目标(和分支)预测既非常复杂又是一个密切关注的商业秘密。不一定有一种算法,也就是说,您可以期望预测机制在CPU中有所不同。这取决于Intel想要解决给定处理器的问题的数量。而且,当然,除英特尔以外,还有其他X86和X64处理器的制造商。

历史分支目标预测机制(使用相同指令的过去运行来预测后续执行的目标)几乎可以肯定会预测该分支的正确目标,因为只有一个。因此,如果此代码序列被重新执行(例如,在循环中),并且它在指令缓存中停留一段时间可能会很好地处理。(但是,在某些处理器上,如果其他分支在其他地方发生的其他分支导致哈希碰撞,则可以通过与缓存线碰撞相似的效应中和。)

一个更大的问题可能是,如果该序列在新近加载到缓存中的代码中自由出现,该序列的处理方式如何,该序列用于处理器的基于非历史的目标预测功能。这种(非历史性的)分支目标预测可以轻松地确定给定代码顺序的分支位置,尽管它完全取决于制造商是否认为对任何给定处理器的模具是否值得进行房地产。做出此决定的因素包括功耗,权衡其他绩效改进(即可能更好地使用同一死亡区域),以及此类的预期以及其他代码序列的频率。

;我知道间接JMPS伤害分支预测&quord'

否。分支预测和间接跳跃预测是不同的。此外,间接跳跃用于基于表的开关语句和解释器中。这些是非常常见的用例,并以基准显示。因此,英特尔和其他人花了很多努力,并且大量晶体管提高了其性能。一篇论文(在问题之后写得很好!)甚至说,从桑迪桥开始,您不应该相信这一间接跳跃预测的民间传说。Intel AMD有一个动机来改善这种表现。

现在,如果您的JMP示例是冷代码,则如果这是第一次执行,则无法预测,实际上Skylake间接跳跃预测器将在跳跃并从那里推测后预测下一条指令。您可以使用UD2(非法指示)关闭该猜测。无论如何,第二次执行JMP(如果仍在BTB中),分支目标是正确的。

关于您的第二个问题,缓存效果无关紧要。我想较小的版本可以英雄地节省缓存线溢出,但仅此而已。HW Prefetcher用于数据,而不是指令。

相关内容

  • 没有找到相关文章

最新更新