X86 分支预测。它实际上是如何工作的?

X86 分支预测。它实际上是如何工作的?,x86,branch-prediction,X86,Branch Prediction,然后取下最有可能的分支并 推测性地执行。如果以后检测到猜测是错误的 错误,则推测执行或部分执行 指令将被丢弃,管道将以 纠正分支,导致延迟 引文来自维基百科 为什么总是可以丢弃已执行的指令?例如,如果预测失误的take分支中的第一条指令是syscall0x60(在Linux上是interruption:“Exit program”)。我知道在预测失误的情况下程序不会退出,但CPU如何能够放弃 我知道每一条指令(分割成微操作)都必须退役才能完成。可能这对推测性执行很重要?推测性执行通常适用于加载寄

然后取下最有可能的分支并 推测性地执行。如果以后检测到猜测是错误的 错误,则推测执行或部分执行 指令将被丢弃,管道将以 纠正分支,导致延迟

引文来自维基百科

为什么总是可以丢弃已执行的指令?例如,如果预测失误的take分支中的第一条指令是
syscall0x60
(在Linux上是interruption:“Exit program”)。我知道在预测失误的情况下程序不会退出,但CPU如何能够放弃


我知道每一条指令(分割成微操作)都必须退役才能完成。可能这对推测性执行很重要?

推测性执行通常适用于加载寄存器和分支。这些都很容易通过CPU使用以下技术进行恢复:


并非所有指令都可以可靠地回滚。正如您所知道的,像
syscall
这样的东西不能。例如,如果您进行了删除文件的系统调用,CPU将无法回滚该文件!这里发生的情况是,当推测执行处于活动状态时,某些指令会在CPU等待确定分支的实际结果时导致执行“暂停”

因此,答案是:只有容易回卷的指令才能被推测地执行。第一个不容易恢复的指令停止推测执行,直到不知道brnach的结果。对吗?为什么
syscall
不容易被丢弃?它基本上是一个
jmp
,只改变指令指针寄存器,对吗?有关于这方面的资料吗?@vidstige-这实际上不仅仅是一个跳转,
syscall
通常是从用户空间到内核空间的转换,而常规的
jmp
则不是。@Sean好吧,所以你没有这方面的资料,只是在猜测。@vidstige你到底在寻找什么样的资料来源?syscall的作用可以在中找到。很难推测过去是其语义的结果。指令管道中的第一阶段,不修改内存或寄存器(例如:指令获取和解码),总是可以执行,而不会出现丢弃结果的问题。