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

Ala*_*lfe 6 cpu cpu-architecture

假设您编写了一些具有 if 语句和条件的代码,其中 if 语句在程序的整个运行过程中始终为 true,但在编译时无法知道条件始终为 true(也许它的在命令行中指定)

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

这是否意味着使用分支预测,代码就像根本没有 if 语句一样快?

或者说,还有实际成本吗?

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

  • 第一次调用,可能会出错,或者分支预测器需要多长时间才能始终正确。
  • 也许如果程序很大,当指令缓存被清除时,分支的知识就会丢失?
  • 也许您有条件代码(也许还有其他代码)意味着指令缓存无法容纳那么多内容,因此通常会减慢您的程序
  • 我敢打赌,它采取正确路径的验证不可能是免费的,而且它会消耗一些资源

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

Lee*_*eor 2

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

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

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