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

我想做的是了解更多有关现代体系结构的指令获取部分的信息。我假设所有指令均由分支预测器预测,以使指令提取单元根据预测进行提取。

另一位试图帮助提及“分支指令”的绅士也与预期的指令一起发送。此“分支指令”测试分支预测器的预测条件是否正确。我还假定这些分支指令转到分支执行单元,并且DONT要求从内存中进行任何加载。

我不明白的是:


分支执行单元如何通过该指令知道猜测是否正确?
一旦知道它是正确的,会发生什么?
是否向分支指令发出每个预测(基本含义是……每次做出任何预测?)
分支预测必须在预测的指令之前还是之后?
分支指令是否需要从内存加载任何数据?如果是这样,那是什么?


谢谢!

最佳答案

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

(如果我仔细研究一下您已经知道的事情,请和我一起承担。目前尚不清楚您对分支预测的困惑源自何处。)

较旧的CPU和许多简单的现代CPU都以相当直接和明显的方式处理指令。他们将执行一条指令所需的动作分解为一系列步骤。每条指令均通过这些步骤运行,一旦完成所有步骤,便继续进行下一个步骤。例如,假设的简单非流水线CPU可能遵循以下一系列步骤:


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


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

现代流水线处理器试图通过将执行指令所需的步骤序列转换为组装线之类的方法来提高效率。指令具有一系列步骤或称为阶段,就像在非流水线CPU中一样。区别在于,一旦清除了流水线的第一级指令,CPU便可以向下发送另一条指令。这允许几个指令同时进入流水线,希望可以保持芯片的所有部分得到充分利用。尽管一条指令仍需要经历许多不同的阶段,但理想情况下,一条指令会彼此快速地从管道中出来。流水线技术不会缩短从头到尾执行一条指令的时间,相反,它缩短了指令执行之间的时间。

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

首先,分支指令本身不需要降低任何特殊条件。可以像其他任何方式一样将其扔掉。一旦清除了第一阶段的内容,CPU就可以发送下一条指令,这就是问题所在。下一条指令是什么?由于它是分支,因此可以采用两种不同的方式,并且直到分支指令完成其在管道中的行程之前,CPU才知道哪个。

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

在现代处理器上,这种延迟可能会很大,它是流水线中级数的函数,基本上每个级一个周期。大多数现代x86 CPU的流水线中大约有15个阶段,因此以这种方式实现分支将非常昂贵。具有非常短的流水线的简单CPU可能可以始终保持等待状态,但是现代处理器必须做其他事情。他们做出了预测。

预测的最简单形式是静态分支预测。处理器仅查看分支指令本身,以猜测是否将采用该指令。静态预测的最简单形式是假定未采用所有分支,因为这种情况经常发生。更高级的静态预测器假定采用向后分支,而不向后分支。这假定后向分支是循环,并且循环通常执行不止一次。

静态预测可以很好地工作,但是它仍然会做出很多错误的预测。您可以通过采用某种动态分支预测来对此进行改进。有很多不同的方法可以完成此操作,这里有许多要提到的方法,但是它们都基于以前分支的运行方式的历史进行猜测。

但是,CPU最终进行了预测,就好像做出了正确的猜测一样继续进行。将分支指令放入管道后,它开始发送假定执行的指令。这称为推测执行,并且像这样处理的指令被标记为推测。这使管道知道对这些无法撤消的指令不应执行任何操作。

当分支指令到达流水线的末尾时,CPU现在将知道其猜测是否正确。如果做出正确的预测,则无需执行任何操作,它可以使上一条指令完成整个管道的旅程。因为它猜对了,所以分支没有额外的成本。

如果猜错了,则必须撤消推测性执行指令可能已完成的所有操作,清除管道,然后开始发送应该执行的指令。这导致了完全没有做出预测的相同延迟。

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

07-24 18:46
查看更多