系统结构期末复习(三)流水线技术

目录

  1. 流水线的基本概念
  2. 流水线的性能指标
  3. 流水线的相关与冲突
  4. 流水线的实现
  5. 向量处理机

1. 流水线的基本概念

各个主要部件的功能

相关信息运算器存储器控制器
功能算术、逻辑运算存放指令和数据;提供外界对指令和数据的访问控制指令自动的按照规定的动作有序的执行
特点操作数进入运算器;经运算后,操作结果输出到累加器指令按顺序一条一条的存放数据,按序一个一个存放,按地址访问自动:PC自动计数;按规定动作:提取指令的操作码;发出控制信号:通过译码部件形成控制信号,有秩序执行规定动作的时序控制
对外接口输入:操作数;输出:操作结果WAR:内存地址寄存器;WDR:内存数据寄存器输出:指令地址,控制信号;输入:指令

在这里插入图片描述

1.1 什么是流水线

  1. 流水线技术:把一个重复的过程分解成为若干个子过程,每个子过程由专门的功能部件来实现。把多个处理过程在时间上错开,依次通过各功能段,这样每个子过程就可以和其他子过程并行执行
    【🐷】不是一个过程的多个子过程并行,而是每一个类似的过程都被分为相同的子过程,不同的过程的子过程并行
  2. 流水线的级或段:流水线中的每个子过程及其功能部件(段与段相互链接形成流水线)
  3. 流水线的深度:流水线的段数
  4. 指令流水线:把流水线技术应用与指令的执行过程(把指令的解释过程分解为分析和执行两个子过程,并让两个过程分别用独立的分析部件和执行部件来实现。理想情况下速度提高1倍)
    在这里插入图片描述
  5. 运算操作流水线(部件级流水线):把流水线技术应用于运算的执行过程
    在这里插入图片描述
  6. 流水线的工作过程常用时空图的方法来描述。
    在这里插入图片描述
  • 横轴:时间;纵轴:级/段
  • 分析流水线效率的时候比较直观
  • 一共会出现3个时空图,这是第一个
  • 数字表示第几个任务,因此时空图明确表示出:第几个任务在第几个时间片处于流水线的第几段
  1. 流水线技术的特点:(5‘)
    • 流水线把一个处理过程分解为若干个子过程,每个子过程由一个专门的功能部件来实现
    • 流水线中各段时间应该尽可能相等。否则将引起流水线堵塞、断流,因为时间长的段将成为流水线的瓶颈
    • 流水线每一个功能部件的后面都要有一个缓冲寄存器(锁存器),称为流水线寄存器,其作用是在相邻的两段之间传送数据,以保证后面要用到的数据,并把各段的处理工作相互隔离。
    • 流水线技术适合于大量重复的时序过程
    • 流水线需要有通过时间(第一个任务从进入流水线到流出结果到时间段)和排空时间(最后一个任务进入流水线到流出结果的时间段)。经过通过时间后,流水线进入满载工作状态,整条流水线的效率才能够得到充分发挥。
流水线技术特点要把握的3个问题
1. 为什么各段时间相等?
2. 流水线寄存器的作用?
3. 流水线对一个过程有什么影响?

在这里插入图片描述

1.2 流水线的分类

单、多功能,动静态

单功能、多功能流水线,静态、动态流水线分类要点
1. 多功能流水线分静态/动态,单功能不分
2. 注意静态流水线,一种功能完成之后流水线的各个部件才能重组
3. 动态只要部件空出来就可以重组
4. 要注意动态、静态流水线的对比

在这里插入图片描述
在这里插入图片描述
上图所示的定点乘法可以提前多少取决于任务的流动情况,要保证不能在公用段发生冲突。

  • 对于静态流水线来说,只有当输入的是一串相同的运算任务时,流水线的效率才能得到充分发挥,如果交替执行不同的运算任务,效率会降低到和顺序处理方式一样
  • 目前绝大多数的流水线是静态流水线

线性和非线性,乱序和顺序

在这里插入图片描述
宏流水线是线性流水线,指令没有回馈,只能一条路走到黑。非线性流水线即有反馈回路,一次的地址可以作为下一次执行的相关控制信息。
在这里插入图片描述

  • 流水线处理机:指令执行部件中采用了流水线的处理机称为流水线处理机(指令流水线和运算操作流水线等)
  • 标量处理机:处理机不具有向量数据表示(也可以处理向量只不过需要loop)

🀄️注意这里说的是【数据表示】,数据表示是机器可以直接识别的数据格式,这里底层的无法直接使用向量执行,但是【不代表不可以处理向量的一些运算操作,可以通过循环来执行】

  • 向量处理机:具有向量数据表示向量指令的处理机(向量数据表示和流水技术的结合

🀄️有了向量的数据表示之后还应该能够直接对向量进行处理,也就是具有向量指令才能更好的进行流水

  • 向量特别适合流水的原因:每个位置的数据运算相同;每个运算之间无关联,便于流水;流水中不会断流。

🀄️运算相同也暗合了静态流水线处理相同运算加速;每个运算之间没有关联也就是前一个不需要后一个才能操作,这样每个独立就不存在互相等待或者冲突的问题,便于流水;流水中不会断流应该是向量进行流水处理的状态。

在这里插入图片描述

  1. 有4种分类方式

  2. 运算符流水线和指令流水线不是一个级别的流水线,按照流水的级别分类,运算符流水线属于部件级流水线
    而指令流水线属于处理器级流水线,宏流水线属于指令间流水线。


2. 流水线的性能指标

2.1 吞吐率

在这里插入图片描述

2.1.1 吞吐率的定义

单位时间内流水线完成的任务数量或输出结果的数量:
在这里插入图片描述

2.1.2 各段时间均相等的流水线

在这里插入图片描述

一般流水线的分级不会进行更改了也不会有特别多的级别进行流水,所以k相对于n来说可以忽略不计,前面的一小部分的执行是和整个流水线要执行多少任务无关的。

任务越多流水线的吞吐率越高,如果任务数量足够多,那么每隔1/deta(t)就可以完成一个任务。

在这里插入图片描述
流水线的实际吞吐率要小于最大吞吐率:它除了和每个段的时间有关,还与流水线的段数k输入到流水线的任务等有关,只有当n远大于k时,二者才相等。

流水线的最大吞吐率相当于流水线本身的属性,而流水线的实际吞吐率是一种动态的变化。

2.1.3 各段时间不完全相等的流水线

在这里插入图片描述

第一部分是整个一条指令的完整执行时间下的时间(相当于把后面多余的先移到前面进行计算),后面剩下的时间计算就是最长的一段的时间乘上n-1 个任务,也可以从通过时间的角度进行考虑,通过时间指第一条指令完整的通过流水线所用的时间,而第一条指令完全流出后CPU才处于满载状态,所以后面是流水技术真正的实现时刻。

流水线的最大吞吐率与实际吞吐率由最长的那个段决定,这个段就成了整个流水线的瓶颈,这时瓶颈段一直处于忙碌状态,而其余各段有许多时间时空闲的,硬件使用效率低。

2.1.4 解决流水线常用问题的基本方法
  1. 细分瓶颈段
    在这里插入图片描述
  2. 重复设置瓶颈段
    由于结构等方面的原因无法再细分瓶颈段时,可以通过重复设置瓶颈段的方法来消除瓶颈。缺点:控制逻辑比较复杂,所需硬件增加。在这里插入图片描述

重复设置瓶颈段不是将S3部分重复执行,也不是简单的将S3部分再分成3个部分每个部分分开流水,而是在前面在执行第一条指令的瓶颈段时不让第二条,第三条指令流入的时候让它们流入,这个时候在S3部分设置相当于并行的一个操作,把让进入的第二条、第三条指令的S3阶段分时进入,这个时候就可以将空闲的位置补上。

任务分时分配需要数据分配器,任务计算结果分时收集需要数据收集器。都是在两个流水段之间进行设置。

重复设置瓶颈段的段数= 瓶颈段占用了多少个单位时间

在这里插入图片描述

2.2 加速比

重要知识点把握要点
加速比的定义此处的加速比值的是使用流水线和不使用流水线相比,加速了多少
实际加速比如果只完成一个任务,加速比是多少
最大加速比什么情况下加速比会接近最大
各段时间相等的加速比自己求一下不完全相等的加速比
各段时间不等的加速比采用两种改进方法改进各段时间不完全相等的流水线后,加速比是多少
全相等的流水线加速比正常情况下,假设n段加速比1<=sp<=n

在这里插入图片描述
在这里插入图片描述
可以看出流水线的段数越多越好,但是也要有一个限度,因为如果太多的话,流水线之间寄存器分到的时间如果等于每段流水线的时间,那流水就没啥用了。
在这里插入图片描述

2.3 效率

重要知识点要点
效率的定义效率从流水线的时空图看,是阴影部分的面积比上整个的面积
实际效率如果只完成一个任务,效率是多少
最大效率什么情况下,效率接近最大?
各段时间相等的流水线效率自己求一下各段时间不完全相等的效率
各段时间不完全相等的流水线效率采用两种改进方法改进隔断时间不完全相等的流水线之后,效率是多少
效率:流水线中的设备实际使用时间整个运行时间的比值,即流水线利用率

⚠️因为流水线有通过时间和排空时间,所以在连续完成n个任务的时间内,各段并不是满负荷的工作

看的就是设备的实际使用时间,如果设备不是满负荷工作,效率必定不能达到百分百

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4 流水线性能分析举例

例一

在这里插入图片描述
在这里插入图片描述

⚠️静态流水线中,前一种功能的最后一条指令排空后,才能切换流水线,动态多功能指令不用
⚠️从例题中是否能总结一下:影响流水线性能的因素
⚠️注意算法设计,使得任务进入流水线中减少冲突,减少切换功能
实现步骤:

  1. 首先应该选择适合于流水线的算法
  2. 其次画出完成该计算的时空图在这里插入图片描述

这里纵轴是空间也就是执行的每一个段,而整个的浮点运算分为8短,加法和乘法分别对应不同的段,所以在时空图上的表示不同,在画时空图之前要知道整个过程分成多少段。

在这里插入图片描述

  1. 注意:这里加法分6段流水是有原因的,由题干中他是按照图3.4所示的静态流水线上进行的,这里的加法包括:输入、求阶差、对阶、相加、规格化、输出,这里的乘法包括:输入、相乘、累加、输出
🌟🌟该流水线效率低的原因🌟🌟:

特性:

  1. 多功能流水线在做某一种运算的时候,总有一些段是空闲
  2. 运算之间存在关联,后面有些运算要用到前面运算的结果,相关问题

共性:

  1. 静态流水线在进行功能切换时,要等前一种运算全部流出流水线后才能进行后面的运算
  2. 流水线的工作过程有建立和排空部分

一开始认为总有一段是空的和建立和排空即第一点和第四点是一样的,实际并不是,第一点是在说当前所用的流水段被分成8段,但是在做加法和乘法运算的时候都没有完全使用整个8段寄存器,但是这一点在其他的流水线上是可以避免的,但是流水线的建立和排空时间是每条流水线都有的特点,不会因为流水线的不同而改变。

例二

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述⚠️同样也是先进行乘法操作,然后再进行各个结果的加法操作,在这个过程中不同的是在A、B计算出来之后就可以直接进入流水线,不过这里要在C的后面(根据最初安排的原则是乘法先做)。

即A、B计算出来之后后面的A+B指令可以直接进入流水线,但是在前面的静态流水线中不能实现,所以在这段位置节省了指令执行的时间。注意C+D不能提前要等到D完全计算出之后才可以。要注意指令前后之间的相关性

2.5 流水线设计中的若干问题

  1. 瓶颈问题
    计算机的时钟周期取决于这个瓶颈段的延迟时间,因此在设计流水线的时候要尽可能使各段时间相等。
  2. 🌟流水线的额外开销🌟
    流水寄存器延迟和时钟偏移开销
    a. 流水寄存器延迟:流水寄存器需要建立时间(触发写操作的时钟信号到达之前寄存器输入必须保持稳定的时间)和传输延迟(时钟信号到达后寄存器输出可用的时间)
    b. 时钟偏移开销:流水线中时钟到达各流水寄存器的最大时间差值(即时钟到达各流水寄存器的时间不是完全相同的)
  3. 冲突问题
    后面的计算要用到前面的结果,指令之间存在关联就需要相互等待,引起流水线的停顿。
  4. 为何段数不是越多越好?
    主要还是和开销有关
    在这里插入图片描述

3. 流水线的相关与冲突

  • 重要知识点:
    1. 五个阶段(IF、ID、EX、MEM、WB)
    2. 各段功能
    3. 时空图
  • 一些注意点:
    1. 读寄存器取操作数是在ID段(IF是取指令,ID段是根据指令取操作数)
    2. EX阶段做的事情都是用ALU计算
    3. WB阶段是写回寄存器
    4. 只有load和store指令进行数据访存
      在这里插入图片描述
      静态方法是对分支的处理在程序执行的过程中始终是不变的。

3.1 一个经典的5段流水线

如果事先有约定好每条指令的长度就可以通过硬件设置自动增加,否则比如可变长的指令要等到译码结束之后才能判断然后才能知道下一条指令的长度。
在这里插入图片描述

load是需要写回的,MEM周期内执行的是将相应位置的数据取出,可是load指令还需将相应的结果加载到相应的存储单元中。

采用流水线的方式实现上面的步骤:
在这里插入图片描述
在这里插入图片描述
这种时空图直观地展现了指令的重叠执行情况
在这里插入图片描述
这个更直观的展现了部件重叠的情况。流水线可以看成是按照时间序列错开的数据通路序列

  • 🌟采用流水线方式实现时要注意的问题🌟:(4‘)
    1. 首先要保证不会在同一时钟周期要求同一个功能段做两件不同的工作(不能要求ALU同时做有效地址计算和算术运算)
    2. 避免IF段的访存(取指令)与MEM段的访存(读/写数据)发生冲突,必须采用分离指令存储器和数据存储器,一般采用分离的指令Cache和数据Cache。【⚠️如果这里的时钟周期与前面非流水方式下的时钟周期相同,那么存储器系统的带宽必须提高到原来的5倍,这代价不小啊】
    3. ID段要对通用寄存器组进行读操作,而WB段要对通用寄存器组进行写操作,为了解决对同一通用寄存器的访问冲突,把写操作安排在时钟周期的前半拍完成,读操作安排在后半段
    4. PC的问题,为了做到每一个时钟周期启动一条指令,必须在每个时钟周期都做把PC+4的工作(在IF段完成),需要设置一个专门的加法器。分支指令的时候也要修改PC,它是到MEM段才会进行修改

3.2 相关与流水线冲突

相关

  • 相关:指两条指令之间存在某种依赖关系。如果两条指令相关,它们可能不在流水线中重叠执行或只能部分重叠。
    相关是导致流水线冲突的原因,但是相关是指令间的静态属性,但是存在相关的指令不一定会导致流水线冲突
    在这里插入图片描述
1. 数据相关

在这里插入图片描述
➡️表示必须保证的执行顺序,由产生数据的指令指向使用该数据的指令。
在这里插入图片描述
流经存储器时,store和load指令的有效地址计算方法都是Regs[rs]+immediate,不经过EX阶段计算不出来。所以就有可能两个表达方式不同的地址但是最后计算出来的结果是相同的。

  • 要点:
    1. 数据相关反应数据的流动关系
    2. 当数据流动是通过寄存器的,相关的检测比较直观和容易
       LD F0 0(R1)
       ADD F4,F0,F2
      
      只要判断LD指令的rt字段是否和ADD指令的rs或者rt字段一直就可以了

是因为数据相关的寄存器检测比较容易才为后面直接通过rs或rt字段进行冲突判断奠定基础,因为寄存器数据冲突判断具有唯一性。

2. 名相关
  • 名:指令所访问的寄存器或存储器单元的名称
    如果两条指令使用相同的名,但是他们之间没有数据流动,则称这两条指令存在名相关。
  • 反相关和输出相关:
    在这里插入图片描述
  • 要点:
    1. 没有数据流关系,仅仅是使用了相同的寄存器
    2. 可使用寄存器换名技术消除(寄存器换名可以用编译器静态实现,也可以用硬件动态完成
      在这里插入图片描述
      将上述代码按照123排序:
      2中不需要1中的数据来做什么,所以是名相关;而23是数据相关,所以要换的话全都换名。
      在这里插入图片描述
3. 控制相关
  • 控制相关是分支指令引起的相关。一般来说,为了保证程序应有的执行顺序,必须严格按控制相关确定的顺序执行。
    在这里插入图片描述
  • 要点:
    1. 由控制指令引起的
    2. 控制相关指令的限制:
      1. 与一条分支指令控制相关的指令不能被移到该分支指令之前,否则这些指令就不受该分支控制了。
      2. 如果一条指令与某分支指令不存在控制相关,就不能把该指令移到该分支之后
      

流水线冲突

  • 流水线冲突:对于具体的流水线来说,由于相关的存在,使得指令流中的下一条指令不能在指定的时钟周期执行
    ⚠️当一条指令被暂停时,该暂停指令之后流出的所有指令都被暂停,而在暂停之前流出的指令则继续执行。(否则永远无法解决冲突)

在这里插入图片描述

1. 结构冲突
  • 结构冲突的更详细阐述:
    在流水线处理机中,为了能够使各种组合的指令都能顺利滴重复执行,需要对功能部件进行流水,或重复设置资源。如果某种指令组合因为资源冲突而不能正常执行,则称该处理机有结构冲突。
  • 结构冲突举例:
    有些流水线处理机只有一个存储器,将指令和数据放在一起,在这种情况下,如果在某个时钟周期内既要完成访存操作,又要完成其后某条指令的“取指令”,那么就会发生访存冲突。
  • 结构冲突的解决方案:
  1. 引入Bubble(停顿)消除结构冲突,在第8个时钟周期,流水线中没有指令完成。
    在这里插入图片描述
    在这里插入图片描述
  2. 在流水线处理机中设置相互独立的指令存储器和数据存储器,或者将统一的Cache分成独立的指令Cache和数据Cache。
  • 为何有时流水线设计者允许结构冲突的存在?
    主要原因是减少硬件成本
2. 数据冲突
  • 数据冲突的详细阐述:
    当相关的指令靠的足够近时,它们在流水线中的执行或者重新排序会改变指令读/写操作数的顺序,使之不同于它们非流水实现时的顺序,则发生了数据冲突。
    在这里插入图片描述

对应的相关的英文名字是其本来应该正确执行步骤

  • 减少数据冲突的措施
    在这里插入图片描述
    1. 定向技术要点:
      3种情况可以定向
      自己写一下定向的检测条件
      什么样的情况不能定向?怎么解决?
      在这里插入图片描述

如上图所示的三个部分可以采用定向技术解决冲突,下一条指令(1)的ALU运算直接可以使用上一条指令ALU运算的结果;再向下一条(2)是数据通过流水线直接传送到下一级的流水线寄存器中,那此时的ALU可以使用当前MEM/WB级别的寄存器;第三种定向是在WB写回阶段和在下一条指令(3)的ID读周期重合,存在着写后读(真数据相关)的问题,这里安排前半个周期写,后半个周期读,所以不会出现冲突。
后面指令在前面的ALU之后出现ALU的使用可以使用定向技术进行操作,但是如果当前需要ALU的结果在前面的ALU运算之前就没有办法通过定向技术解决。

  1. 需要停顿的数据冲突【流水线互锁机制
    ⚠️这里的Bubble和前面的Bubble有所不同,前面是整个周期加一个空指令,不改变每条指令的执行时间,而这里是被停顿指令的 CPI增加了一个时钟周期,整个的指令序列的执行时间也增加了一个时钟周期。
    在这里插入图片描述

在load指令中,MEM段是把数据从内存单元读出,但是还没有将数据读入到目的寄存器中,所以这个时候如果在后面使用了目的寄存器进行运算,会出现写后读冲突(真数据相关),而此时无法定位,只能通过加BUBBLE的方法延迟后续指令的执行
前面是整个周期加一个空指令相当于当前程序停止运行,而当前指令是在被停顿的指令执行周期内添加指令使得当前指令的执行周期增加,而前面结构冲突的BUBBLE并没有直接使指令的执行周期增加。

在这里插入图片描述
3. 依靠编译器解决数据冲突

依靠编译器实际上是为了更好的处理通过BUBBLE方式产生的流水线的时钟周期数的增加 ,但是需要编译器可以提供重新组织指令顺序的能力。(和缓冲池的思想差不多)

在这里插入图片描述
在这里插入图片描述
⚠️没有影响的指令就是把前后执行都可以的指令进行移动,但是移动后也可以和定位技术结合,从而减少停顿。

3. 控制冲突
  • 控制冲突的详细阐述:
    1. 在流水线中控制冲突可能比数据冲突造成更多的性能损失。执行分支指令的结果有两种:成功——PC值改变为分支转移的目标地址;失败——PC的值保持正常递增,指向顺序的下一条指令。
    2. 处理分支指令最简单的方法==“冻结”或者“排空”流水线==。一旦在ID段检测到是分支指令,就暂停执行其后的所有指令,直到MEM阶段确定是否成功并计算出新的PC值为止。带来3个时钟周期的延迟。
    3. 由分支指令引起的延迟称为分支延迟
      在这里插入图片描述
  • 🌟减少分支延迟可采取的措施🌟:【这两种措施要同时采用,缺一不可(因为只有判断出转移是否成功而且得到分支目标地址后才能进行转移)】
    1. 在流水线中尽早判断出分支转移是否成功
    2. 尽早计算出分支目标地址
  • 通过软件(编译器)来处理的方法:【3‘】
    这三种方法都有一个共同的特点:它们对分支的处理方法在程序执行过程中是始终不变的 ,是静态的。要么总是预测分支成功,要么总是预测分支失败
    在这里插入图片描述

在5段流水线中由于分支成功判断和转移地址计算是在同一个指令周期完成,所以分支延迟无法减少,因为即使预测了分支成功或失败也无法计算出相应的分支目标地址。分支目标地址的计算要能在分支成功与失败的判断之前被确定

  • 选择放入延迟槽中的指令是由编译器完成的。实际上延迟分支是否能带来好处完全取决于编译器能否把有用的指令调度到延迟槽中
  • 当无法使用从前调度时,使用从目标出调度和从失败处调度
    在这里插入图片描述

无论从哪里进行调度都要保证最后的执行结果是正确的。无论是从任何位置调度都应该是把相关的指令复制到延迟槽中而不是直接将原指令直接调入,因为程序的其他地方也可以调用当前位置的代码。
还要注意如果分支失败的话,由于下面要进行延迟槽中指令的执行要保证延迟槽中指令的执行不会影响当前程序的正确性。

  • 分支取消机制:分支指令隐含了预测的分支执行方向,当分支的实际执行方向和事先预测的一样时执行分支延迟槽中的指令,否则就将分支延迟槽中的指令转化成一个空操作
    在这里插入图片描述

4. 流水线的实现

4.1 MIPS的一种简单实现

  • 重要知识点
    1. MIPS实现的数据通路
    2. 不采用单周期实现方案的原因

⚠️在该数据通路中,最多花5个周期就能实现一条MIPS指令!
在这里插入图片描述
把IF周期内的加法器与EX周期的ALU合并,共享一个ALU,并把指令存储器与数据存储器合并为一个存储器,就会得到一个更加经济的方案,但是这样不便于改造为流水实现。
在这里插入图片描述
在这里插入图片描述

  • IR的低16位进行符号扩展,然后存入Imm
  • 固定译码技术:指令的译码操作和读寄存器操作是并行进行的。因为在MIPS指令格式中,操作码字段以及rs、rt字段都是在固定的位置。(这里读出的操作数在后面并不一定用到,但是这里简化了硬件)

固定译码技术指的是无论程序当前的运行情况如何,我该译码还译码,能用最好,不用随意。这样减少了相关的判断,简化了硬件。

  • 由于立即数在所有MIPS指令中的位置是相同的,因此在这里统一对其进行符号扩展,以便在下一个周期使用。虽然可能用不到,但是提前形成有益无害。
  1. 执行/有效地址计算周期(EX)
    在这里插入图片描述
    关于分支指令:(这里只考虑了BEQZ branch if equal zero)

转移目标地址的具体计算方法

在这里插入图片描述

  • 将有效地址计算周期和执行周期合并为一个时钟周期,这是因为MIPS指令集采用load/store结构,没有任何指令需要同时进行数据有效地址的计算、转移目标地址的计算和对数据进行计算
    在这里插入图片描述

除了分支指令,其余的指令都是将已经取好的下一条指令的地址NPC放入PC中进行下一步指令的选取。但这已经不算当前指令周期的处理了。

在该周期内处理的MIPS指令仅有load、store和分支三种
在这里插入图片描述
存储器访问指令包含load和store。如果是load指令,就从存储器中读出相应的数据,放入临时寄存器LMD;如果是store指令,就将B中的数据写入存储器。两种情况下均用ALUo中的值作为访存地址(在上一个周期已经计算好了)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上述指令内容均是将结果写入通用寄存器组,这个结果可能来自ALU的计算结果,也可能来自存储器。写入的目标寄存器由指令中的rd或rt字段指出。

-🌟 计算机设计者一般不会采用单周期实现方案的主要原因🌟:

  1. 对于大多数CPU来说,单周期实现效率很低,因为不同的指令所需完成的操作差别相当大,因而所需要的时钟周期时间也大不一样
  2. 单周期实现时需要重复设置某些功能部件(例如实现PC+4)的加法器,而在多周期实现方案中这些部件是可以共享

就是下一条指令计算的时候是直接可以通过ALU来计算下一条指令的地址还是再单独设置一个加法器去计算指令的地址。

4.2 基本的MIPS流水线

  • 重要知识点:
    1. 流水寄存器
    2. 流水线控制
    3. 冲突检测
    4. 定向
    5. 分支提前的实现
🌟对上面的MIPS简单实现的3方面改进🌟

在这里插入图片描述

  • 关于流水线寄存器的相关内容:
    1. 流水线寄存器的名称用其相邻的两个段的名称拼合而成(IF/ID)实际上每个流水线寄存器是由若干个寄存器构成的,这些寄存器的命名格式:【x.y】,其包含的字段的命名格式:【x.y[s]】(x流水线寄存器名称【实际上是一个寄存器组】,y是这个寄存器组中的具体寄存器,s是字段名称)
    2. 流水寄存器是边沿触发写入的
    3. 随着指令在流水线中的流动,所有有用的数据和控制信息每个时钟周期会往后流动一段(复制过去),在传递过程中,只保存后面需要用到的信息,丢弃不再需要的信息。
    4. 如果把PC看成是IF段的流水寄存器,那么每个段都有一个流水寄存器,它位于该流水段段前面,提供指令在该段执行所需要的所有数据和控制信息

以前是理解的每一段和它后面的流水线寄存器是一组的,这样是从传递结果考虑;但是还是在把PC相当于看成IF段流水线寄存器的话,其实每个段的流水线寄存器是前面的那个,因为在前面才能够给当前段执行提供数据和控制信息。

  • 🌟关于增加了向后传递IR和从MEM/WB.IR回送到通用寄存器组的连接相关内容🌟:
    1. 当一条指令从ID段流到EX段时,新的指令就会进入ID段,冲掉IF/ID中的内容,所以指令中有用的信息要依次往后传递直到MEM/WB.IR。(暗合上面的内容)
  • 关于将PC的修改移到IF段相关内容:
    1. 在IF和ID段,所有指令的操作都一样;从EX段才开始区分不同的指令
    2. 关于rs、rt和rd:
      在实现中,rs是第一个被用到的寄存器,rt是第二个被用到的寄存器,rd是第三个被用到的寄存器。比如LD R1, 0(R2)这条指令中第一个被使用到的寄存器R2,因为要读取R2,加上立即数部分0计算内存地址,所以R2为rs;从内存中读出的数据要存在R1中,因此R1是第二个被使用到的寄存器,即为rt。再如DAAD R4 R1, R5,R1和R5是同时被读取的,所以分别是rs和rt,计算结果写回R4,所以R4是rd。
      在这里插入图片描述
为了控制流水寄存器工作,要确定如何控制多路器

在这里插入图片描述

一共设置了5个多路选择器
还有一个隐藏的多路器在是在回传到【通用寄存器组】的过程中,根据指令格式的不同硬件是要选择读取rd、rt哪个位置的地址的。
寄存器-寄存器:rd
寄存器-立即数Imm/load:rt

解决数据冲突的问题(主要讨论了冲突检测的方法)

该小节前面的研究是都有什么冲突和这些冲突的逻辑实现方法,这里是一个具体实现的流水线,研究的是真正的出现这些问题应该如何解决。

  1. 对于该流水线而言,所有的数据冲突均可在ID段检测到。如果存在数据冲突,就在相应的指令流出ID段之前暂停——流水线的互锁机制(完成该工作的硬件)
  2. 可以在ID段确定需要什么样的定向,并设置相应的控制——定向技术
  3. 在使用操作数的时钟周期(上述流水线的EX和MEM阶段)的开始检测冲突并确定必须的定向
    ⚠️<font color-#F08080 size=3>检测冲突是通过比较寄存器的地址是否相等实现的
冲突检测
  1. load互锁:由于load的结果而引起的流水线互锁
    在这里插入图片描述

流水线互锁机制的具体实现步骤:

🌟一旦硬件检测到上述的RAW冲突,流水线互锁机制必须在流水线中插入停顿,并使当前处于IF段和ID段的指令不再前进。为了实现这点:只要将ID/EX.IR中的操作码改为全0(全0代表空操作),并将IF/ID寄存器的内容送回到自己的入口即可
2. 定向逻辑
也是通过比较流水寄存器中的寄存器地址来的。

定向技术
在这里插入图片描述
分支延迟
在这里插入图片描述
🌟🌟分支指令流水段的表述
在这里插入图片描述


5. 向量处理机

无考点

在这里插入图片描述

  • 如果有不相等的时段,然后输入端每隔t时间输入一个任务时,该流水线会阻塞并出现瓶颈段结构冲突

S3段是流水线的瓶颈段,其他的段所使用的功能性部件现在都处于空闲状态,而S3段的功能性部件一直处于繁忙状态,如果连续不断的输入的话,当后面的指令需要S3段的功能性不见时,该部件正在被使用,所以发生阻塞现象。
把流水线阻塞,流水线瓶颈段,流水线结构冲突三者结合在一起。流水线的瓶颈段导致结构冲突,结构冲突导致流水线阻塞。

  • 32
    点赞
  • 169
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值