下面是一个小节实例
3.3 流水线的相关与冲突
3.3.2 相关与流水线冲突
重要知识点组织如下:
| 相关 | 数据相关 |
|
|
| 名相关 | 反相关 | 寄存器换名 |
| 输出相关 |
| 控制相关 |
|
|
| 流水线冲突 | 结构冲突 | 产生原因 |
|
| 流水线气泡 |
|
| 数据冲突 | 产生原因 |
|
| 写后读 | 定向技术(三种可定向情况) |
| 流水线互锁 |
| 编译器静态调度 |
| 读后写 |
|
| 写后写 |
|
| 控制冲突 | 冻结或者排空 |
|
| 改造流水线 |
|
| 预测分支失败 |
|
| 预测分支成功 |
|
| 延迟分支 | 从前调度 |
| 从目标处调度 |
| 从失败处调度 |
首先要注意,相关是导致流水线冲突的原因,但是相关是指令间的静态属性,存在相关的指令不一定会导致流水线冲突。
相关的定义就是: 两条指令之间存在某种依赖关系。
数据相关。
把握要点:
(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: