流水线冲突
流水线冲突:由于相关等原因的存在,使得指令流中的吓一跳指令不能在指定的时钟周期执行。
分类
- 结构冲突:因硬件资源满足不了指令重叠执行的要求而发生的冲突。
- 数据冲突:当指令在流水线中重叠执行时,因需要用到前面指令的执行结果而发生的重发。
- 控制冲突:流水线遇到分支指令和其他会改变PC值的指令所引起的冲突。
解决流水线冲突的基本方法是暂停部分指令执行。
结构冲突:某种指令组合因为资源冲突而不能正常执行
常见的导致结构冲突的原因:1. 功能部件不是完全流水。2.资源份数不够。
- 一般解决方法:
① 通过拉开两条冲突指令在流水线之间的距离来避免冲突的发生的。
② 通过设置相互独立的存储器(分别存储指令和数据)
原理:通过增加资源数量,来避免访同一资源导致的冲突。
数据冲突:当相关的指令靠得足够近时-重叠执行、重新排序会导致指令的读写操作数的顺序。
可分为三个子类:写后读冲突、写后写冲突、读后写冲突
读后写冲突:
而对于写后写冲突、读后写冲突
可用反相关与输出相关的解决方法:换名技术,来避免这两种相关的出现,也就能避免读后写、写后写冲突的发生。
着重解决读后写
定向技术是一种缓解数据冲突(介绍冲突引起的停顿时间)的典型方法。
但定向技术并不能解决所有数据冲突。
定向:是基于硬件的运行时解决方案。
指令调度:通过让编译器重新组织指令顺序来消除冲突。
定向技术的关键思想是在计算结构尚未出来之前,后面等待使用该结果的指令并不真正立即需要该计算结果。如果能够将该计算结果从其产生的地方直接送到其他指令需要它的地方。这样,就可以避免停顿。
控制冲突:由分支指令引起的指令延迟。
- 最简单的解决方法:冻结或排空流水线。
- 控制冲突的改善 基于编译器的软件方法:① 总是预测分支失败 ② 预测分支总是成功 ③ 延迟分支