【问题标题】:Branch prediction. How does it works in fact?分支预测。实际上它是如何工作的?
【发布时间】:2016-10-05 23:05:28
【问题描述】:

然后提取被猜测为最有可能的分支并 投机执行。如果后来检测到猜测是 错误则投机执行或部分执行 指令被丢弃,流水线从 正确的分支,导致延迟。

引用来自维基百科。

为什么总是可以丢弃已执行的指令?例如,错误预测的采用分支中的第一条指令是syscall 0x60(在 Linux 上是中断:“退出程序”)的情况呢?我知道如果发生错误预测,程序不会退出,但是 CPU 是如何丢弃的呢?

我知道每条指令(拆分为微操作)都必须退出才能完成。也许它对推测执行很重要?

【问题讨论】:

  • 指令流水线中的第一阶段,不修改内存或寄存器,(例如:指令获取和解码)总是可以执行,不会有任何丢弃结果的问题。

标签: x86 branch-prediction


【解决方案1】:

推测执行通常适用于加载寄存器和分支。这些很容易被 CPU 使用register renaming 等技术回滚。

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

【讨论】:

  • 所以,答案是:只有容易回滚的指令才能被推测执行。 首先 不容易回退的指令停止推测执行,直到 brnach 的结果未知。对吗?
  • 为什么syscall不容易被丢弃?它基本上是一个jmp,只改变指令指针寄存器,对吧?有这方面的资料吗?
  • @vidstige - 这不仅仅是一个跳转,syscall 通常是从用户空间到内核空间的转换,而普通的jmp 则不是。
  • @Sean 好吧,所以你没有这方面的消息来源,但只是推测。
  • @vidstige 你在寻找什么样的资源? syscall 的作用在the manual 中找到。很难推测过去是其语义的结果。
猜你喜欢
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 2011-09-27
  • 2021-12-16
  • 2013-03-14
相关资源
最近更新 更多