如何在编程中降低分支预测错误的几率

条件分支是计算机语言最基本的操作之一。不幸的是,由于条件分支打乱了指令流的顺序,它也是处理器最难高效执行的指令之一。分支有时可以在单个时钟周期内完成执行,有时它们需要花费几十个时钟周期。

分支有两种形式:条件分支和非条件分支。条件分支不是跳转到指定的指令(采纳分支,taken branch),就是执行下面的一条指令(分支落空,fall through)。而非条件分支总是跳转到一个新的位置。对直接跳转来说,这个位置是预先知道的;对间接跳转来说,这个位置则要等到执行时才能知道。

为了决定下一条指令,Pentium® 4 Pentium M处理器使用分支目标缓冲区(BTB)和分支历史来预测分支的结果。处理器能够正确地预测到大多数分支的结果.  

程序员怎样在代码中减少分支预测的错误的产生呢.一个经常被忽略的办法是通过小的修改使分支更容易被预测。由于下面的代码,函数具有非常糟糕的分支预测率

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

在这个代码中,被&&分隔的每个条件都使用单独的分支指令进行评估。根据随机数值是奇数还是偶数来决定变量t1 t2t30还是1。因此每个变量为01的概率为50%。通过检查t1==0t2==0,和 t3==0 来决定分支是很难预测的。另一方面,如果使用一个分支来代替要实现的3个条件,那么该分支取真的概率为0.125,取假的概率为0.875。这个概率能够导致更好的分支预测概率。通过如下修改的代码,可以更好地利用分支的可预测性。

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

改变代码后,执行相应程序显示分支预测率由74.5%上升到92%,执行时间由原来的12.3秒减少到6.2秒。由于分支预测率的大幅改进,程序的运行的时间减少了50%。

 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值