流水线冒险
流水线在正常执行的过程中遇到突发情况无法正确执行后续指令导致流水线阻塞或者停顿。
结构冒险(资源冒险)
引发原因
多条指令竞争硬件资源。
解决办法
- 加入若干空指令(空周期)
- 单独设置数据存储器和指令存储器,使得数据和指令的操作可以并行(增加硬件)。
数据冒险(重要、常考)
引发原因
- 写后读(RAW)
- 读后写(WAR)
- 写后写(WAW)
为什么没有读后读呢?可以看出,数据冒险的出现是由于脏数据的存在,即上一条的数据还未保存,下一条数据就读走了。读后读不会有脏数据的问题,故不会产生数据冒险。
解决办法(常考)
- 加入若干空指令
- 设置专用数据通路(增加硬件资源)
- 编译器对可能发生的数据冒险指令进行优化
数据冒险是常考点,文章末尾会有真题溯源
控制冒险
引发原因
- 指令一般是靠PC进行顺序执行,但是当某条转移指令修改PC值之后,未将PC的值修改回原值,就会造成原来运行的程序无法继续运行。
- 条件转移指令
解决办法
- 对转移指令进行分支预测
- 预取转移成功和转移不成功两个方向的目标指令
- 加快和提前形成条件码[1]
- 提高转移方向的猜准率
[1] 条件码是CPU根据运算结果由硬件设置的位,体现当前指令执行结果的各种状态信息。
重点知识点辨析
- 在解决方法中,添加若干空指令是通用的,可以解决上面所有的数据冒险