Ala*_*lfe 6 cpu cpu-architecture
假设您编写了一些具有 if 语句和条件的代码,其中 if 语句在程序的整个运行过程中始终为 true,但在编译时无法知道条件始终为 true(也许它的在命令行中指定)
在这种情况下,您希望 CPU 能够预测这一点并始终选择正确的路径。
这是否意味着使用分支预测,代码就像根本没有 if 语句一样快?
或者说,还有实际成本吗?
我可以想象一些可能不会消失的成本......
这些是真的吗?还有其他人吗?
您必须执行分支(首先解决所有依赖关系之后),这将占用执行资源(端口、队列条目等),尽管任何替代方法(例如条件移动)也至少需要同等的努力。即使是预测者最终也必须检查他们的预测是否正确。
此外,大多数乱序 CPU 还采用专用队列来跟踪分支,例如 Haswell 中的分支顺序缓冲区 - http://www.realworldtech.com/haswell-cpu/3/。如果您有太多分支,这可能会被填满并成为限制。某些微架构还可能对更新分支预测器的带宽施加其他限制,最终限制处理这些分支的速率(通过阻止执行或提交)。
关于代码可缓存性 - 是的,当然你会有一些用于两个路径的代码,但同样 - 如果分支在程序中具有某些功能目的,那么你真的不能不拥有这段代码。分支可能会改变代码的组织方式(取决于编译器优化),但这似乎是次要影响。如果整个if条件是多余的,那么这同样适用于代码中可能存在的任何代码膨胀。