分支预测

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

百科上解释分支预测是解决处理分支指令(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参数可以生成条件转移指令。因此是没有区别的,他们都飞快的。

以上

posted @ 2014-06-05 21:44  Yrpen  阅读(1583)  评论(0编辑  收藏  举报