上一篇已经介绍了流水线的相关和冒险,本篇介绍避免流水线冒险几种技术.

暂停技术(Stalling)避免数据冒险

————

通过上一篇的介绍,PIPELINE的数据冒险只发生在读/取同一个程序寄存器的时候. 只需要在PIPE-(硬件结构图见本系列6)的基础上使用暂停(Stalling)技术来避免数据冒险.下面具体分析暂停技术的暂停条件和实现.

1.暂停条件

源寄存器 - srcA和srcB:当前指令处于Decode阶段.

目标寄存器 - dstE和dstM:处于Excute, Memory和Write Back阶段.

条件 -srcA==dstE or srcA==dstM;srcB==dstE or srcB==dstM

注意:当寄存器的ID=F时,表示没有寄存器,所以也就不需要暂停啦.

2.具体例子

下面看具体的两个例子,来分析暂停技术.

观察Cycle 6, addl指令处于Decode阶段,而%eax还处于Write Back阶段,还没有写回从而导致了数据冒险.当采用暂停技术的PIPELINE的暂停控制逻辑(根据前面的暂停条件)发现了数据冒险,就会在Execute阶段中插入一个气泡(bubble),而addl和halt指令暂停. Cycle 7中暂停条件不在满足,就正常的流水线执行即可.

观察Cycle 4,暂停控制逻辑发现了数据冒险(满足暂停条件),在Execute阶段中插入一个气泡(bubble), addl和halt指令暂停;同理,在Cycle 5和Cycle 6中暂停控制逻辑同样检测出数据冒险,处理方式一样,在Execute阶段中插入一个气泡(bubble), addl和halt指令暂停.直到Cycle 7中发现暂停逻辑不再满足,就执行正常的流水线执行即可.

3.流水线的暂停控制逻辑的实现

前面很早就说过,控制逻辑是一个组合电路,下图就是一个带有暂停控制逻辑的PIPELINE.

图:带有暂停控制逻辑的PIPELINE-.

其实就是在PIPELINE-的基础上,增加了一个暂停控制逻辑(组合电路),它的主要目的就是根据暂停条件发现数据冒险,一点发生数据冒险,就在Execute阶段插入bubble(向一个动态的NOP指令似的),当前指令和后续指令处于暂停状态,然后依次推进.如上图所示,插入bubble发生在Execute阶段;暂停(Stall)发生在Fetch和Decode阶段.

下面是暂停技术的原理示意图.

图:暂停技术的原理示意图(不允许stall和bubble同时为1)

3.暂停控制逻辑的优缺点

优点:简单,容易实现

缺点:数据冒险经常发生,性能不高.

数据转发技术(Data Forwarding)避免数据冒险

————

暂停技术的性能不高,通过观察,我们流水线中只有Execute和Memory这两个阶段产生值,当前指令Decode时可以直接获取其上指令的Execute和Memory阶段产生的值.这种将结果值直接从流水线阶段传到较早阶段的技术称为数据转发(data Forwarding or bypassing).

1.转发源

我们的流水线模型中,只有Execute和Memory会产生值.所以主要有下面几个转发源.

转发源有:

Execute阶段: e_ValE

Memory阶段: M_valE, m_valM

Write Back阶段: W_valE, W_valM

2.示例

观察Cycle 6, addl指令处于Decode阶段,而%eax还处于Write Back阶段,还没有写回从而导致了数据冒险.当采用转发技术的PIPELINE的转发控制逻辑发现了数据冒险,直接将W_valE的值直接转发给valB.

观察Cycle 4,转发控制逻辑发现了数据冒险,直接将M_valE转发给valA,e_valE转发给valB.

3.实现

观察"Sel+FwdA"和"Fwd B"两个控制逻辑,通过使用反馈路径实现了转发控制逻辑.

4.转发技术的局限性

有一类数据冒险不能单纯用转发来解决.那就是加载/使用冒险,这一类数据冒险需要转发技术+暂停技术相结合来解决.

加载/使用冒险的避免

————

1.加载/使用冒险(load/usehazard)示例

单纯的使用转发技术,上述情况会发生数据冒险.观察Cycle 7, addl指令处于Encode阶段,需要%eax的值,但是mrmovl在Cycle 8才会在访存阶段中读出这个寄存器的值.这种由寄存器的值来自存储器而导致结果错误,称为加载/使用冒险.

2.避免加载/使用冒险

对于加载/使用冒险,你可能已经猜到,使用暂停技术来解决(这种方法称为加载互锁,详见上面的暂停技术的原理示意图).

如上图所示,可以使用"加载互锁+转发技术 " 解决所有类型的数据冒险.

3.加载互锁的实现

总结:只有加载互锁会降低流水线的吞吐量,使用"加载互锁+转发技术 "几乎可以实现每个时钟周期发射一条新指令的吞吐量的目标啦~

暂停技术(Stalling)避免预测错误的分支导致控制冒险

————

1.预测错误导致控制冒险的示例(前文已经介绍)

0x000:    xorl %eax,%eax

0x002:    jne t          # Not taken

0x007:    irmovl $1, %eax # Fall through

0x00d:    nop

0x00e:    nop

0x00f:    nop

0x010:    halt

0x011: t:irmovl $3, %edx # Target (Should not execute)

0x017:    irmovl $4, %ecx    # Should not execute

0x01d:    irmovl $5, %edx    # Should not execute

流水线会选择分支,所以开始取跳转目标处的指令.实际上在Cycle 4结束就可以发现预测错误啦.

2.预测错误的触发条件

在Execute阶段末开始计算产生e_Bch的信号,就可以判断是否预测错误了.

3.预测错误的分支导致控制冒险的避免

观察Cycle 4.在Cycle 4快结束前就可以判断出分支预测错误了, PIPELINE的控制逻辑发现了控制冒险,这时候按照下表处理.

Condition

F

D

E

M

W

分支预测错误

normal

bubble

bubble

normal

normal

4.实现

暂停技术可以很容易的解决由分支预测导致的控制冒险.

暂停技术(Stalling)避免ret导致控制冒险

————

1. ret导致控制冒险的示例(前文已经介绍)

前文说过, PIPE不对ret的PC进行预测.所以ret也会导致控制冒险.

例如:

2. ret的触发条件

3. ret导致控制冒险的避免

按照下表处理.

Condition

F

D

E

M

W

ret

normal

bubble

normal

normal

normal

4.实现

小小总结

————

完全可以使用"加载互锁+转发技术"解决所有的数据冒险,同样可以使用"加载互锁"方法解决控制冒险.转发技术不会降低流水线的吞吐量,而加载互锁是通过暂停技术来实现的,所以会降低流水线的吞吐量,但是几乎可以实现每个时钟周期发射一条新指令的吞吐量的目标.

下一篇将详细讨论PIPE各个阶段的实现和流水线的控制逻辑.

reference:

1. 深入理解计算机系统(原书第2版)

(版权所有,转载时请注明作者和出处-dennis_fan-http://blog.csdn.net/dennis_fan

设计一个简易的处理器(8)--流水线冒险的避免相关推荐

  1. Android studio设计一个简易微信界面

    一.设计要求及实现构想 1.设计一个简易微信界面框架,包含至少4个tab页面(我设计的4个分别为message.contact.find.config),要求能实现四个页面之间的点击切换. 2.首先分 ...

  2. 设计一个简易的引导任务框架(2) | 4.23粉丝赠书

    今天是4.23世界读书日,公众号向支持的小伙伴们送出下面3本技术图书(三选一)! 参与方式: 本文点赞留言,必须超过20字,以及你想要的图书名字参与活动 积赞最多的前3名读者,将会获得赠书,三选一 活 ...

  3. c语言课程设计报告-计算器的实现,C语言课程设计--一个简易计算器的设计与实现.doc...

    C语言课程设计--一个简易计算器的设计与实现 扬 州 大 学 ------------------1 程序设计内容:------------------1 课程设计所补充的内容:补充的函数或算法--- ...

  4. 如何使用NE555设计一个简易电子琴

    今天来分享个使用NE555制作一个电子琴. 首先看到音调和频率的关系 NE555电子器的原理就是利用不同的按键使NE555发出不同频率的方波,从而产生不同的音调 NE555产生方波电路如下: 接上喇叭 ...

  5. Winform初学 ---01设计一个简易的浏览器

    1.说明: 最近想利用winform设计一个简易的浏览器.winform自带一个WebBrowser组件,但是WebBrowser具有非常大的局限性,用的是IE的内核,使用该组件打开网址后非常地不美观 ...

  6. Python课程设计,设计一个简易计算器

    在Python课程设计中,设计一个简易计算器,根据课本内容所写 import tkinter import tkinter.messagebox import reroot = tkinter.Tk( ...

  7. 设计一个简易模糊查询输入框(上)

    一般说到"模糊查询"马上广大程序员就想到了SQL模糊查询,那在Android中也有SQLite来实现这个功能,而本次中,我并打算使用这种方法实现,原因就是:麻烦!作为有逼格的程序员 ...

  8. 用C语言设计一个简易的选择题答题系统

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.设计简易的答题系统 二.使用步骤 1.引入库 2.读入数据 总结:应用随机数,getchar以及if else 前 ...

  9. 如何设计一个简易的工单系统

    需求背景 先来看看业务整体结构图 由于当前所在公司是做保险相关业务的,需要对接很多公司,下单的过程中,必须将数据成功传输到保险公司并得到返回才算成功,在这个交互的过程中,很容易因为保险公司系统处于升级 ...

最新文章

  1. python pandas 把数据保存成csv文件,以及读取csv文件获取指定行、指定列数据
  2. 数据结构与算法 / 霍夫曼树、霍夫曼编码和解码
  3. Java / JEE中的有效日志记录–映射的诊断上下文
  4. 【英语学习】【English L06】U03 House L4 How much is the rent?
  5. 原生Ajax实现formdata
  6. ios6.0_6.1_苹果手机_evasion_完美越狱
  7. 在centos安装oracle客户端,centos下安装oracle客户端
  8. 4.4 输入法图片 android,支持安卓4.4!搜狗输入法5.1新版发布
  9. 怎么样抓取微信小程序
  10. 高通WLAN稳定和功耗分析--目前高通项目支持的功耗策略
  11. matlab 安装coder工具包,matlab coder 工具箱使用教程
  12. HDFS_数据加密空间
  13. FFmpeg 视频处理
  14. c++while循环
  15. Firefox火狐浏览器在http下允许通知
  16. 太阳直射点纬度计算公式_离太阳更近应该更热,可为什么海拔上升反而使温度更低...
  17. 207最新android书籍,《最强Android书 架构大剖析》PDF(高清版)
  18. 推推客,拼多多优惠卷带你0投资月入过万
  19. Vue开发实战十八:官网搭建全过程
  20. 中专学计算机室内设计,室内设计专业在中职教育学校中的发展潜力

热门文章

  1. Windows如何定制键盘按键
  2. java网上书店管理系统_基于JAVA的网上书店管理系统的开发.doc
  3. Android运行时权限终极方案,用PermissionX吧
  4. 关于睡眠排序的小尝试
  5. 基于SAML的单点登录介绍
  6. 用Python来绘制自己的个人足迹地图,精确到市级别
  7. Android自定义view文字闪动效果
  8. flarum编辑器预览插件
  9. 视频教程-C语言入门到精通-C/C++
  10. 王者容易怎么开启语音服务器,王者荣耀怎么开语音?王者荣耀语音开启教程