我是靠谱客的博主 现代酸奶,最近开发中收集的这篇文章主要介绍计算机组成原理——流水线冒险的处理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

流水线冒险的处理

|| 结构冒险解决方案

现象:同一部件在同一周期被不同指令所使用
解决:(1)功能划分原则,即一个部件每条指令只能使用一次,且只能在特定时钟周期使用(2)通过设置多个独立的部件来避免硬件资源冲突,比如寄存器读写口分开,指令存储器 IM 和数据存储器 DM 分开。

|| 数据冒险解决方案

现象:后面指令用到前面指令结果时,前面指令的结果还没产生。

在这里插入图片描述
可行的解决办法如下:

1. 插入气泡

在硬件上通过阻塞(stall)方式阻止后续指令执行,延迟到有新值以后!

在这里插入图片描述
缺点是会使电路变得复杂,延迟比较大。

2. 插入空操作指令

由编译器插入三条NOP(No operation)指令,浪费三条指令的时间和空间,好处是相比于方案一来看数据通路比较简单,无需修改。

在这里插入图片描述

3. 采用转发技术

仔细观察我们可以发现,当运算完成后在 Exec/Mem 流水段寄存器中已经存在后面指令可能需要用到的数据,我们可以不等Wr阶段写回寄存器而是在硬件上稍加改动直接将流水段寄存器中的数据送往下一指令的ALU输入端,这种操作称为 转发(Forwarding)或旁路(Bypassing),可以理解为 “抄近道” 了。

在这里插入图片描述
在这里插入图片描述
.
初步得到的转发条件:
.
在这里插入图片描述
在这里插入图片描述
还需要考虑其他一些约束情况
.
在这里插入图片描述

.
得到最终的转发条件:
.
在这里插入图片描述
在这里插入图片描述

4. Load-use 数据冒险的检测和处理

转发能够解决大部分 RAW 数据冒险,那么 lw 指令随后跟 R型指令或I型运算类指令的相关问题能否通过转发来解决呢?不可以!!!

在这里插入图片描述
对于 Load-use 数据冒险,最简单的做法是由编译器在 load 指令之前插入 nop 指令来解决,最好的办法是编译优化,也可以硬件阻塞来处理。

来看硬件阻塞如何实现的???

在这里插入图片描述
在这里插入图片描述
.
.
|| 控制冒险解决方案
.
.
正常情况下,指令在流水线中总是按顺序执行,当遇到改变指令执行顺序的情况时,流水线中指令的正常执行会被阻塞。这种由于发生了指令执行顺序改变而引起的流水线阻塞称为控制冒险(control hazards)。各类转移指令(包括调用、返回指令)的执行,以及异常和中断的出现都会改变指令执行顺序,因而都可能会引发控制冒险。

1. 转移指令引起的控制冒险

在这里插入图片描述
通常把由于流水线阻塞而带来的延迟执行周期称为延迟损失时间片C,图中 C=3。由于指令分支而引起的控制冒险也称为分支冒险(branch hazard),对于分支冒险,假设时间损失时间片为C,当检测到分支指令时,就在其后插入C个气泡或者在编译时在分支指令后填入C条nop。但这两种方式都是消极的方式,效率极低,结合分支预测可以降低带来的时间损失,分支预测有简单(静态)预测和动态预测两种。此外,还有延迟分支也可以部分解决分支冒险问题。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
.
手绘出一张具有处理转发,load-use阻塞,控制冒险的流水线详细图

在这里插入图片描述
.
2. 异常或中断引起的控制冒险

最后

以上就是现代酸奶为你收集整理的计算机组成原理——流水线冒险的处理的全部内容,希望文章能够帮你解决计算机组成原理——流水线冒险的处理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部