这个问题主要是在阅读了 Aater Suleman 的这篇关于从软件方面改进分支预测的文章之后的后续问题。作者提供了一种“展开”条件语句的方法,以增加在 2 位饱和计数器方案的情况下预测分支的概率。这是一段摘录:
让我用一个例子来解释。让我们假设 X 是 0 到 99 之间的随机变量。我想运行以下代码:
if (X > 5 && X < 95) //90% 的时间使用分支
do_something();但是,如果我将代码编写为:
if(X > 5) //95% 的时间
使用分支 if(X < 95) //95% 的时间使用分支
do_something();分支预测器可以更准确地预测这两个分支,这可能会带来更好的性能,因为分配给这两个分支的计数器更有可能在采取时保持饱和(因为两个未采取的可能性较小)。
一般来说,每当您在 if 语句中对条件进行 ANDing/ORing 时,您都应该考虑该组合是否会更偏向或更少偏向,并选择更偏向的版本。
我的问题是:编译器是否一直遵循这种启发式方法?由于编译器存在于 ISA 的范围内,而架构和分支预测方案存在于处理器和更具体的硬件实现的范围内,编译器是否甚至有权做这样的事情?
我的直觉是,以这种方式扩展控制语句不会损害性能,但同时我还没有找到任何证据表明编译器进行了这种优化。如果是这样,他们为什么不呢?我在推理中遗漏了什么,有人可以提供一个例子,说明这种优化对某个架构或预测方案是有害的吗?
谢谢。