2.2.2 章节实例展示(3.3节)

下面是一个小节实例


3.3 流水线的相关与冲突

3.3.2 相关与流水线冲突

重要知识点组织如下:

                                                                                 

 

相关

 
 

数据相关

 


 

名相关

 
 

反相关

 
 

寄存器换名

 
 

输出相关

 
 

控制相关

 


 

流水线冲突

 
 

结构冲突

 
 

产生原因

 

 

流水线气泡

 

 

数据冲突

 
 

产生原因

 

 

写后读

 
 

定向技术(三种可定向情况)

 
 

流水线互锁

 
 

编译器静态调度

 
 

读后写

 

 

写后写

 

 

控制冲突

 
 

冻结或者排空

 

 

改造流水线

 

 

预测分支失败

 

 

预测分支成功

 

 

延迟分支

 
 

从前调度

 
 

从目标处调度

 
 

从失败处调度

 


    首先要注意,相关是导致流水线冲突的原因,但是相关是指令间的静态属性,存在相关的指令不一定会导致流水线冲突。

 相关的定义就是: 两条指令之间存在某种依赖关系。


  1. 数据相关。


把握要点:

(1)数据相关反应数据的流动关系;

(2)当数据的流动是经过寄存器的,相关的检测比较直观和容易,比如下面这个例子:

       L.D     F0,0(R1)  // F0为数组元素

       ADD.D   F4,F0,F2

 只要判断LD指令的 rt 字段是否和 ADD指令的 rs或者rt字段一致就可以了。

 但是,如果数据流动是经过存储器的,就比较麻烦了,因为load和store指令有效地址的计算方法都是Regs[rs] + immediate,不经过EX阶段,是计算不出来的。比如下面这个例子:

     SD  R1,300(R5)

     LD  R2,200(R3)

 Regs[R5] +300 很可能等于 Regs[R3]+200,也就是他们访问的是同一存储单元,这两条指令数据相关。


请看视频讲解:



2. 名相关。

把握要点:

(1)没有数据流关系,仅仅是使用了相同的寄存器。

(2)可使用寄存器换名技术消除。

请看视频讲解:



3. 控制相关:

把握要点:

(1)由控制指令引起的。

(2)控制相关的指令,指令调度要当心。

请看视频讲解:



4. 流水线冲突:

注意有个约定: 当一条指令被暂停时,该暂停指令之后流出的所有指令都被暂停,而在暂停之前流出的指令则继续进行。

请看视频讲解:



5. 结构冲突:

问题:如何解决结构冲突? 

请看视频讲解:



6. 数据冲突:

把握要点:读后写和写后写冲突在静态MIPS五段流水线中不可能发生;

请看视频讲解:



7. 定向和停顿:

把握要点:

    定向技术(也就是旁路),注意:

     (1)三种情况可定向;

     (2)自己写一下定向的检测条件;

     (3)什么样的情况不能定向?怎么解决?

请看视频讲解:



8. 编译器调度:

请看视频讲解:



9. 控制冲突:

请看视频讲解:



10. 预测分支失败和预测分支成功:

请看视频讲解:



11. 延迟分支之一

请看视频讲解:


12. 延迟分支之二

请看视频讲解:



本小节PPT: