Assembly 分支预测

Assembly 分支预测,assembly,micro-optimization,Assembly,Micro Optimization,可能重复: 因此,如果分支预测扮演着如此重要的角色(“分支预测器在许多现代流水线微处理器体系结构(如x86)中实现高效性能方面扮演着关键角色”),那么必须有一种优化和帮助它的方法是有意义的,对吗 我将以直截了当的方式问我的问题:你能告诉分支预测者你最有可能选择哪条路线吗? 我将举一个例子: 我的程序每次加载时都会检查用户是否是第一次运行它。 最有可能应该缓存的分支是标记为“这不是第一次”的分支 在这个例子中,这没什么大不了的,也许算法可以知道该走哪条路,但是在有很多分支的复杂应用程序中,我不太

可能重复:

因此,如果分支预测扮演着如此重要的角色(“分支预测器在许多现代流水线微处理器体系结构(如x86)中实现高效性能方面扮演着关键角色”),那么必须有一种优化和帮助它的方法是有意义的,对吗

我将以直截了当的方式问我的问题:
你能告诉分支预测者你最有可能选择哪条路线吗?

我将举一个例子:

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

在这个例子中,这没什么大不了的,也许算法可以知道该走哪条路,但是在有很多分支的复杂应用程序中,我不太确定算法会得到10分中的10分

我们能以某种方式优化它吗?可能会标记一个用于缓存的分支?

顺便说一句,我要求的是教育目的,也许有一天是时间关键型程序。

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

如果您选择了完全错误的指令,比方说您编写了一个几乎总是立即退出的循环,处理器可能会缓存该分支的意义是向后的,并调整其预测。但这只可能发生在大量使用的代码中

是给C的,我要的是ASM

这意味着您必须自己实现内置的语义。这并不难,只是很尴尬。如果分支预测器没有分支的历史记录,那么它将假定分支向后时执行,而向前时不执行


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

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

当预测执行一个分支时,指令获取中存在一个周期暂停。因此,它可以引用结构代码,因此最有可能的代码路径是不执行分支的路径

无条件分支可能会预测失误,分支后面的加载指令可能会被解码并导致缓存访问。避免将加载指令放在分支之后,除非您希望CPU预取它们引用的地址

虽然指令成对解码,但分支预测器每个周期只能预测一个分支目标。如果有一个条件分支紧接着另一个分支,并且第一个分支很可能发生,则在分支之间放置一条无操作指令,以防止第二个分支的解码和预测。如果不经常使用第一个分支,则插入NOP是有害的

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


@CarlNorum它是为C设计的。我要求的是ASM。根据这个问题,虽然有一个分支提示指令,但在后Netburst体系结构上它是NOP。C和汇编最终都会变成机器指令。@CarlNorum是的,编译。我不知道如何自己编译那里的代码。