微体系结构背景
条件跳转指令往往会引起一定的性能损失, 所以要想办法消除它.
一个方法刚才说过了, conditional move, 但它的使用范围有限, 有时候消除不了.
那么消除不了怎么办呢, 就是猜, 我们说过跳还是不跳是个问题, 怎么猜呢, 用 Branch Prediction 技术来猜. 也就是跳转的预测, 跳转预测实际上就引入了一个跳转的一个表来进行预测.
那么怎么个预测法呢, 历史上, 假设你这个地址里面存放的是一个 branch 指令, 我只要跑过一次我就给它记下来了.
怎么记呢, 总的来说就是根据你的历史信息来判断, 你这条指令是跳还是不跳.
Branch Prediction
这表项数是有限的, 它硬件里面做这么个比较大的 buffer 是比较耗费资源和能源的
而且它是依据跳转与否的历史信息来预测, 所以如果条件跳转指令越多, 多到你这个表项里面放不下了, 就影响它的精度.
第二个就是跳转历史信息越碎片化, 越不利于提升预测精度.
随着这个技术的发展, 它采用了一些循环预测器技术 (US, Patent 5909573), 能够对 loop 进行专门的预测, 即对于 "循环入口" 的预测基本为真.
这样的话就没有必要在编译上做优化搞成 jump-to-middile 的形式了, 所以后来又改回 do-while 了.