我有一个循环在反复运行。该循环中的逻辑取决于程序所处的模式。为了提高性能,我认为可以初始化函数指针数组functionPtr[],因此只需调用运行正确逻辑的functionPtrmode。循环将在许多循环中保持相同的模式(数量未知,但有数千个)。该程序仅在英特尔x64计算机上运行,不需要可移植性。
我希望CPU能利用分支预测,但由于我的分支不是有条件的(在汇编级),但分支的位置确实取决于变量(functionPtr+模式)。CPU是否会尝试计算functionPtr+模式,并在管道中开始引入这些指令?
来自英特尔、AMD和VIA CPU的微体系结构面向汇编程序员和编译器制造商的优化指南
http://www.agner.org/optimize/microarchitecture.pdf
第3.7节(对于Sandy Bridge,其他处理器在其他章节中)间接跳转和调用的模式识别间接跳转和间接调用(但不返回)使用与分支指令相同的两级预测器进行预测。
指向函数的指针是一种间接调用。
是的,最近的处理器可以(至少类似于)对间接跳转进行分支预测。
从奔腾(英特尔的第一个分支预测)到第一个奔腾IV,所有用于间接分支的都是分支目标缓冲区(BTB)。这意味着,当(并且只有当)目标与之前的目标完全相同时,他们才能正确地"预测"这些分支——这听起来对你的情况来说已经足够了。
从奔腾M/Prescott(上一代奔腾IV)开始,英特尔改进了间接跳跃的分支预测,使用了两级自适应预测器。如果我正确理解你的问题(即,你的循环将在许多连续迭代中使用相同的目标执行,而这些正是你所关心的),即使只是BTB也足以满足你的目的。如果(例如)你在连续数字的最低有效位上进行分支,那么两级预测器会变得更有用,所以你有一个可预测的模式,在一次迭代中跳到一个目标,在下一次迭代时跳到另一个目标。对于这样的模式,单独的BTB总是会错误地预测分支,但当前处理器中的两级预测器会正确地预测(在第一对迭代之后,因此可以检测到模式)。
分支预测适用于实际的分支,在评估分支之前我们不知道这些分支,这告诉下一步要执行哪个指令。但由于在您的代码中,下一条指令是已知的,这取决于我们所处的模式,因此不需要任何预测,也不会有任何等待。
假设模式更改和指令选项之间有足够的时间,管道每次都会成功地获取正确的指令,而无需付出任何额外的努力。