6

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

我希望 CPU 会利用分支预测,但由于我的分支不是有条件的(在程序集级别上),但分支的位置确实取决于变量(functionPtr+mode)。CPU 是否会尝试计算 functionPtr+mode 并在流水线中开始拉入这些指令?

4

3 回答 3

4

来自 Intel、AMD 和 VIA CPU 的微架构 汇编程序员和编译器制造商的优化指南

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

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

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

于 2014-10-07T16:07:45.203 回答
4

是的,相当新的处理器可以(至少是类似的)间接跳转的分支预测。

从 Pentium(英特尔第一个进行分支预测)到第一个 Pentium IV,用于间接分支的都是分支目标缓冲区 (BTB)。这意味着当(且仅当)目标与前一个目标完全相同时,他们正确地“预测”了此类分支——这听起来足以满足您的情况。

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

于 2014-10-07T15:54:25.773 回答
1

分支预测是针对实际分支,在评估分支之前我们不知道,它告诉接下来要执行哪条指令。但是,由于在您的代码中,下一条指令取决于我们所处的模式,因此不需要任何预测,它们也不会在管道中等待。

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

于 2014-10-07T15:37:21.030 回答