现代处理器最常用的解决控制冒险的方法就是分支预测法(Branch Prediction).
在2018年年初Intel承认的"Meltdown"漏洞就和"分支预测"紧密相关。
Meltdown漏洞相关报道
上述报道中对Meltdown漏洞生动的诠释:
赵晓峰打比方说:“我拿着假的录取通知书去拿宿舍钥匙,我虽然会被发现是假冒的,但是在这一过程中,我会发现相应学号对应的相应宿舍。这样,我就能推测出不同专业的学生住在哪了。”
分支预测需要解决的三个核心问题:
(1)是否为跳转指令
(2)是否会跳转
(3)跳转目标地址
MIPS的Branch指令类型:
指令类型 | 指令示例 | 跳转可能性 | 跳转目标地址 |
---|---|---|---|
条件跳转 | beq | 不确定 | 要执行后才能确定 |
无条件跳转 | j | 一定 | 立即数,译码阶段可以计算 |
调用 | jal | 一定 | 立即数,译码阶段可以计算 |
返回 | jr | 一定 | 由call存储的$ra内部值决定 |
间接跳转 | jr | 一定 | 由依赖的寄存器内部值决定 |
jal 和 j 指令可以在译码阶段确定跳转地址,有利于分支预测,其他的需要寄存器访问和指令执行后才能得到跳转信息。
-如果不做分支预测,那么流水线的下一条指令需要stall相应周期,等待跳转信息确定才能继续执行。
-如果分支预测错误,那么流水线需要flush(冲刷)取错的指令,也会浪费时钟周期和计算资源。