之前说过,目前影响流水线
主要的冲突有:
资源冲突(结构相关),数据冲突(重点),控制冲突。
结构相关
多条指令进入流水线后,在同一始终周期内争用同一功能部件。这种冲突的通常解决方式为:
- 前一个指令访存的时候,后一个指令暂停一个时钟周期(拖慢一拍),再执行。
- 增设一个功能部件
数据相关
后续的指令需要的操作数,要等到前面的指令执行完成后并保存结果后才能获得。
数据相关主要分为三种情况:
- RAW(读后写)
- WAW(写后写)
- WAR(写后读)
第一种情况,后面的指令需要使用到前面的所写的数据,但是前面还没来得及写入,下一条指令就已经向内存读取了数据(此时由于新数据没有写入此内存地址,于是读的是旧数据),出现读后写。
第二种情况,两个指令同写一个单元,写的先后次序颠倒
第三钟情况,这种情况与第一种情况恰好相反,原本需要先读取数据再写入,但是现在是先写入后,再读取相应的数据,也就是现在是本应该读取旧数据,现在却读取了新的数据。
常见的数据冲突具体实例看下图:
通常我们的解决方式为:
- 将遇到数据相关的指令以及后续指令,都暂停1到n个周期,直到数据相关问题消失后再执行:
- 设置专用的通路,当数据发生数据相关的时候,第2条指令的操作数直接从数据处理部件读取而不需要等数据存入再读(这种技术又称数据旁路技术):
结构相关
当流水线遇到转移指令和其他改变PC值的指令而造成断流时候,则会引起控制相关:
通常的解决办法是:机器先选定转移分支中的一个继续执行,待条件码生成后,判断选择是否正确,若正确则流水线继续执行,否则返回分支处重新处理。
注意,Cache的缺失也会因此流水线阻塞。
在流水线操作中,时钟周期应该按所有步骤中所需时间最长的步骤考虑,以保证所有操作可以正确被执行。
典型例题
下面看一道例题:
现在有4级流水线,分别完成 取指,译码取数,运算,回写 共4步。完成时间依次为 100ns,100ns,80ns,50ns,问:
- 流水线的操作周期T应该设置为多少?
- 相邻两条指令是否会发生数据相关?若不采用硬件改造,第二条指令应该推迟多长时间?如果采用硬件改造,则需要推迟多长时间?
解答:
第一问,在流水线操作中,时钟周期应该按所有步骤中所需时间最长的步骤考虑,所以是T= 100ns
第二问,如下图,显然在运算时不能进行取数,而且在回写的时候,不能运算。因此存在数据冲突。
如果不采用硬件改造,那么发生冲突的时候,第二条指令就要暂停等待,于是就有下图:
后退两个周期,那么第一问就回答了周期应该是100ns,所以延时 2 x 100ns = 200ns。
如果采用硬件改造,那么回写跟运算可以同时进行,也就是:
此时也就是后退了一个周期,100ns