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

为了清楚起见,我不打算在这里进行任何可移植性,所以任何将我与某个盒子绑定的解决方案都可以。

基本上,我有一个if语句,将99%的时间评估为真,并且试图排除性能的每个最后时钟,我可以发出某种编译器命令(使用GCC 4.1.2和x86 ISA,if它很重要)告诉分支预测器它应该缓存该分支?


是。 http://kerneltrap.org/node/4705

__builtin_expect是gcc(versions> = 2.96)为程序员提供分支预测信息给编译器的方法。 __builtin_expect的返回值是传递给它的第一个参数(只能是一个整数)。

if (__builtin_expect (x, 0))
                foo ();

     [This] would indicate that we do not expect to call `foo', since we
     expect `x' to be zero. 

是的,但它不会有任何效果。 例外情况是Netburst之前的旧版(过时)体系结构,即便如此,它也没有做任何可衡量的事情。

英特尔在Netburst体系结构中引入了一个“分支提示”操作码,并且在一些较旧的体系结构上提供了用于冷跳转的默认静态分支预测(后向预测采用,预测未采用)。 GCC通过__builtin_expect (x, prediction)实现这一点,其中预测通常为0或1.编译器发出的操作码在所有新的处理器架构(> = Core 2)上都会被忽略 。 实际上这样做的小角落案例就是旧Netburst架构上的一场冷战。 英特尔现在建议不要使用静态分支提示,可能是因为他们认为代码大小的增加比可能的边际加速更有害。

除了预测器无用的分支提示之外, __builtin_expect也有用,编译器可以重新排列代码以提高缓存使用率或节省内存。

有多种原因不能按预期工作。

  • 处理器可以完美地预测小环路(n <64)。
  • 处理器可以完美地预测小重复模式(n〜7)。
  • 处理器本身可以在编译期间估计运行期间分支的可能性比编译器/编程器更好。
  • 分支的可预测性 (一个分支将得到正确预测的概率)远比分支被采用的概率重要得多。 不幸的是,这是非常依赖架构的,并且预测分支的可预测性是非常困难的。
  • 在Agner Fogs手册中阅读更多关于分支预测的内部工作。 另请参阅gcc邮件列表。


    像Drakosha说,告诉GCC该分支是常见的情况,所以它在分支预测器是冷的,所以通过功能的快速路径容易使CPU执行的情况下产生更好的代码,可能是非常有用的。

    仅供参考,Pentium 4将分支预测提示作为jcc指令的前缀,但只有netburst微体系结构对它们做过任何事情。 请参阅http://ref.x86asm.net/geek32.html。 Agner Fog的3.5节是优秀的asm可选指南,来自http://www.agner.org/optimize/。 他也有一个用C ++优化的指南。

    在最近的英特尔和AMD处理器中,分支预测器和分支目标缓冲器的表现如何正式发布并不多。 优化手册(在AMD和英特尔的网站上很容易找到)提供了一些建议,但不记录具体行为。 有些人已经进行了测试来试图推测实现,例如Core2有多少BTB条目......无论如何,明确暗示预测变量的想法已经被放弃(现在)。 例如,Core2有一个分支历史记录缓冲区,如果循环始终运行恒定的短迭代次数<8或16 IIRC,则可以避免错误预测循环退出。 但不要太快展开,因为适合在64字节(或19uops上的Penryn)不会有取指令的瓶颈,因为它从一个缓冲重放的循环......去阅读昂纳雾的PDF文件,他们是优秀的。

    链接地址: http://www.djcxy.com/p/54873.html

    上一篇: Is it possible to tell the branch predictor how likely it is to follow the branch?

    下一篇: Is it possible to get Windows Azure SDK 1.7 projects to run in 2.3 emulator?