我一直在阅读有关分支预测的内容,但我发现的唯一实现主要是在计算机的硬件方面。处理器似乎负责大部分预测。我的问题是,编译器可以进行分支预测吗? 我唯一发现的是两种方法,函数内联和循环展开。这些被认为是正确的吗?还在用吗?
当然。 如果编译器知道的话,它就可以获得预测信息:
使用这些信息,它可以预测条件的可能结果,然后生成倾向于由硬件正确“预测”的分支指令。
一些编译器完成的一组特别有趣的优化是“跟踪调度”,它根据顺序遇到的分支的概率来确定代码的路径集。通过确定最高概率路径,编译器可以在整个路径上进行优化,而不仅仅是在基本块内进行优化。 最后一个标准技巧:如果您可以避免执行分支,则不必正确预测它! 许多代码序列看起来像这样:
if (exp1 relop exp2)
X = Y
endif
现代CPU具有“谓词”指令,实际上是“MOV_if_relop A to B”, 对于所有关系条件等于、不等于、小于等。 因此,编译器不会为上述构造生成分支,而是生成:
<compute exp1 and exp2>
CMP exp1,exp2 ; sets condition code
MOVif_relop X,Y