分支预测器如何知道它是否不正确



这是我第二次问这个问题;第一次有人回复了,但我花了太长时间才回复他们,因此没有完全理解。

我想做的是学习更多关于现代架构的指令获取部分;我假设所有指令都是由分支预测器预测的,指令提取单元根据预测进行提取。

另一位试图帮忙的先生提到了一些关于"分支指令"的事情,也与预测的指令一起发送。这个"分支指令"测试分支预测器的预测是否正确。我还假设这些分支指令进入分支执行单元,并且不需要从内存中加载任何东西。

我不明白的是:

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

谢谢!

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

如果我把你已经知道的东西复习一遍,请原谅我。现在还不完全清楚你对分支预测的困惑来自哪里。

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

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

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

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

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

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

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

这个延迟在现代处理器上可能相当大。它是管道中阶段数的函数,基本上每个阶段一个循环。大多数现代x86 cpu在其管道中大约有15个阶段,因此以这种方式实现分支的成本非常高。一个简单的CPU有一个非常短的管道可能能够摆脱总是等待,但现代处理器必须做别的事情。他们做了一个预测。

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

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

无论CPU最终做出预测,它都像做出了正确的猜测一样继续进行。分支指令被放入管道后,它开始发送它认为将被执行的指令。这被称为推测性执行,这样处理的指令被标记为推测性执行。这让管道知道它不应该对这些不能撤消的指令做任何事情。

当分支指令到达管道末端时,CPU将知道它的猜测是否正确。如果它做出了正确的预测,它不需要做任何事情,它可以让之前的指令通过管道完成旅程。因为它猜对了,分支没有额外的成本。

如果它猜错了,它必须撤销任何推测执行的指令可能已经完成的操作,清除管道并开始发送它应该执行的指令。这将导致相同的延迟,就好像它根本没有做出预测一样。

所以你的问题的答案是"分支预测器如何知道它是否正确?"它不知道也不在乎自己的预测是否正确。它只是做出预测。如果它是一个动态分支预测器,那么它将记录该分支在其历史中是否被采取,但它不会记录它是否做出了正确的决定。

相关内容

  • 没有找到相关文章

最新更新