函数指针上的分支预测

时间:2014-10-07 15:29:40

标签: c++ branch-prediction

我有一个反复运行的循环。该循环内部的逻辑取决于程序所处的模式。为了提高性能,我认为可以初始化函数指针数组functionPtr [],这样就可以调用运行正确逻辑的functionPtrmode。循环将在相同的模式下保持多个循环(数量未知,但数千个)。该程序仅在intel x64机器上运行,不需要携带。

我希望CPU能利用分支预测,但由于我的分支不是条件的(在汇编级别),但分支的位置确实依赖于变量(functionPtr + mode)。 CPU是否会尝试计算functionPtr +模式并在流水线中开始拉入这些指令?

3 个答案:

答案 0 :(得分:2)

分支预测是指在分支评估之前我们不知道的实际分支,它告诉接下来要执行哪条指令。但是因为在你的代码中,根据我们所处的模式,下一条指令是已知的,所以不需要任何预测也不会在管道中等待。

鉴于模式更改和指令选项之间有足够的时间,管道将每次成功获取正确的指令而无需任何额外的努力。

答案 1 :(得分:2)

是的,合理的近期处理器可以(至少是类似的)对间接跳跃进行分支预测。

从奔腾(英特尔首次做分支预测)到第一批奔腾IV,所有用于间接分支的都是分支目标缓冲区(BTB)。这意味着当目标与之前的目标完全相同时(并且仅当时)它们正确地“预测”了这样的分支 - 这听起来像是适合您的情况。

从Pentium M / Prescott(最后一个Pentium IV)开始,英特尔改进了间接跳转的分支预测,以使用两级自适应预测器。如果我正确理解你的问题(即,你的循环将在许多连续迭代中以相同的目标执行,并且那些是你关心的),即使只是BTB就足以满足你的需要。如果(例如)你在连续数字的最低有效位上进行分支,那么两级预测器会变得更有用,所以你有一个可预测的模式,在一次迭代中跳转到一个目标,另一个在下一次迭代中。使用这样的模式,单独的BTB将始终不正确地预测分支,但是当前处理器中的两级预测器将正确预测(在前几次迭代之后,因此可以检测到模式)。

答案 2 :(得分:1)

来自Intel,AMD和VIA CPU的微体系结构程序集编程器和编译器制造商的优化指南

http://www.agner.org/optimize/microarchitecture.pdf

第3.7节(对于Sandy Bridge,其他处理器在其他部分) 间接跳转和调用的模式识别 使用与分支指令相同的两级预测器来预测间接跳转和间接调用(但不返回)。

指向函数的指针是间接调用。