相关
- 相关是导致流水线冲突的主要原因。
- 相关
- 两条指令之间存在某种依赖关系。
- 如果两条指令相关,则他们就有可能不能在流水线中重叠执行或者只能部分重叠执行。
- 三类相关有:数据相关(真数据相关)、名相关、控制相关
数据相关
对于两条指令i (前一条指令)和 j (后一条指令),如果在以下条件之一成立,则称指令j和指令i数据相关。
- 指令j 使用指令i 产生的结果
- 指令j 与指令k 数据相关,指令k 又与指令i数据相关。
数据相关特点
- 具有传递性
- 反映了数据的流动关系,即如何从其产生者流动到其消费者
实例:
存在数据相关的指令:
- L.D与ADD.D的数据相关(L.D指令将访存结果写入F0,而ADD.D需要使用L.D的访存结果)
- ADD.D与S.D的数据相关(ADD.D将计算结果写入F4,而S.D需要使用ADD.D的计算结果写入存储器)
- S.D与DADDIU的数据相关(前者修改R1的值,后者使用R1的值作为分支条件)
数据相关检测
- 当数据的流动是经过寄存器时,相关的检测比较直观和容易。
- 当数据的流动是经过存储器时,检测比较复杂。
(原因:1. 相同形式的地址其有效地址未必相同。2. 形式不同的地址其有效地址可能相同)
名相关
名:
- 指令访问的寄存器或存储器单元的名称(例:R5,0x00001000等)
名相关:
- 如果两条指令使用相同的名,但是它们之间并没有数据流动,则称这两条指令存在名相关。
细分:
- 反相关
如果指令j 写的名与指令i 读的名相同,则称指令i 和j 发生了反相关。
实例:
- 输出相关
如果指令j 和指令i 写相同的名,则称指令i 和j 发生了输出相关
实例:
名相关的特点
- 名相关的两条指令之间没有数据的传递。
- 如果一条指令中的名改变了,并不影响另外一条指令的执行。
消除名相关的方法:换名技术(通过改变指令中操作数的名来消除名相关)
例:对于寄存器操作数进行换名称为寄存器换名。
- 既可以用编译器静态实现,也可以用硬件动态完成。
实例:
控制相关
①控制相关是指由分支指令引起的相关
②为了保证程序应有的执行顺序,必须严格按控制相关确定的顺序执行
控制相关实例:
- 这里不能把s 移到if 语句的then 之后