zoukankan      html  css  js  c++  java
  • 分支预测

    昨天看到伯乐在线的一篇文章《为什么处理有序数组比无序数组快?》提到了分支预测,然后放狗搜了一下。试着说说我的理解。

    百科上解释分支预测是解决处理分支指令(if-then-else)导致流水线失败的数据处理方法,由CPU来判断程序分支的进行方向,能够加快运算速度

    现在的CPU都是流水线型处理指令,比如执行指令顺序是A->B->C,在执行A指令的同时会译码B指令,同时读取C指令。这样可以加快指令执行速度。但是条件判断语句会破环流水线过程,CPU无法确定下一条指令。所以引入分支预测,一般来说有50%的正确率,其实就是瞎蒙。

    不过有两种预测方法可以改进预测准确率:1.静态分支预测和动态分支预测。

    1.静态分支预测:

    简单的方法就是任选,和上面说的一样,准确率50%。更先进的方法是通过统计之前运行的指令结果来跳转指令。

    2.动态分支预测:(还没理解)

    最简单的动态分支预测策略是分支预测缓冲区(Branch Prediction Buff)或分支历史表(branch history table)。

    用途:

    知道分支预测有什么好处呢?

    比如如下代码

     1 if (t1 == 0 && t2 == 0 && t3 == 0) 

    每个条件都单独预测,速度会慢很多。通过以下的代码可以提高分支预测能力

     1 if ((t1 | t2 | t3) == 0)

    更多的例子,需要以后多注意发掘

    PS:在x64机器上的GCC 4.6.1 中使用-O3或者-ftree-vectorize参数可以生成条件转移指令。因此是没有区别的,他们都飞快的。

    以上

  • 相关阅读:
    android自定义View之NotePad出鞘记
    一个电商项目的Web服务化改造
    一个电商项目的Web服务化改造
    POJ 2886 Who Gets the Most Candies?
    POJ 2392 Space Elevator
    POJ 1276 Cash Machine
    POJ 2063 Investment
    CodeForces 159c String Manipulation 1.0
    Gym
    FZU 1921 栀子花开
  • 原文地址:https://www.cnblogs.com/yrpen/p/3771206.html
Copyright © 2011-2022 走看看