chapter6——流水线的艺术

news2024/11/14 13:24:42

目录

  • 1.影响最大时钟频率的因素
  • 2.流水线
  • 3.DLX指令集的实现
  • 4.流水线对吞吐率的影响
  • 5.流水线原理
  • 6.流水线冒险
    • 结构冒险
    • 数据冒险
    • 控制冒险
    • 其他冒险

对高速ASIC日益增长的需求使得越来越需要增加电路每个时钟周期的计算吞吐率。可以通过流水线提高ASIC在这方面的性能,但是也会带来系统延迟和面积的增加。

流水线通过在较长的组合逻辑路径中插入寄存器降低了组合逻辑的延迟,从而增加了时钟频率并提高了性能。

1.影响最大时钟频率的因素

时钟频率是数据流入系统后在输出端出现的速率。有许多因素都会影响流水线系统的最大时钟频率。

  • 时钟偏移

在实际电路中,由于存在线路上的传播延迟,两个寄存器的时钟输入可能会有一些延迟。这些传播延迟中的微小差别,会发生在复杂数字产品的整个时钟网络上,最后会对整个系统时序产生无法接受的影响,这种现象也称为“时钟偏移”。

在相邻两个寄存器的时钟延迟大于这两个寄存器之间的数据路径延迟时,就会产生负时钟偏移。在这种情况下,先到的时钟会引起竞争条件。即,在数据还未成功锁存时时钟就触发了寄存器。时钟偏移倾向于增加电路所能承受的最大时钟频率。

  • 时钟抖动

到达电路中某一点的连续时钟边沿之间间隔的变化称为时钟抖动,时钟抖动会影响时钟的占空比。

2.流水线

流水线使用存储器将时钟周期内关键路径(最大组合延迟的路径)分割开来。这减少了关键路径上各阶段延迟并使电路能以更高频率工作。流水线电路增加了各时钟阶段的计算能力,但是由于使用了存储器单元也增加了负载。

将电路并行化对功耗和面积的影响都很大。一般来说,使用并行电路进行同样的k次操作,比重复使用某一逻辑k次达到同样的效果在功耗和面积方面的开支更大,因为使用了更多的触发器和额外逻辑,导致了更多的连线。

3.DLX指令集的实现

DLX是新兴学院派标准结构的理论32位RISC位处理器。每条DLX指令最多由5个部分组成。
指令获取、指令解码、执行/有效地址周期、存储器访问、写回操作
未插入流水线的实现方式并不能达到最经济和最高的性能,所以很自然会使用流水线设计实现。

  • 指令获取(IF)

操作:
1)从存储器中获取指令(用PC指针)并放入指令寄存器(IR)。
2)IR保存下个时钟周期所需指令。
3)PC值递增4,指向下一个指令地址。

  • 指令解码/寄存器获取(ID)

操作:
1)分析IR中的指令并访问寄存器堆以读取寄存器。
2)将通用寄存器的输出读入两个临时寄存器A和B供以后使用。
3)IR的高16位经过符号扩展保存到临时寄存器IMM中供以后使用。
4)由于指令格式是固定的,因此读寄存器和解码可以并行进行。这称为固定域译码。

  • 执行/有效地址周期(EX)

ALU对上一个时钟周期准备好的操作数进行操作,根据DLX指令的类型执行下面4个功能中的一个:
1)访问存储器:ALU通过加法运算形成有效地址,并将结果放入寄存器ALUoutput。
2)寄存器—寄存器ALU指令:ALU根据操作码对寄存器A和寄存器B中的数值进行操作,把结果放在临时寄存器ALUoutput中。
3)寄存器—立即数ALU指令:ALU根据操作码对寄存器A和寄存器IMM中存放的值进行操作,把结果放入临时寄存器ALUoutput中。
4)分支指令:ALU将NPC和IMM中的带符号立即数相加,计算出分支的目标地址;检查寄存器A(在前一个周期读取)的值来决定是否进行分支。

  • 访问存储器/分支完成周期(MEM)

1)访问存储器:如果指令为载入操作,则把从存储器中返回的数值存入LMD寄存器中;如果指令为存储,则将寄存器B的值写入存储器。
2)分支:如果指令分支,就用ALUoutput寄存器中的分支目标地址替代PC中的值,否则用NPC寄存器中递增的值替代PC中的值。

  • 写回周期(WB)

将结果写回到寄存器堆中,结果可能来自于存储器(LMD)或来自于ALU(ALUoutput)。

下图是无流水线时DLX数据通路上的五个步骤:
在这里插入图片描述
这里无法并行执行指令,只有在第一条指令执行完成后才开始执行第二条指令。

这种情况下执行一条指令需要8ns,指令按照顺序一条接一条执行,所以4条指令的集合需要8x4=32ns才能执行完,如下。
在这里插入图片描述

4.流水线对吞吐率的影响

对上节的电路加以改造,对5级操作中的每个都加上一个流水线阶段(即在每个阶段加入一组寄存器),修改后的新流水线电路如下所示:
在这里插入图片描述
在原始单周期DLX数据通路中,指令无法并行执行,所以只有在前一条指令执行完成后才能处理新的指令。所以假设单周期时钟周期是10ns,依次执行5条指令所用时间为5x10ns=50ns。

而对于多周期数据通路,此时每条指令需要5个时钟周期完成,但每个周期只需2ns。现在如果5条指令像在单周期数据通路中那样连续执行,将花费5x5x2=50ns(即5条指令每条花费5个时钟周期,每个时钟周期为2ns)。

然而,对于流水线模式中同样的数据通路,只需9个时钟周期就可以执行完5条指令,也就是说,5条指令只需9x2ns=18ns就可完成。因此流水线使性能增加了50/18=2.8倍(对单个指令保持延迟值不变)。

在这里插入图片描述

需要注意的是,在使用流水线时会引入额外的开销,如时钟偏移和寄存器延迟。这种开销限制了所能达到的加速值。

5.流水线原理

  • 所有共享一条流水线的指令的阶段和阶段次序必须相同。例如,“add”指令在存储器阶段中什么也不做。
  • 所有中间值必须在各周期锁存。
  • 不能复用任何功能模块。
  • 一个阶段中的所有操作都应在一个周期内完成。

6.流水线冒险

冒险会干扰流水线并阻止下一条指令在目标时钟周期内的执行。冒险会降低流水线在理想情况下所能带来的速度提升。

冒险分类:

  • 结构冒险:由于资源冲突而使硬件无法支持所有可能的指令组合同时执行。
  • 数据冒险:指令执行需要之前指令的计算结果,而这个结果在流水线中还没有计算出来。
  • 控制冒险:分支的流水线和其他指令改变程序计数器的值。

解决以上问题的通用方法是停止流水线直至风险消除,在流水线中插入多个“气泡”(缺口)。

结构冒险

在结构冒险中,硬件无法同时支持所有可能的指令组合重叠执行。结果会导致资源冲突,即多个指令要求访问同一地址。

例如,使用单端口存储器执行载入指令的操作:
在这里插入图片描述

这里有两条指令在同一个时钟周期内要求访问同一存储器(一个在MEM阶段,一个在IF阶段),因此就会产生存储器冲突。

解决方法是在发生冲突时将流水线停一个时钟周期。这样会产生一个流水线气泡,这样可以在增加一个时钟延迟的情况下执行同样数目的指令,如下:

在这里插入图片描述

另一种解决方案是在IF和MEM阶段使用不同的存储器以避免同时访问同一块存储器的冲突,这样虽然解决了冲突冒险,但是消耗了更多的资源。

数据冒险

在数据冒险中,当前指令的执行需要依赖前面指令执行的结果。

第一条指令后的所有指令都使用R1,按下图的方式,ADD之后的指令无法得到正确的执行结果,因为在ADD之后的所有指令的ID阶段都需要ADD指令的结果(在WB阶段输出)。
在这里插入图片描述
解决这种冒险的常用方法是数据/寄存器转移。其原理是选择的数据实际上并不在上图所示的ID阶段使用,而是在下图中的ALU(EX)阶段使用。
在这里插入图片描述
数据转移规则如下:

  • 第一条指令(该指令的输出会在后续指令中使用)的EX/MEM缓存输出的所有数据始终送到下一条指令的ALU输入端。
  • 如果转移硬件探测到源操作数有更新,逻辑电路会选择使用更新的结果,而不是来自于寄存器文件(ID/EX缓存器)的数据。
  • 结果不仅需要从前一条指令转移,还需要从三个周期前开始的指令转移。EX/MEM(一个周期前)和MEM/WB(两个周期前)的结果转移到两个ALU的输入端。
  • 在时钟周期的前半段读寄存器堆,在该时钟周期的前半段写寄存器堆(三个周期之前)。

存在影响电路得到正确结果的几种不同类型的数据冒险。

  • 读后写(RAW):这是最常见的数据冒险,可以用数据转移解决。
  • 写后写(WAW):两条连续指令先后写同一寄存器,但写次序颠倒。DLX通过在WB阶段等待写入寄存器的方式避免这个问题。所以在DXL中不存在WAW风险。
  • 写后读(WAR):这里,在前一条指令读出寄存器的值(错误值)后,下一条指令才写入该寄存器。这种情况在DLX中也不会发生,因为所有指令会先读(在ID阶段)后写(在WB阶段)。

因此,数据转移不能解决所有类型的数据冒险。代表性的是直到MEM/WB阶段数据才能使用的情况。

控制冒险

这种冒险通常发生在由于分支语句使程序计数器(PC)发生变化的情况下。如下图所示,在T2周期执行第二条指令时就需要PC的值,但是该值要在第一条指令的MEM操作(周期T4)后才可用。
在这里插入图片描述

一种简单的解决方式是在分支语句中用新的PC值重新读取指令。在这种情况下,需要将流水线停止几个周期直到重新获取下一条指令,如下所示:
在这里插入图片描述
通过提前预测分支目标或在分支延迟空隙间插入额外指令,可使流水线停止所导致的控制风险最小化。

其他冒险

在指令获取或在数据读写时会访问存储器。

在指令获取时,数据应该由PC寄存器保持稳定。该值应该一直保持到把获取的指令写入IF/ID流水线寄存器的IR域为止。因此,对IF/ID寄存器的IR写操作必须在PC写操作之前。

在数据读写时,访问存储器所用的有效地址在EX阶段由ALU计算出来。在将存储器中的数据存入LMD寄存器或存储器写信号被激活使数据写入存储器之前,该地址不能变化。

实际上,ALU输出值与存储器访问是独立的过程,这就意味着有时EX/MEM ALU的输出值会在数据写入MEM/WB LMD寄存器前更新。需要对这三个事件进行严格的排序以使EX/MEM ALU的输出只在存储器访问完成后才改变。而对于非流水线结构的CPU就不会存在这样的问题,因为指令周期的访问阶段在执行阶段之后,而只有在执行阶段才会修改EX/MEM ALU输出的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/60470.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

首个大规模图文多模态数据集LAION-400M介绍

前言 openAI的图文多模态模型CLIP证明了图文多模态在多个领域都具有着巨大潜力,随之而来掀起了一股图文对比学习的风潮。 就在前几天(2022年12月),连Kaiming都入手这一领域,将MAE的思路与CLIP的思路结合,…

MySQL常用高级语句

SQL高级语句 DISTINCT 不显示重复的内容 语法:SELECT DISTINCT “字段” FROM “表名”; select distinct name from lk1;SELECT 显示表格中一个或数个栏位的所有资料 语法:SELECT “字段” FROM “表名”; select * from lk1; #查看表格详细信息…

微机原理与汇编语言—理论知识复习

书上重点内容 本篇博客整理老师课上强调的重点理论知识,以便复习备考,如有错误欢迎指正。 这门课主要讲CPU芯片与其他芯片(内存芯片和I/O接口芯片)之间交互。 一条指令的执行过程:取指(从主存取到CPU寄…

最优化理论笔记及期末复习(《数值最优化》——高立)

目录一、预备知识二、无约束最优化方法的基本结构三、凸集和凸函数四、负梯度方法和Newton型方法五、共轭梯度法六、约束最优化问题的最优性理论七、罚函数方法八、期末复习8.1 知识点复习8.2 习题复习8.3 大实验代码8.3.1实验内容8.3.2实验目的8.3.3算法描述8.3.4程序中的参数…

[附源码]计算机毕业设计基于Springboot的中点游戏分享网站

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【C++】STL:String

🐱作者:傻响 🐱专栏:《C/C - STL》 🔥格言:你只管努力,剩下的交给时间! ​ 目录 STD - String标准库 字符串类介绍 字符串类构造函数 No.1 string() ; No.2 string(const char…

实操1 : Jupyter Notebook 如何更换主题+全部主题展示+深色主题下如何设置可视化图表

文章目录(一) 如何更换主题(二) 全部主题展示(三) 深色主题下设置可视化图表(一) 如何更换主题 1.打开 Jupyter Notebook, 新建一个Python文件 在文件中输入下方命令开始安装主题 pip install --upgrade jupyterthemes -i https://pipy.douban.com/simple2.win R 打开 cmd 命…

效率工具之Arthas

Arthas 阿里巴巴开源的Java诊断工具;追踪方法执行链、反编译、监控JVM状态 在线安装 使用 1. trace 跟踪调用链 解决痛点:定位问题根据日志推理分析,方法出入参不可见,分支判断太多情况下 定位很慢,分析出可能有问…

[附源码]JAVA毕业设计科院垃圾分类系统(系统+LW)

[附源码]JAVA毕业设计科院垃圾分类系统(系统LW) 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术…

JVM学习-- JVM调优

一、选择垃圾收集器 垃圾收集器和内存大小有关 一般情况, serialserial old 适用几十兆内存 pspo 适用几百兆~几个G parNewCMS 可以用到20G G1 可以用到上百G ZGC 可以 4T~16T 1. 常见垃圾收集器组合参数设定 -XX:UseConc(urrent)MarkSweepGC ParNew CM…

【web实战-业务逻辑】评论点赞逻辑

目录 点赞逻辑一: 第一步:找关键 第二步:猜测逻辑 第三步:结论 第四步:归类 点赞逻辑二: 第一步:找关键 第二步:猜测逻辑 第三步:结论 第四步:归纳…

Framework 学习之旅:Service 启动过程

前言 Service 的启动过程将分为两个部分,分别是ContextImpl到ActivityManageService调用过程和ActivityThread启动Service过程。 ContextImpl到ActivityManageService调用过程 一般启动服务操作在Activity中调用startService方法,从Activity的startSe…

[附源码]计算机毕业设计springboot智慧园区运营管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

360T7路由器进行WiFi无线中继教程

360T7路由器进行WiFi中继教程1. 概述2. 360T7路由器进行WiFi中继实现教程2.1 登录路由器管理界面2.2 选择上网方式2.3 搜索WiFi2.4 连接WiFi2.5 点击确认2.6 在主页面查看网络1. 概述 中继路由系统由一组中继路由器组成,为不能交换路由信息的路由域提供中继路由。该…

关于小程序session_key漏洞问题的解决2022-12-01

业务背景:开发了小程序,使用了一段时间以后,小程序提示系统漏洞session_key的问题,在网上找了好多的博客,感觉好多写的没那么清晰,更偏重于理论,导致自己走了很多的弯路,为了更方便快…

基于海鸥算法优化的lssvm回归预测-附代码

基于海鸥算法优化的lssvm回归预测 - 附代码 文章目录基于海鸥算法优化的lssvm回归预测 - 附代码1.数据集2.lssvm模型3.基于海鸥算法优化的LSSVM4.测试结果5.Matlab代码摘要:为了提高最小二乘支持向量机(lssvm)的回归预测准确率,对…

【树莓派不吃灰】Linux服务器篇(核心概念)

目录1. 第一章 架设服务器前的准备工作2. 第二章 基础网络概念3. 第三章 局域网络架构简介4. 第四章 连上 Internet5. 第五章 Linux 常用网络指令6. 第六章 Linux 网络侦错7. 第七章 网络安全与主机基本防护8. 第八章 路由观念与路由器设定9. 第九章 防火墙与 NAT 服务器&#…

Python源码剖析2-字符串对象PyStringObject

二、 1、PyStringObject与 PyString_Type PyStringObject是变长对象中的不可变对象。当创建了一个PyStringObject对象之后,该对象内部维护的字符串就不能再被改变了。这一点特性使得 PyStringObject 对象能作为 PyDictObject 的键值,但同时也使得一些字符串操作的效率大大降低…

Kafka RecordAccumulator 三 高并发写入数据

Kafka RecordAccumulator 三 高并发写入数据 首先我们客户端会通过多线程的方式来发送消息(一般业务需求可能会通过业务系统或者大数据流计算系统如Spark Streaming或者Flink将业务数据发送出去,进而让下游系统消费使用),那这里业…

【Linux】进程状态|僵尸进程 |孤儿进程

索引运行状态:阻塞状态挂起状态看看Linux是怎么做的运行状态R睡眠状态S停止状态T两个特殊的进程:僵尸进程孤儿进程在之前我们听过很多很多进程的状态,像是运行、新建、就绪、挂起、阻塞、等待、停止、挂机、死亡等等。推荐阅读:通…