相关与冲突
相关
概念
- 相关
- 两条指令之间存在某种依赖关系。
- 如果两条指令相关,则它们就有可能不能在流水线中重叠执行或者只能部分重叠执行
- 三类相关
- 数据相关(也称真数据相关)
- 名相关
- 控制相关
数据相关
-
对于两条指令i(在前,下同)和j(在后,下同),如果下述条件之一成立,则称指令j与指令i数据相关。
- 指令j使用指令i产生的结果;
- 指令j与指令k数据相关,而指令k又与指令i数据相关。
-
数据相关特点
- 数据相关具有传递性。
- 数据相关反映了数据的流动关系,即如何从其产生者流动到其消费者。
-
数据相关实例
-
数据相关检测
- 当数据的流动是经过寄存器时,相关的检测比较直观和容易。
- 当数据的流动是经过存储器时,检测比较复杂。
- 相同形式的地址其有效地址未必相同;
- 形式不同的地址其有效地址却可能相同
名相关(实际就是第二条指令是写)
-
名
- 指令所访问的寄存器或存储器单元的名称
- 例如,R4,0x10000000等
-
名相关
- 如果两条指令使用相同的名,但是它们之间并没有数据流动,则称这两条指令存在名相关
-
细分
- 反相关
- 如果指令j写的名与指令i读的名相同,则称指令i和j发生了反相关。
- 指令j 写的名=指令i 读的名
- 输出相关
- 如果指令j和指令i写相同的名,则称指令i和j发生了输出相关
- 指令j写的名=指令i写的名
- 反相关
-
解决方案
-
名相关特点
- 名相关的两条指令之间并没有数据的传送。
- 如果一条指令中的名改变了,并不影响另外一条指令的执行。
- 消除名相关的方法:换名技术
- 换名技术:通过改变指令中操作数的名来消除名相关。
- 对于寄存器操作数进行换名称为寄存器换名:既可以用编译器静态实现,也可以用硬件动态完成。
控制相关
- 控制相关是指由分支指令引起的相关。
- 为了保证程序应有的执行顺序,必须严格按控制相关确定的顺序执行。
流水线冲突
定义
- 流水线冲突是指对于具体的流水线来说,由于相关等原因的存在使得指令流中的下一条指令不能在指定的时钟周期执行。
- 流水线冲突分类
- 结构冲突:因硬件资源满足不了指令重叠执行的要求而发生的冲突。
- 数据冲突:当指令在流水线中重叠执行时,因需要用到前面指令的执行结果而发生的冲突。
- 控制冲突:流水线遇到分支指令和其它会改变PC值的指令所引起的冲突。
问题与基本解决方法
- 问题
- 导致错误的执行结果。
- 流水线可能会出现停顿,从而降低流水线的效率和实际的加速比。
- 基本解决方法
- 暂停部分指令执行:当一条指令被暂停时,在该暂停指令之后流出的所有指令都要被暂停,而在该暂停指令之前流出的指令则继续进行(否则就永远无法消除冲突)。
结构冲突
![](https://img-blog.csdnimg.cn/20201225153228569.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzNDYwNw==,size_16,color_FFFFFF,t_70)
定义
- 在流水线处理机中,为了能够使各种组合的指令都能顺利地重叠执行,需要对功能部件进行流水或重复设置资源。
- 如果某种指令组合因为资源冲突而不能正常执行,则称该处理机有结构冲突。
- 常见的导致结构冲突的原因:
- 功能部件不是完全流水
- 资源份数不够
解决方法
-
插入暂停周期
- 为消除结构冲突而插入的流水线气泡
-
设置相互独立的存储器,使之分别存储指令与数据
有时流水线设计者允许结构冲突的存在
- 主要原因:减少硬件成本
- 如果把流水线中的所有功能单元完全流水化,或者重复设置足够份数,那么所花费的成本将相当高
数据冲突
定义
- 当相关的指令靠得足够近时,它们在流水线中的重叠执行或者重新排序会改变指令读/写操作数的顺序,使之不同于它们串行执行时的顺序,则发生了数据冲突。
- 结果:操作的内容是错误的
分类
- 读后写冲突(RAW)
- 最常见的一种数据冲突,对应于真数据相关。
- 发生条件
- 有两条指令i和j,i在j之前进入流水线
- 在 i 写入之前,j 先去读
- 写后写冲突(WAW)
- 对应于输出相关。
- 发生条件:
- 流水线中不只一个段可以进行写操作,且指令被重新排序了
- 有两条指令i和j,i在j之前进入流水线
- 在 i 写入之前,j 先写。
- 写后读冲突(WAR)
- 反相关
- 发生条件
- 有些指令的写结果操作提前了,而且有些指令的读操作滞后了;或是指令被重新排序了。
- 有两条指令i和j,i在j之前进入流水线。在 i 读取之前,j 先写入。
解决方案
-
定向
-
通过定向(旁路、短路)技术减少数据冲突引起的停顿
-
关键思想
- 在计算结果尚未出来之前,后面等待使用该结果的指令并不真正立即需要该计算结果,如果能够将该计算结果从其产生的地方直接送到其它指令需要它的地方,那么就可以避免停顿。
-
作用范围
-
并不能解决所有数据冲突
-
-
-
指令调度
- 让编译器重新组织指令顺序来消除冲突(中间增加其他操作,消耗掉等待的延时)
控制冲突
定义
- 执行分支指令的结果有两种
- 分支成功:PC值改变为分支转移的目标地址。在条件判定和转移地址计算都完成后,才改变PC值。
- 不成功或者失败:PC的值保持正常递增,指向顺序的下一条指令。
- 控制冲突
- 分支延迟:分支指令引起的延迟
- 最简单的处理方法
- “冻结”或者“排空”流水线
- 前述5段流水线中,改变PC值是在MEM段进行的。给流水线带来了3个时钟周期的延迟
延迟分支
-
方法
- 从逻辑上“延长”分支指令的执行时间。把延迟分支看成是由原来的分支指令和若干个延迟槽构成,不管分支是否成功,都要按顺序执行延迟槽中的指令。
-
效果
- 无论分支成功还是失败都能够减少(掩盖)一个时钟周期的延迟
-
示例:无论是分支成功,还是分支失败,都能起效
-
延迟槽指令调度
-
要点
- 在延迟槽中放入有用的指令,由编译器完成。能否带来好处取决于编译器能否把有用的指令调度到延迟槽中。
-
三个子类
- 从前调度
- 从目标处调度
- 从失败处调度
-
-
局限性与进一步改进
- 分支延迟受到两个方面的限制
- 在延迟槽中放入有用的指令,由编译器完成。
- 能否带来好处取决于编译器能否把有用的指令调度到延迟槽中。
- 进一步改进:分支取消机制(处理预测错误的情况)
- 当分支的实际执行方向和事先所预测的一样时,执行分支延迟槽中的指令,否则就将分支延迟槽中的指令转化成一个空操作。
- 分支延迟受到两个方面的限制
分支取消
-
例子:预测错误后的取消与预测正确的情况
-
效果
- 如果预测成功:相当于白取了失败分支的指令,和空操作一个效果
- 如果预测失败,那么节省了一个时钟周期