分支预测器如何知道它是否正确? [英] How does the branch predictor know if it is not correct?

查看:14
本文介绍了分支预测器如何知道它是否正确?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我第二次问这个问题;第一次有人回复了,但我花了很长时间才回复,因此没有得到充分的理解。

我试图做的是更多地了解现代体系结构的取指令部分;我假设所有指令都是由分支预测器预测的,以供取指令单元根据预测进行取。

另一位绅士试图帮助提到有关"分支指令"的内容,该指令也与预测指令一起发送。此"分支指令"测试分支预测器的预测是否正确的条件。我还假设这些分支指令进入分支执行单元,并且不需要从内存加载任何内容。

我不明白的是:

  • 分支执行单元如何知道对此指令的猜测是否正确?
  • 一旦它知道它是正确的,会发生什么?
  • 是否每次预测都会发出分支指令(基本意思是...每次做出任何预测?)
  • 分支预测必须在预测指令之前还是之后?
  • 分支指令需要从内存加载任何数据吗?如果是,是什么?

谢谢!

推荐答案

我认为要回答您的问题,您首先需要了解分支预测是如何工作的。为了解释这一点,有必要首先了解为什么它会做出这些预测。这需要了解现代处理器中的流水线是如何工作的。对我来说,解释这一点的最好方法是从非流水线CPU如何处理指令开始。

(如果我复习一下你已经知道的事情,请原谅我。还不完全清楚您对分支预测的困惑源自何处。)

较老的CPU,以及许多简单的现代CPU,以一种相当简单和明显的方式处理指令。它们将执行指令所需的操作分解为一系列步骤。每条指令都要经过这些步骤,一旦全部完成,它就会进入下一步。例如,假设一个简单的非流水线CPU可能会遵循如下一系列步骤:

  1. 将指令提取到内存中。
  2. 读入指令的操作数。
  3. 执行该指令的操作。
  4. 写入结果

以这种方式实现CPU相对简单,但它对处理器资源的使用效率非常低。当CPU在执行AND指令的过程中执行一个步骤时,用于实现其他步骤的所有芯片都处于空闲状态。

现代流水线处理器试图通过将执行指令所需的一系列步骤转变为类似装配线的东西来提高效率。指令会经历一系列步骤,或称为阶段,就像在非流水线CPU中一样。不同之处在于,一旦一条指令清除了流水线的第一级,CPU就可以向下发送另一条指令。这允许几条指令同时在流水线中,希望能保持芯片的所有部分得到很好的利用。虽然指令仍然需要经历许多不同的阶段,但理想情况下,指令会一个接一个地快速地从流水线中出来。流水线不会缩短从开始到结束执行指令的时间,相反,它缩短了指令完成之间的时间。

现在,这是对现代流水线的相当简单的描述,掩盖了使现代流水线CPU的设计复杂化的许多问题。然而,就分支预测而言,只有一个复杂问题需要解决:执行分支指令时要做什么。

首先,不需要对分支指令本身进行任何特殊处理。它可以像其他任何东西一样被扔进管道。一旦清除了第一阶段,CPU就可以向下发送下一条指令--这就是问题所在。下一条指令是什么?因为它是一个分支,所以它可能有两种不同的方式,在分支指令完成流水线中的旅程之前,CPU不知道是哪种方式。

处理器要做的简单事情是等待。由于在流水线等待期间没有其他指令被送入流水线,因此流水线将被清空。只有当分支指令退出(现在为空)流水线时,CPU才能恢复将指令放入。下一条指令必须经过现在为空的流水线的所有阶段,导致分支指令完成时和下一条指令完成之间的延迟。在这种情况下,指令不会像理想情况下那样快速连续地退出流水线。

在现代处理器上,此延迟可能会相当大。这是流水线中级数的函数,基本上每个级一个周期。大多数现代x86 CPU在其流水线中有大约15个阶段,因此以这种方式实现分支的成本将非常高。一个具有非常短的流水线的简单CPU可能能够在总是等待的情况下逃脱惩罚,但现代处理器必须做一些其他的事情。他们会做出预测。

最简单的预测形式是静态分支预测。处理器只查看分支指令本身,以猜测它是否将被采用。静态预测的最简单形式是假设没有采用所有分支,因为这种情况经常发生。更高级的静态预测器假定采用向后的分支,而不采用向前的分支。这就产生了向后分支是循环的假设,并且循环通常会执行多次。

静态预测可以很好地工作,但它仍然会做出许多糟糕的预测。您可以通过使用某种动态分支预测来改进这一点。有各种不同的方法可以做到这一点,这里不能一一提及,但它们都是根据以前分支机构走的历史来猜测的。

然而,CPU最终做出了预测,它继续进行,就好像它做出了正确的猜测一样。在分支指令被放入流水线后,它开始向下发送它认为将被执行的指令。这称为推测性执行,这样处理的指令被标记为推测性的。这会让管道知道它不应该对这些指令执行任何无法撤消的操作。

当分支指令到达流水线的末尾时,CPU现在将知道它的猜测是否正确。如果它做出了正确的预测,它不需要做任何事情,它可以让前一条指令完成流水线中的旅程。由于正确猜测,该分支机构没有额外成本。

如果它猜测错误,它必须撤消推测执行的指令可能已经完成的任何操作,清除流水线并开始向下发送它应该正在执行的指令。这会导致相同的延迟,就好像它根本没有做出预测一样。

那么您的问题的答案&分支预测器如何知道它是否正确?就是它不知道,也不在乎它是否做出正确的预测。它只是做预测。如果它是动态分支预测器,则它将在其历史记录中记录是否采用了该分支,但不会记录它是否做出了正确的决定。

这篇关于分支预测器如何知道它是否正确?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆