视频链接,老师讲的特别好
1.资源冲突
1.1 简述
多条指令进入流水线后在同一机器时钟周期内争用同一个功能部件所发生的冲突
如,上图的I1和I4在第4时钟周期分别访存、取指,若在冯诺伊曼的结构中,指令和数据存放在同一个存储器中,会产生争用。
1.2 解决方法
(1) 前一 指令访存时,使后一 条相关指令(以及其后续指令)暂停一 个时钟周期。
(2) 单独设置数据存储器和指令存储器(哈弗结构),使两项操作各自在不同的存储器中进行,这属于资源重复配置。
2.数据相关
2.1 简述
数据相关指在一个程序中,存在必须等前一条指令执行完才能执行后一条指令的情况,则这两条指令即为数据相关。当多条指令重叠处理时就会发生冲突,解决的办法有以下两种:
三种数据相关RAW/WAR/WAW
2.2 解决方法
2.2.1 RAW
解决办法
设置相关专用通路,即不等前一条指令把计算结果写回寄存器组,下一条指令也不再读 寄存器组, 而是直接把前一 条指令的 ALU 的计算结果作为自己的输入数据开始计算过程,使本 来需要暂停的操作变得可以继续执行,称为数据旁路技术(向前技术fowarding)。
如上图 (ADD,3)执行的结果直接给到(SUB,4)执行阶段,无需暂停
2.2.2 WAR
如上,指令4和指令3在R3上存在WAR
1.固定的流水线不易产生冲突(所有指令都分为5个阶段),但存在1种情况,如果访存速度较慢,如STA指令的第4、5、6周期都在访存,将会导致冲突
2.不固定的流水线将容易导致WAR冲突,如下对简单指令I4,删掉 MEM 和WB阶段,会产生冲突
解决方法
固定指令的阶段数/寄存器重命名提高访存速度/通过编译器对数据相关的指令编译优化的方法,调整指令顺序来解决数据相关。
2.2.3 WAW
乘法数据执行时间长,造成写后写冲突
(1)把遇到数据相关的指令及其后续指令都暂停 一至 几个时钟周期,直到数据相关问题消失 后再继续执行,可分为硬件阻塞(sta ll) 和软件插入“ NOP ”指令两种方法。
(2)寄存器重命名
(3) 通过编译器对数据相关的指令编译优化的方法,调整指令顺序来解决数据相 关。
为什么寄存器重命名能消除WAW/WAR
我们将WAW和WAR统称为名称依赖,(区别于RAW这样有数据流动的真数据依赖,名称依赖是因为共用同一个寄存器)
很容易想到的是,我们将同一个寄存器进行重命名,对寄存器进行操作时先对别名进行操作。
举例:
存在的真数据依赖(RAW):fadd.d 和 fdiv.d 在寄存器 f0 上冲突;fadd.d 和 fsd 在寄存器f6有冲突;fsub.d 和 fmul.d 在 f8上冲突。
存在的名称依赖(WAR/WAW):
反依赖(WAR):add.d和fsub.d之间(f8),以及fsd和fmul .d之间(f6)
输出依赖(WAW):fadd.d和fmul .d 之间(f6)
这3个名称依赖都可以通过寄存器重命名来消除。为简便起见,假定存在两个临时寄存器: S和T。利用S和T,可以对这一序列进行改写,使其没有任何名称依赖,如下所示:
此外,对f8的任何后续使用都必须用寄存器T来代替。在这个示例中,由编译器静态完成这 一重命名过程。要在后续代码中找出所有使用f8的地方,需要采用高级编译器分析或硬件支持, 这是因为上述代码段与后面使用f8的位置之间可能存在干扰的分支。我们将会看到,Tomasulo 算法可以处理跨越分支的重命名问题。
3.控制相关
当流水线遇到转移指令和其他改变 PC 值的指令而造成断流时,会引起控制相关。
当执行转移指令时,根据转移条件的的产生结果,才知道跳转的地址(可能下一条指令/新的目标地址)
如图,在第1条指令EX时,若需要跳转,已经IF、ID的指令2和已经IF的指令3需要清空,断流
解决的办法有以下几种:
1)延迟转移
2)对转移指令进行分支预测,尽早生成转移目标地址。分支预测分为简单(静态)预测和 动态预测。静态预测总是预测条件不满足,继续执行分支指令的后续指令。动态预测根据程序 执行的历史情况,进行动态预测调整,有较高的预测准确率。
2.1)硬件:动态预测
举例:100次for循环,原先需要清空100次,动态预测法后只需要清空2次
2.2)软件:静态预测
利用先前运行过程收集的特征数据。(人们观测到分支的行为特性往往两极化分布;也就是说,各个分支经常严重偏向 于选中或未选中两种情景之一)使用相同 输入数据来运行程序,以收集特征数据;其他研究表明,改变输入以使特征数据适用于不同的 运行,只会使基于特征数据的预测准确率发生微小变化。
如编译器判断 if 条件分支 静态不跳转