正确的分支预测是免费的吗?

时间:2015-06-17 23:56:26

标签: cpu cpu-architecture

让我们假设您创建了一些具有if语句和条件的代码,因为if语句总是在程序的整个运行过程中始终为true,但是在编译时无法知道条件始终为真(可能在命令行中指定)

在这种情况下,您希望cpu能够预测这一点,并始终选择正确的路径。

这是否意味着使用分支预测代码的速度与那里根本没有if语句一样快?

或者,还有真正的成本吗?

我可以想象一些可能不会消失的成本......

  • 第一次调用,它可能出错,或者分支预测器总是正常运行所需的时间很长。
  • 也许如果程序很大,那么当指令缓存被清除时,分支的知识就会丢失?
  • 也许事实上你有条件代码(也许是其他的)意味着指令缓存不能保持这么多,所以通常会减慢程序的速度
  • 我认为通过正确路径的验证是免费的,并且它会占用一些资源

那些是真的吗?还有其他人吗?

3 个答案:

答案 0 :(得分:3)

某些架构可以使正确预测的分支或多或少地自由。它被称为分支折叠。基本上发生的事情是,当前端的分支预测器看到之前遇到的分支并且其目标已知时,它不是沿着管道发送分支,而是可以在分支目标处发送指令。前端仍然必须看到分支,但后端永远不会,所以如果后端甚至稍微落后,气泡平衡,就好像分支从未存在过。

但是,这不是整个故事。分支可能不会在前几次被错误预测,如果它是一个条件分支,那么某种情况仍然需要解决。

答案 1 :(得分:2)

您必须执行分支(在首先解析所有依赖项之后),这将占用执行资源(端口,队列条目等),尽管任何替代方法(例如条件移动)也需要至少相同的努力。即使是预测者也必须最终检查它们是否正确。

此外,大多数无序CPU还使用专用队列来跟踪分支,例如参见Haswell中的分支顺序缓冲区 - http://www.realworldtech.com/haswell-cpu/3/。如果你有太多的分支,这可能会填满并成为一个限制。一些微架构也可能对更新分支预测器的带宽施加其他限制,最终限制了处理这些分支的速率(通过阻止执行或提交)。

关于代码可缓存性 - 是的,当然你会为这两个路径都有一些代码,但是再次 - 如果分支在程序中有一些功能目的,你就不能真正帮助但是拥有这个代码。分支可能会改变代码的组织方式(取决于编译器优化),但这似乎是次要影响。如果整个if条件是多余的,那么同样适用于您的代码中可能存在的任何代码膨胀。

答案 2 :(得分:0)

好吧,让我给出典型的工程答案;这取决于。

不同的处理器不同地进行分支预测。有许多方法可以进行分支预测。其中一些将使您的场景中的每个分支都正确,其中一些分支不会。

我不知道任何特定分支预测实现的细节,而不是我在大学为计算机体系结构编写的,但我知道分支预测不是标准化模块。只要它运行代码,您就可以根据需要实现分支预测器的好坏。

有些方法会占用资源,有些则不会。总是选择true是一个分支预测器,请记住,它不是一个非常好的预测器。

分支预测器是处理器中许多人的一个迷人部分,我鼓励你继续学习更多,并尝试设计自己的简单处理器!