昨天看到伯乐在线的一篇文章 《为什么处理有序数组比无序数组快?》 提到了分支预测,然后放狗搜了一下。试着说说我的理解。
百科上解释分支预测是 解决处理分支指令(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参数可以生成条件转移指令。因此是没有区别的,他们都飞快的。
以上