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

暂停技术(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. springMVC--(讲解3)数据处理
  2. 如何跟踪session
  3. Linux文本查看命令之touch
  4. 【bfs】重力球(luogu 7473/NOI Online 2021 普及组 T3)
  5. java字符串底层实现_「JAVA」细述合理创建字符串,分析字符串的底层存储,你不该错过...
  6. c语言中 %.2s,C2S是什么意思
  7. C和C++实务精选丛书
  8. 机器人softmove_ABB 工业机器人 SoftMove功能介绍
  9. python封装sql脚本_flask-sqlalchemy如何使用原生的sql语句然后封装?
  10. 世界杯座位选择顺序总数
  11. 金融账务体系业务知识——汇总
  12. Python+Wind:用 Pyautogui 轻松下载 Wind 数据
  13. 用php远程获取MySQL到本地,mysql本地从远程数据库导数据_MySQL
  14. J1939广播DM1报文
  15. 关于H无穷鲁棒控制算法实现条件及广义矩阵P的子矩阵的构建规则
  16. 当耐克用上了AI、AR技术,你的鞋也要放飞自我了?Just Do It !
  17. js 输出为underfined
  18. Java+控制台 商城销售系统
  19. PHP日活10万,小程序日活超4亿,近10万商家开通直播,私域红利已来 !
  20. b区计算机专业调剂容易的学校,2021考研b区容易调剂的学校有哪些

热门文章

  1. uniapp离线打包具体步骤
  2. 外挂辅助技术研究-完善选怪功能
  3. 老毛桃PE修改IE主页
  4. [JS 文件编译错误] 以下文件体积超过 500KB,已跳过压缩以及 ES6 转 ES5 的处理。ec-canvas/echarts.js
  5. rasa、rasa-webchat 安装使用记录
  6. 举例理解transformer中的位置编码
  7. Modbus通信协议详解
  8. tomcat8日志乱码_Tomcat日志中文乱码怎么解决?
  9. 生物素标记试剂1869922-24-6,Alkyne-PEG3-Biotin PC,炔烃PEG3生物素PC
  10. 云栖大会首设“科技脱贫”专场 ,20张会场门票等你来拿!