计算机组成与设计04——处理器

目录

系列文章目录

一、引言

1.计算机性能因素

2.基本的MIPS实现(指令部分)

3.CPU 抽象视图

4.MIPS子集的基本实现

二、逻辑设计基础

1.组合单元

2.时钟方法

三、数据通路的建立

1.R型指令

2.存取指令

3.分支指令 

4.简单的数据通路(R型/存取)

5.完整的数据通路(单周期)

四、简单的实现机制

1.ALU控制信号

2.主控单元设计

五、流水线概述

0.MIPS指令流水

1.流水线的性能

2.流水线的加速比及分析

3.流水线冒险

3.1 结构冒险

3.2 数据冒险

(1)前推

(2)前推+停顿

3.3 数据冒险样例

3.4 控制冒险

(1)阻塞

(2)预测

Ⅰ、恒预测不跳转 

Ⅱ、静态分支预测

Ⅲ、动态硬件预测

3.5 流水线冒险样例

六、MIPS流水化的数据通路 

1.流水线寄存器

2.流水线工作方式

2.1 lw/sw指令的流水操作——IF

2.2 lw/sw指令的流水操作——ID

2.3 lw指令的流水操作——EX

2.4 lw指令的流水操作——MEM 

2.5 lw指令的流水操作—— WB

2.6 sw指令的流水操作——EX

2.7 sw指令的流水操作—— MEM

2.8 sw指令的流水操作—— WB

3.流水线图形化 

3.1 多时钟周期流水线图

3.2 传统图示

3.3 单时钟周期流水线图

3.4 流水线性能与时钟周期回顾

3.5 流水线例题 

4.流水线控制信号 

4.1 控制信号说明

4.2 控制信号与数据通路 

七、数据冒险:旁路与阻塞

1.判断范式与前推通路

2.范式修正

3.前推流水线

4.取数-使用:冒险、阻塞与检测

5.冒险(阻塞)流水线通路

八、控制冒险/分支冒险

1.静态预测:预测其不跳转

2.缩短分支迟延

3.动态分支预测

九、阻塞与性能

1.重排指令-延迟槽技术

2.分支指令的预测

3.流水线全图

十、异常与中断

1.MIPS体系结构中的异常处理 

2.带有异常处理的流水线

3.其他异常

十一、指令级并行(ILP) 

1.多发射

2.推测

3.静态多发射

4.动态多发射

5.多发射的有效性

6.能耗效率

十二、谬误和总结

1.谬误

2.总结

总结


系列文章目录

本系列博客重点在深圳大学计算机系统(3)课程的核心内容梳理,参考书目《计算机组成与设计》(有问题欢迎在评论区讨论指出,或直接私信联系我)。

第一章 计算机组成与设计01——计算机概要与技术_@李忆如的博客-CSDN博客

第二章 计算机组成与设计02——指令:计算机的语言_@李忆如的博客-CSDN博客

第三章 计算机组成与设计03——计算机的算术运算_@李忆如的博客-CSDN博客

第四章 计算机组成与设计04——处理器 


梗概

本篇博客主要介绍深入计算机组成与设计第四章处理器的相关知识。


一、引言

1.计算机性能因素

计算机性能因素与其决定因素如下:

2.基本的MIPS实现(指令部分)

一个基本的MIPS的实现方式如下:

指令的执行步骤如下: 

3.CPU 抽象视图

算术逻辑指令、存储访问指令、分支指令的CPU抽象视图分别如下:

​Tips:某个操作的数有多个来源时,需要加入复选器调整视图(如bne、lw、sw)

4.MIPS子集的基本实现

加入后一个MIPS子集的基本实现如下,包含控制信号与复选器。

二、逻辑设计基础

1.组合单元

2.时钟方法

三、数据通路的建立

数据通路:CPU中处理数据和地址的单元部件 Registers ALUs Mux’s Memories …

数据通路部件(datapath element):一个用来操作保存处理器中数据的单元

程序计数器PC:存放下一条指令地址的寄存器

1.R型指令

2.存取指令

Tips:符号扩展不能漏(为增加数据项长度,将原数据项最高位复制到新数据项多出来的高位)。

3.分支指令 

Tips:beq需要左移两位,MIPS中连续字的地址相差4,且字的起始地址为4的倍数(一个地址为8位,即一个字节,一个字有4个字节)。所以,需要将offset_value左移2位,使其表示为字的地址,确保其能正确跳转到正确地址。

4.简单的数据通路(R型/存取)

初步的数据通路在1个时钟周期内完成指令

每个数据通路部件在一个时钟周期内只能处理一条指令 因此需要独立的数据和指令存储器

当不同指令的数据来源不同时,需要使用多选器

5.完整的数据通路(单周期)

Tips:数据通路必须有独立的指令存储器和数据存储器,因为处理器在一个周期内只能操作每个部件一次,而在一个周期内不可能对一个单端口存储器进行两次存取。 

四、简单的实现机制

核心:以MIPS核心指令子集为目标,为数据通路设计控制单元

核心指令: lw, sw, beq, add, sub, and, or, slt, j

1.ALU控制信号

设计单元表示真值表如下:

2.主控单元设计

Tips:增加了指令判断的复选器与ALU控制单元,并标识出了所有控制信号。

控制信号及其含义如下:

加入控制单元后的简单数据通路如下:

各类指令的控制信号如下:

五、流水线概述

单周期处理器缺点:无法应对不同指令路径(处理时间)长短的差异,最慢的路径决定时钟周期,不符合“加快经常性实事件”设计原则。

0.MIPS指令流水

IF: 从内存中取指令

ID: 指令解码& 读寄存器

EX: 执行运算或计算地址

MEM: 访问内存操作

WB: 将结果写回寄存器 

Tips:流水线每一步的流水线周期(Tc)一致,取决于最慢处理步骤。 

1.流水线的性能

对上述例题(lw)进行分析,性能对比如下:

2.流水线的加速比及分析

流水线vs单周期如下:

流水线vs多周期指令如下:

流水线分析:n个段(以5为例)构成了一个指令流水线,一条指令经过每个段

CPI(平均执行周期数)减少到1,平均每个时钟周期发射或完成一条指令

在任意时钟周期,在每个流水段正执行一条指令的一部分

Tips:注意指令是单周期还是多周期,单周期无流水线CPI也是1

单周期 vs 多周期 vs 流水线详见六中3.5 流水线例题 

3.流水线冒险

冒险现象:下一周期不能按时执行下一条指令

①结构冒险(结构相关):所需的部件忙,暂不可用

②数据冒险(数据相关):需要前面某条指令的计算结果,用于本次计算输入

③控制冒险(控制相关):需要根据前面某条指令的结果来确定分支的选择执行 

3.1 结构冒险

定义:缺乏硬件支持导致指令不能在预定的时钟周期内执行的情况

以data access(访存)与instruction fecth(取指)的冒险为例:

Tips:因此,流水实现的MIPS中指令和数据内存必须是分离独立的,两个独立的L1 cache 

3.2 数据冒险

定义:一条指令依赖于前面某条执行的计算结果,缺少指令执行所需数据而导致指令无法在预期的时钟周期内执行。

解决方法如下:

(1)前推

(2)前推+阻塞(停顿)

3.3 数据冒险样例

​Tips:时钟周期即横轴数,本题为13个。

调整后指令如下(减少时钟周期):

3.4 控制冒险

定义:取到的指令不是所需要的(地址变化不是预期)而导致指令不能在预定的时钟周期内执行。

出现原因:决策依赖于一条指令的结果,而其他指令正在执行中(例:下一条指令IF阶段时,分支指令仍在 ID阶段)。

解决控制冒险的方法如下:

(1)阻塞

在分支指令后立即阻塞流水线,避免地址未被计算,样例如下:

分析:在较长流水线中,往往不能在第二级完成分支决策,阻塞(停顿)会带来更大的速度下降。

(2)预测

根据“通过预测提高性能”的设计原则对分支地址进行预测预测,预测错误才需要阻塞。

Ⅰ、恒预测不跳转 

一种简单的预测方法就是总预测分支未发生(不跳转),样例如图:

Ⅱ、静态分支预测

一种更成熟的分支预测是基于典型的行为,预测一些分支发生而预测另一些分支不发生,样例如下:

​Tips:这种分支预测依赖始终不变的行为,没有考虑特定分支指令的特点。

Ⅲ、动态硬件预测

定义:预测取决于每一步分支的行为,并且在整个程序的生命周期内可能改变分支的预测结果。

实现:保存每次分支的历史记录,利用历史记录来预测。

Tips:较长的流水线会恶化预测的性能(各种方法),并提高错误预测的概率。

3.5 流水线冒险样例

Tips:算数指令是要在WB后才写入寄存器,故2需要旁路 

六、MIPS流水化的数据通路 

在单时钟周期中,流水线最多五条指令,因此要把之前的数据通路分为五部分,如图:

图中从左到右的指令流中有两个例外:

(1)写回阶段是写回数据通路中间的寄存器(可能导致数据冒险)

(2)选择PC的下一个值的时候,在自增PC与MEM的分支地址间进行选择(可能导致控制冒险) 

1.流水线寄存器

通过增加保存中间数据(记录前一时钟周期产生的结果)的寄存器,使得指令过程中可以共享部分数据通路,故需要流水线寄存器,确保一条数据通路实现流水线,加入流水线寄存器如图所示:

Tips:流水线寄存器宽度要足够大(64、128、97、64)

补充:每条指令都会更新PC,PC可以看作是一个流水线寄存器:给IF级提供数据,发生异常时必须保存它的内容。

2.流水线工作方式

以lw与sw为例介绍流水线的工作方式与数据通路实现,红圈为数据传输与存储,供之后的指令使用,如图所示:

2.1 lw/sw指令的流水操作——IF

2.2 lw/sw指令的流水操作——ID

Tips:由于处理器并不知道当前是哪一条指令在被译码,因此它把符号扩展后的常量及两个寄存器的值都读入ID/EX寄存器中,简化控制。 

2.3 lw指令的流水操作——EX

2.4 lw指令的流水操作——MEM 

2.5 lw指令的流水操作—— WB

其中,写回寄存器的值是IF/ID流水线寄存器(之前lw的目标寄存器没保存)提供的,但现在的指令是lw后的指令,故写回寄存器的值有问题,需要修正,如图所示:

2.6 sw指令的流水操作——EX

Tips:只有在Sw中才将第二个寄存器的数据写入EX/MEM寄存器。

2.7 sw指令的流水操作—— MEM

2.8 sw指令的流水操作—— WB

3.流水线图形化 

3.1 多时钟周期流水线图

多时钟周期流水线图简单但不包括所有细节,构成了资源(部件)的使用情况图。样例如图所示:

Tips:上图描述的是每个步骤使用的物理资源

3.2 传统图示

3.3 单时钟周期流水线图

单时钟周期流水线图表示的是一个时钟周期内整个数据通路的状态,样例如图:

3.4 流水线性能与时钟周期回顾

3.5 流水线例题 

Ⅰ、几个学生在讨论五级流水线的效率问题。有一个学生指出并非所有流水级中的指令都是活动的。在忽略冒险的情况下,他们做出了以下几个断言,其中哪一个是正确的?

1)允许跳转、分支、ALU指令使用比5级(装载指令需要的级数)更少的级数将在所有情况下增加流水线的性能。

错误,由2)解释。

2)允许一些指令使用更少的级数并不能提高性能,因为吞吐率(单位时间流出的指令数)是由时钟周期决定的。每条指令所需的流水线级数仅影响它的延迟时间,而不影响吞吐率

正确

3)不可能减少ALU指令所需的时钟周期数,因为他们需要写回结果。不过分支和跳转指令是可以减少时钟周期数的,因此存在改善性能的机会。

错误

4)相对于尝试减少指令所需的时钟周期数,我们可以延长流水线的级数,虽然每条指令花费更多的时钟周期数,但时钟周期的长度变短了,这样才能提高性能(吞吐率 = 单位时间 / 时钟周期的长度)。

正确 

Ⅱ、流水线对时钟周期的影响

1.流水线处理器与非流水线处理器的时钟周期分别是多少?

    流水线处理器时钟周期取决于最慢的流水线级:350ps

    非流水线时钟周期为一条指令(单周期):1250ps

2.lw指令在流水线处理器和非流水线处理器中的总延迟分别是多少?

    流水线总延迟:max (250, 350, 150, 300, 200) * 5 = 350ps * 5 = 1750ps

    非流水线:250 + 350 + 150 + 300 + 200 = 1250ps

3.如果可以将原流水线数据通路的一级划分为两级,每级的延迟是原级的一半,那么你会选哪一级进行划分?划分后的时钟周期是多少?

    选择最长的一级划分,即ID

    划分后时钟周期为:300ps 

4.假设没有阻塞和冒险,数据存储器的利用率是多少(占总周期数的百分比)?

    lw与sw使用数据存储器,故利用率为20+15=35%

5.假设没有阻塞和冒险,寄存器堆的写寄存器端口的利用率是多少?

    alu与lw使用写寄存器端口,故利用率为45+20=65%

6.假设一种多周期的处理器设计,其中每条指令需要多个时钟周期完成。但上一条指令完成前不取下一条指令。在这种设计中,指令仅经过其所需的阶段(例如,存储指令仅需4个时钟周期,因为其不需要WB阶段)。比较单周期设计、多周期设计和流水线设计三者的时钟周期和总执行时间。

Tips:beq因为branch在mem中,所以有控制信号,无WB,所以在多周期中为4。

4.流水线控制信号 

流水线控制信号(简化)如图:

Tips:输入ALU control的六位字段为指令立即数的低六位(符号扩展时无变化)。

EX过程中控制信号有:RegDst、ALUOp、ALUSrc,根据这些信息选择结果寄存器(R、I型指令)、ALU操作、并为ALU读取data2或符号扩展后的立即数。 

4.1 控制信号说明

ALUOp信号如下:

其他信号如下:

Tips:控制信号与非流水方式相同的意义,各种指令如下:

4.2 控制信号与数据通路 

流水线控制信号根据指令产生:与单周期实现一样,如图:

Tips:ALUOp分为ALUOp1与ALUOp0,为两个控制信号。 

流水线数据通路如图:

七、数据冒险:旁路与阻塞

1.判断范式与前推通路

部分数据冒险可以通过前推技术来解决 问题:如何发现何时需要将数据前推?

检测是否需要启用前推的范式如下:

冒险样例如下: 

流水线中前推通路如下:

2.范式修正

但是,直接采用总是旁路的方法解决冒险是不对的,某些指令可能不写回寄存器,会产生不必要的旁路。 

故在此添加两个条件:

1.仅当写寄存器才需要前推!(写内存则不必)

即:EX/MEM.RegWrite, MEM/WB.RegWrite

2.$0恒为0,如果目标寄存器是$0 不需前推 避免把$0按非0旁路处理

即:EX/MEM.RegisterRd ≠ 0, MEM/WB.RegisterRd ≠ 0

故此时范式如下:

但此时范式仍存在双重数据冒险的问题,样例与修正如下:

故修正后的MEM冒险范式如下:

核心:只有EX冒险不成立时,才对MEM冒险前推 

Tips:and not中的两个即为EX冒险判断范式 

3.前推流水线

故带有前推功能流水线如图所示:

若考虑带符号立即数作为ALU的输入,需增加一个2:1的MUX,如图: 

4.取数-使用:冒险、阻塞与检测

已知某些数据冒险不能单用旁路解决(lw在MEM后才算出结果),需要阻塞,样例如图(除了一个旁路单元,还需要一个在ID的冒险检测单元,用于插入阻塞):

被阻塞指令

1.ID/EX寄存器控制信号清0,以下流水级执行空操作nop

EX MEM WB

2.PC和IF/ID寄存器值不变

3.重新译码 

被阻塞指令的下一条指令 重新取指 

加入阻塞的样例如图:

5.冒险(阻塞)流水线通路

八、控制冒险/分支冒险

对于控制冒险,本部分在流水线上实现前文提到的几种方法。 

1.静态预测:预测其不跳转

2.缩短分支迟延

一种有效提高分支效率的方法是缩短分支的执行时间。

增加硬件,把分支决策从EX提前到ID级

  计算分支目标地址: 从EX级移到ID级

  判断分支条件: 比较两个寄存器的值 

  修改旁路电路提供寄存器数值、修改冒险电路进行必要的阻塞

    1)是否需要将比较数寄存器从前面指令前推过来: ALU输出 内存数据 如果分支发生则更新PC

    2)如果分支比较的操作数还没准备好,则需要阻塞 

分支指令中同样会出现数据冒险,根据类型需要旁路/阻塞,样例如下: 

分支发生时下一指令会产生气泡,然后跳转到对于PC指令去执行。 

3.动态分支预测

在预测器的选择上:

1-Bit预测器有不足:一个内层循环的分支误判有两次

2-Bit预测器:连续两次误判才改变预测方向 

对于分支地址的计算:

及时完成了预测, 仍然需要计算目标地址

    需要1个时钟周期用于计算分支目标地址

分支目标缓存(BTB, Branch target buffer)

    缓存了近期使用的目标地址 根据分支指令的PC来标识(indexing)

    如果PC匹配并且预测为分支发生,则直接从BTB中去取目标地址而无需计算 

九、阻塞与性能

阻塞降低性能

    指令序列按流水方式正确执行必需的步骤

减少阻塞

    编译器重排(调度)指令序列

        避免冒险及其引起的阻塞

        编译器需要知道流水结构 

1.重排指令-延迟槽技术

分支发生在分支指令之后的第二个时钟周期

    中间间隔一个“分支延迟槽”可以执行无关指令(用不影响分支的一条指令填充到时间片中) 

2.分支指令的预测

3.流水线全图

完整流水线数据通路如图:

十、异常与中断

定义如下:

1.MIPS体系结构中的异常处理 

目前的实现中可能产生的异常是未定义指令的执行算数溢出,异常处理操作如下:

还有另一种机制是向量中断 处理代码的入口根据原因不同而不同,入口处的代码安排: 直接处理中断事件, 或跳转到具体处理代码。

而异常的处理操作如下:

样例如下:

2.带有异常处理的流水线

带有异常处理的流水线如下:

异常的属性如下:

流水线异常的样例如下:

在流水线中,add在EX引发异常,撤销指令并转到处理程序入口,下一时钟周期将读入处理程序入口处的指令(80000180->80000184)

3.其他异常

Ⅰ、同时多异常(一个时钟周期内多个异常)

简单处理方法: 从最早的指令开始处理 将后续指令全部撤销 称为“精确”异常 

维护精确异常非常困难

Ⅱ、非精确异常

直接终止流水线并保存状态

    包括异常原因cause寄存器

由异常处理程序负责找出:

    发生异常的指令

    哪些指令需要完成或者撤销 可能需要“手动”完成

简化硬件, 但需要更复杂的异常处理软件

无法应用于复杂的、多发射的乱序流水线 

十一、指令级并行(ILP) 

1.多发射

多发射:每个流水线级可以启动多条指令

2.推测

推测:为了使依赖于被推测指令的其他指令可以执行,允许编译器或处理器“猜测”指令结果,是挖掘更大ILP的最重要方法。 

Tips:推测可以由软件(指令重排序)硬件(提前缓存指令)完成。

推测中可能会导致本不存在的异常发生,软件处理是加入额外推测支持,硬件处理是简单缓存异常,直到导致异常指令发生。 

而为了改善性能,决定何时加入推测很重要,有静态和动态两种技术:

3.静态多发射

所有静态多发射用编译器帮助封装多条指令并处理冒险

发射包:一个时钟周期内发射多条指令的集合

超长指令字: 一类可以用时启动多个操作的指令集

关于静态多发射的调度如下:

接下来以一个静态双发射的例子来介绍:

流水线图如下:

对于静态双(多)发射的冒险,因为更多指令在同时进行,所以有更多冒险机会。

调度的样例如下:

调度:在静态多发射中指对指令序列重排序,以尽可能地避免流水线阻塞。(假设分支可预测,即控制冒险由硬件处理) 

例子中CPI = 0.8(nop不算指令,因为不能提高真实的性能)

一种从循环中获得更多性能的编译技术叫循环展开,通过重叠不同循环体中的指令获得更高的ILP

寄存器重命名:在循环展开的过程中,编译器引入了几个临时寄存器($t1,$t2,$t3),目的是消除一些虚假的数据依赖。 

4.动态多发射

动态多发射主要依赖于硬件,通常称超标量“Superscalar” 处理器

超标量:可以将每个周期处理器能执行的指令数超过一条 

动态流水线调度允许CPU以乱序方式执行,从而避免阻塞

    但是将结果提交到寄存器是按指令顺序的

样例如下:

动态调度的CPU如下:

对于动态调度需求的原因如下:

推测执行:

预测分支,不阻塞指令发射

    在确定分支预测正确之前,不提交运算结果

取数推测执行

    避免取数和cache miss的延迟 

    不能提交取数的结果,直到确认推测正确 

5.多发射的有效性

6.能耗效率

复杂的动态调度和推测执行需要额外的能耗 使用多个简单处理器核可能更合适

十二、谬误和总结

1.谬误

流水线与实现/工艺技术无关

拙劣的ISA设计使得流水线更困难

2.总结

总结

以上便是绍深入计算机组成与设计第四章处理器的相关知识。在第四章中,主要以计算机系统处理器与流水线的数据通路介绍与实现为主。

物联沃分享整理
物联沃-IOTWORD物联网 » 计算机组成与设计04——处理器

发表评论