3

可能重复:
是否可以告诉分支预测器跟随分支的可能性有多大?

因此,如果分支预测发挥了如此重要的作用(“分支预测器在许多现代流水线微处理器架构(如 x86)中实现高效性能方面发挥着关键作用。” wiki),那么必须有一种优化和帮助的方法是有道理的对的?

我会直截了当地问我的问题:
你能告诉分支预测器你最有可能采取的路线吗?

我举个例子:

如果这是用户第一次运行它,我的程序会在每次加载时检查。很可能应该缓存的分支是标记为“这不是第一次”的分支。

在这个例子中,这没什么大不了的,也许算法可以找出要走的路线,但是在有很多分支的复杂应用程序中,我不太确定算法会在 10 分中获得 10 分。

我们能以某种方式优化它吗?也许标记一个分支进行缓存?
顺便说一句,我要求的是教育目的,也许有一天会要求时间紧迫的程序。

4

4 回答 4

2

这是给 C 的。我要的是 ASM

这意味着您必须自己实现 __builtin_expect 的语义。不难,就是尴尬。如果分支预测器没有该分支的历史记录,那么它将假定在分支向后时采用该分支,而在向前时不采用该分支。

因此,您可能必须重组代码,在分支指令中使用相反的条件并移动代码以适应它。带有条件后向分支的无条件前向跳转很常见,例如 C 编译器实现 for() 循环的方式。

于 2012-12-23T18:47:47.757 回答
2

“如果需要分支提示,可以在分支指令之前添加以下指令前缀以更改静态预测器的行为方式:0x3E - 静态预测分支为采用 0x2E - 静态预测分支为未采用”

http://software.intel.com/en-us/articles/branch-and-loop-reorganization-to-prevent-mispredicts

于 2012-12-23T19:44:00.787 回答
1

最简单的启发式方法是使用匹配最常见路径的分支指令。例如,如果您正在编写循环代码,则通常最好让分支指令遵循循环路径而不是退出条件。目标是使用最常评估为真的分支指令。

如果你选择了完全错误的指令,假设你编写了一个几乎总是立即退出的循环,处理器可能会缓存这个分支的感觉是向后的,并调整它的预测。不过,这只可能发生在大量使用的代码上。

于 2012-12-23T18:46:32.490 回答
1

一些重要的装配分支预测优化,来源:wiki

当预测采用分支时,取指令会出现一个周期的停顿。因此,可以参考结构化代码,以便最可能的代码路径是不采用分支的路径。

无条件分支可能被错误预测,并且跟随分支的加载指令可能被解码并导致缓存访问。避免在分支之后放置加载指令,除非您打算让 CPU 预取它们引用的地址。

尽管指令是成对解码的,但分支预测器每个周期只能预测一个分支目标。如果您有一个条件分支紧跟另一个分支,并且很可能会采用第一个分支,请在分支之间放置一个无操作指令,以防止对第二个分支进行解码和预测。如果不经常采用第一个分支,则插入 NOP 是有害的。

于 2012-12-23T19:11:45.687 回答