计算机体系结构——中央处理器——流水线技术

(4) 2024-05-14 12:23

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说计算机体系结构——中央处理器——流水线技术,希望能够帮助你!!!。

注:部分内容和图片取自《计算机体系结构基础》(胡伟武著)、《计算机原理》(国防科技大学慕课)

指令流水线把一条指令的执行划分为若干阶段来减少每个时钟周期的工作量,从而提高主频;并允许多条指令的不同阶段重叠执行实现并行处理。
这样虽然一条指令的执行时间不变,但处理器再单位时间内处理的指令数增加了。

1. 指令的执行

  • 指令执行过程

一条指令在CPU中执行过程通常可以分为很多个阶段,通常来说CISC指令较为复杂,可以分的阶段可以有很多。

以5级流水线为例,可以分为取指,译码,执行,访存,写回五个操作

  1. 取指(IF):
    根据PC读出指令地址,根据地址从指令存储器中取出指令,随后PC+4准备下一次取指。
     
  2. 译码(ID):从指令中解析出相关控制信号,并读取通用寄存器堆
  3. 执行(EX):运算器对通用寄存器堆读出的操作数进行计算
  4. 访存(MEM):

    将执行结果读取或者写入到存储器

    在CISC中,CPU可以对内存直接进行读取和写入操作;但在RISC中,CPU需要通过寄存器对内存操作,而寄存器与内存间的通信则需要LSU来完成。load store unit为加载存储单元,管理所有load, store操作。

  5. 写回(WB):将结果写回到通用寄存器堆
  • 由流水线引申的技术
  1. 转移预测技术
    典型的程序平均5~10条指令中就有一条转移指令,而转移指令的后续指令需要等转移执行完成后才能取值,造成流水线效率降低。
    在转移指令的取指或 译码阶段预测该转移指令的跳转方向和目的地址并进行后续指令的取指,而在转移指令执行后,根据已确定的目的地址修正预测结果;若预测错误,需要取消流水线中后续的指令。
  2. 乱序执行技术
    通过动态调度允许指令i后面的源操作数准备好的指令越过指令i执行,以提高效率
  3. 超标量技术(多发射)
    允许流水线的每一阶段可以处理多条指令。发射的概念见第4大点动态调度部分。

2. 流水线处理器原理

该处理器会把指令的执行分为很多个阶段,同样以执行最久阶段的时间为时钟周期,当时流水线各阶段的部件将会同时工作,并行的执行多条指令。

通过在每级流水的触发器旁再添加一批用于存储控制逻辑的触发器,即寄存器栈。这些寄存器栈可以保存流水线的中间状态,当流水线逐级传递下去时,可以保证各阶段执行时使用的控制逻辑都是属于该指令的。

工作过程

如下图所示,R2、R3等为流水栈。
计算机体系结构——中央处理器——流水线技术_https://bianchenghao6.com/blog__第1张
从上图虚线可见,运算器进行计算的信息来源于控制逻辑2,即锁存过一次的控制逻辑,刚好与R2中存储的运算之同属一条指令。同时图中取消了R3阶段写通用寄存器的通路,而将R3的内容锁存一个时钟周期,统一使用控制逻辑4和R4来写。
计算机体系结构——中央处理器——流水线技术_https://bianchenghao6.com/blog__第2张
如上图流水线时空图,如当某一条指令译码时,下一条指令开始取指,上一条指令开始执行。

  • 流水线处理器特征
  1. 总的来说,流水线不能缩短单条指令的执行时间,但能大大提高指令的吞吐率(减少CPI),使总的执行时间减少

3. 流水线中的相关性

相关是指流水线中两条指令之间存在某种依赖关系。确定程序中指令之间存在什么样的相关,对于充分发挥流水线的效率有重要的意义。

3.1 相关类型

名相关

“名”是指指令所访问的寄存器或存储器单元的名称。如果两条指令使用相同的名,但是它们之间并没有数据流动,则称这两条指令存在名相关。

指令j与指令i之间的名相关有以下两种:

1)反相关。如果指令j写的名与指令i读的名相同,则称指令ij发生了反相关。反相关指令之间的执行顺序是必须严格遵守的,以保证i读的值是正确的。

2)输出相关。如果指令j和指令i写相同的名,则称指令ij发生了输出相关。输出相关指令的执行顺序是不能颠倒的,以保证最后的结果是指令j写进去的。

控制相关

数据相关

数据相关可分为RAW、WAW、WAR

3.2 相关性导致的冲突

由相关性导致的冲突可分为3类:数据冲突,控制冲突和结构冲突

1 数据冲突

当指令在流水线中重叠执行时,因需要用到前面指令的执行结果而发生的冲突。即在程序中,若两条指令访问同一寄存器或内存单元,且至少有一条是写入操作,则是数据相关冲突。

(1)数据冒险解决方法

如下图所示load指令引起的延迟现象,load的结果数据在cycle6才可以被使用,但此前已有三条指令被取出且译码等,若此时用到load的结果,则需要进行一定的处理
计算机体系结构——中央处理器——流水线技术_https://bianchenghao6.com/blog__第3张

  • 解决办法1:采用硬件阻塞方式(流水线气泡)

即将被组设流水线所在的寄存器保持原值不变,同时向被阻塞流水线的下一级流水线输入指令无效信号,用流水线空泡填充阻止后续指令执行,延迟到新值被写入寄存器后
计算机体系结构——中央处理器——流水线技术_https://bianchenghao6.com/blog__第4张
该方式控制较复杂。

  • 解决办法2:软件插入nop指令

插入无关的nop指令,延迟冲突指令的执行,但是会浪费时间。

  • 解决办法3:流水线前递技术(数据转发技术/旁路设计)

即上一条指令在执行阶段完成后即从寄存器中取出供下一条指令使用,不必等上条指令一级一级执行完后读取
计算机体系结构——中央处理器——流水线技术_https://bianchenghao6.com/blog__第5张
如图所示,在add指令ex完成后直接将结果数据前递到sub的ALU的输入。

若前递数据错误,则需要通过flush控制信号来清空流水栈
该技术需要在译码段增加一个检测点检测数据相关性,增加了硬件复杂度,且不能解决所有的数据相关(如产生冲突的第一条指令是load操作,由于访存的结果是在mem阶段得出,来不及前递到下一条指令的ex段),必须结合另外两种方法。如下图所示,采用转发技术和阻塞技术:
计算机体系结构——中央处理器——流水线技术_https://bianchenghao6.com/blog__第6张

  • 编译器优化

编译器编译时可以调整指令顺序或寄存器减少数据相关性。

(2)load-use数据冒险

在流水线中当一条指令使用之前指令访存的结果时,则会产生load-use数据冒险。此时需要进行load-use冒险处理,在流水线中插入“气泡”,此时若在五级流水线中指令的执行将阻塞一个时钟周期

参考链接:https://www.jianshu.com/p/ffd7ccf672ea

2 控制冲突

流水线遇到分支指令和其他会改变PC值的指令所引起的冲突。

控制冲突只针对branch指令来说,如果两条指令中一条是转移指令且另一条指令是否被执行取决于该转移指令的执行结果,则会产生控制冒险,其本质是对程序计数器PC的冲突访问引起的。具体表现在转移指令在流水线中尚未完成,下一条指令与上一条指令相同操作数的程序计数器PC已经开始取指了,从而流水线执行了不应该执行的指令,且该指令又修改了某寄存器或某存储器的值,造成了跳转后对该寄存器或存储器取出错误的值。

计算机体系结构——中央处理器——流水线技术_https://bianchenghao6.com/blog__第7张
如上图所示,本应跳转到1000地址执行,但却取错三个指令,造成可能的寄存器值修改或控制信号的改变。

  • 解决办法1:在取指阶段引入2拍的流水线阻塞
  • 解决办法2:软件插入nop指令
  • 解决办法3:分支预测
  1. 静态预测
    总是预测条件不满足,即继续执行分支指令的后续指令
    使用启发式规则:在特定情况下预测转移成功,其他情况则不成功
  2. 动态预测
    根据程序执行的具体情况,进行动态预测调整,预测后,在实际发生时验证并调整预测
  • 解决办法4:采用branch指令的延迟槽技术(延迟分支)

属于静态调度技术,由编译器重排指令顺序来实现。

基本思想是把分支指令前面的与分支指令无关的指令调度到分支指令后面执行,以填充延迟时间片(分支延迟槽),找不到可调度的指令时用nop填充。

在定义指令系统的时候就明确转移指令延迟槽指令的执行不依赖于转移指令的结果

3 结构冲突

因硬件资源满足不了指令重叠执行的要求而发生的冲突。即两条指令要同时访问流水线中的同一功能部件,造成资源冲突

如下图所示,在第7个时钟周期,load指令和R型指令同时对寄存器进行写操作。
计算机体系结构——中央处理器——流水线技术_https://bianchenghao6.com/blog__第8张

  • 解决办法
  1. 插入气泡
    抵达/通过某个流水线的指令正常执行,其余指令在各自当前的流水段等待一个周期,以此规整指令的执行
    计算机体系结构——中央处理器——流水线技术_https://bianchenghao6.com/blog__第9张
    但该方法需检测出两条指令在同一时间使用统一部件,造成控制逻辑复杂,且某一周期没有指令完成影响CPI。
  2. 产生冲突的指令增加一个nop阶段
    例如上述冲突可以在R型指令增加一个Mem阶段,但该阶段不执行任何操作。类似store指令、branch指令均可。
    计算机体系结构——中央处理器——流水线技术_https://bianchenghao6.com/blog__第10张
  3. 产生冲突的指令延后一个指令执行
    例如上述冲突中,可以在load指令后加一个nop指令以延迟R型指令的写操作,避免同时对寄存器写。

4. 提高流水线效率的技术

详情见该文指令级并行一节:计算机体系结构——并行性的实现_KGback的博客-CSDN博客_并行实现

5. 基于RISC-V指令集的流水线特征

riscv用户指令集spec:RSIC-V——指令集spec阅读笔记——用户级_KGback的博客-CSDN博客

如图是一个典型的基于RISC-V指令集的五级流水线架构:

计算机体系结构——中央处理器——流水线技术_https://bianchenghao6.com/blog__第11张

(1)RISCV指令集流水线处理器优势:

  1. 指令长度一致,有利于简化取指令和指令译码操作
    RISC-V指令均为32bit指令
  2. 指令格式少,且源寄存器位置固定,有利于在指令未知时就可取操作数
    RISC-V指令的rs1,rs2等位置固定,译码时可直接读取寄存器的值;若位置随指令而变,需先译码确定指令后才能取寄存器编号
  3. RISC-V中只有load / Store指令才能访问存储器,有利于规整流水线
    RISC-V将lw/sw指令地址计算和运算指令执行步骤规整在同一个周期

(2)load指令的流水线过程

risc-v访存指令详解:RSICV——存储器访存指令load/store_KGback的博客-CSDN博客_store指令格式

  1. 每个load指令仍然需要五个时钟周期完成

(3)R-type类型指令的流水线过程

  1. If:   取指令并计算PC+4
  2. id:  从寄存器取数,同时指令在译码器进行译码
  3. ex:   在ALU中对操作数进行计算
  4. wr:   ALU计算的结果写到寄存器

(4)store指令的执行过程

  1. If:取指令并计算PC+4
  2. id:  从寄存器取数,同时指令在译码器进行译码
  3. ex:16位立即数符号扩展后与寄存器值相加,计算主存地址
  4. Mem:将寄存器读出的数据写到主存
  5. Wr:  加一个空的写阶段,使流水线更规整

(5)分支指令的执行过程

  1. If:取指令并计算PC+4
  2. id:  从寄存器取数,同时指令在译码器进行译码
  3. ex:执行阶段
    1)ALU比较两个寄存器值的大小(做减法)
    2)加法器部件中计算转移地址
  4. Mem:如果比较相等,则将转移目标地址写道PC
  5. Wr:  加一个空的写阶段,使流水线更规整

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复