Compiler construction 编译器级的分支预测
我一直在阅读有关分支预测的文章,但我发现的唯一实现大多是在计算机的硬件方面。处理器似乎处理了大部分预测。我的问题是,编译器可以进行分支预测吗?Compiler construction 编译器级的分支预测,compiler-construction,cpu,Compiler Construction,Cpu,我一直在阅读有关分支预测的文章,但我发现的唯一实现大多是在计算机的硬件方面。处理器似乎处理了大部分预测。我的问题是,编译器可以进行分支预测吗? 我只找到了两个方法,函数内联和循环展开。这些被认为是正确的吗?它们还在用吗?当然。编译器可以获得预测信息,前提是它知道: 通过检测运行收集的统计分支概率 通过仪器运行收集的变量值的统计分布;然后,它可以预测条件分支的平均结果,从而预测分支 程序员关于条件语句的频率或偏差的断言 基于范围的循环边界估计(如果未知,则默认为“10”) 分支向后到达循环顶部的
我只找到了两个方法,函数内联和循环展开。这些被认为是正确的吗?它们还在用吗?当然。编译器可以获得预测信息,前提是它知道:
- 通过检测运行收集的统计分支概率
- 通过仪器运行收集的变量值的统计分布;然后,它可以预测条件分支的平均结果,从而预测分支
- 程序员关于条件语句的频率或偏差的断言
- 基于范围的循环边界估计(如果未知,则默认为“10”)
- 分支向后到达循环顶部的知识(预测“take”
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
CMP exp1、exp2;设置条件代码
MOVif_relop X,Y