控制冒险最简单的解决方法是,在译码阶段检测到当前执行的是分支指令时,采用上一小节中的流水线暂停方法,将分支指令后续的指令暂时冻结,直到分支跳转的方向以及目标地址被确定。此法的优点是其简单性,缺点是造成了流水线性能的损失。
为了尽可能保持流水线的性能,一种思路是参考乱序执行的做法,在分支指令后方插入若干条无关指令,使得流水线的所有阶段始终处于工作状态,被插入的指令称为分支延迟槽指令;另一种思路是在分支结果产生之前,预测其可能的跳转方向和跳转目标地址,然后提前执行分支目标处的指令。
分支延迟槽一定程度上降低了汇编程序的可读性。此外,随着流水线深度的增加,延迟槽的实现也变得更加复杂,但其带来的性能提升较为有限。为了简化设计和节省芯片面积,RISC-V ISA没有设置分支延迟槽,而是直接通过分支预测解决控制冒险问题。
1. 静态预测方法
最简单的静态分支预测方法是预测分支指令总是跳转,或预测总是不跳转。显然,使用这种方法对不同的程序进行分支预测时,预测准确率会有很大差异。一种改进的预测方法是若分支指令是往回跳的就预测跳转,否则预测不跳转,这种方法对单循环的预测效果较好。
静态分支预测的优点是实现简单、硬件开销较小、预测速度较快,但预测准确度相对较低,不能满足通用处理器对