x86-64管道是否像JMP RAX那样在间接跳转时失速



在x86-64中,如果使用以下汇编代码:

MOV RAX, (memory address)
JMP RAX

管道是在执行分支之前暂停(等待MOV用RAX完成),还是像条件分支一样刷新管道?

适用于大多数现代80x86 CPU;有静态预测(没有历史可以用来进行更好的预测)和动态预测(有以前执行的历史可以使用)。

对于静态预测,CPU预测在紧接着CCD_ 1之后的指令处继续执行。我不完全确定哪些CPU对JMP RAX使用动态预测(而不仅仅是对Jc分支);但对于那些这样做的人来说,它会覆盖静态预测。

一旦CPU有了预测的目标地址,它就会推测性地执行,直到它发现它预测的是对是错。如果预测正确,它会保留它所做的所有工作,JMP RAX将几乎没有成本。

如果CPU预测错误,那么这与任何其他分支预测错误都没有什么不同(放弃所有推测执行的工作,然后返回到正确的RIP获取/解码)。

请注意,如果您的JMP RAX是不可预测的,或者它之后的指令不太可能成为跳转的目标;英特尔建议在跳转后立即放入PAUSEUD2,以防止不必要的推测性执行。在这种情况下,CPU将暂停(在找到正确的跳转目标之前什么都不做)。

还要注意的是,您希望移动MOV RAX, ..,以便尽快执行它,以便尽快知道跳跃的目标,从而最大限度地减少停滞或推测性执行错误的时间。

相关内容

  • 没有找到相关文章

最新更新