答:有四种处理控制冒险的方法:
(1)通过编译器在分支指令后面加入空指令(nop)。这种方法相当于没有做任何积极的处理,将大大降低指令执行的效率。
(2)阻塞(stall):通过硬件来阻止分支指令后面若干条指令的执行直到条件测试结束。
(3)预测(predict):可以有简单(静态)预测和动态预测两种。简单预测就是每次预测结果都一样,总是预测条件满足(Branch
taken)或不满足(Branch not
taken),这种方式没有什么额外开销,但预测成功率只有大约50%左右。动态预测就是根据分支指令执行的历史记录来进行预测,每次预测的结果可能不同,这种预测能达到90%以上的成功率。
(4)延迟分支(delayed
branch):将前面一条与分支指令没有关系的指令放到分支指令后面执行,这样,使得分支指令在进行条件判断时取出后面的无关指令执行,到测试结果出来后,就可以转移到正确的分支目标指令执行,流水线不会发生阻塞现象。这种对指令进行顺序调整的工作在程序编译阶段完成。 |