【HENU】河南大学计院2024 计算机体系结构 期末复习知识点



头像

和光同尘_我的个人主页

一直游到海水变蓝。

体系结构

  • 第一章:计算机系统基础知识
    • 计算机系统的实质
    • 计算机系统的设计的4个定量原理
      • Amdahl定律
      • CPU性能公式
      • 程序的局部性原理:
  • 第二章:指令系统的设计
    • 指令系统结构的分类
      • 通用寄存器型结构
    • 哈夫曼编码
    • MIPS指令
      • 指令特点
      • 数据寻址方式
      • 三种指令格式
      • MIPS指令操作分为四大类
  • 第三章:流水线技术
    • 流水线概念和分类
    • 流水线的性能指标
      • 吞吐率
      • 加速比
      • 效率
      • 性能指标间的关系
    • 经典5段流水线
    • 流水线相关
      • 数据相关(也称真数据相关)
      • 名相关(反相关、输出相关)
      • 控制相关
    • 流水线冲突
      • 结构冲突
      • 数据冲突
      • 控制冲突的三种软件解决方法
  • 第四章:向量处理机
    • 向量的处理方式
      • 横向水平
      • 纵向垂直
    • 向量处理机典型结构
    • 采用链接技术提高向量处理机性能
  • 第五章:指令级并行及其开发-硬件方法
    • 指令级并行的概念
    • 指令动态调度
    • Tomasulo算法
      • 核心思想
      • 指令执行的步骤:
      • 基于Tomasulo算法的MIPS处理器浮点部件的基本结构:
      • 保留站的7个字段
    • 动态分支预测技术
      • 采用分支历史表 BHT
      • 采用分支目标缓冲器BTB
      • 基于硬件的前瞻执行ROB
      • 采用前瞻执行机制后,指令的执行步骤
    • 多指令流出技术
  • 第6章:指令级并行及其开发-软件方法
    • 软件的静态调度
  • 第7章:存储系统
    • Cache三种映像规则
    • 并行查找实现算法
    • 写策略
    • Cache的性能分析
    • 降低不命中率
      • 三种类型的不命中(3C)
      • 8种降低不命中率优化策略
    • 减少Cache不命中开销

第一章:计算机系统基础知识

计算机系统的实质

  • 确定计算机系统中软硬件的界面,界面之上是软件实现的功能,界面之下是硬件和固件实现的功能
  • 指令集结构:用硬件实现的指令集,软硬件之间的主要界面;

计算机系统设计的4个定量原理:如何优化并提高计算机性能

  • 以经常性事件为重点
  • Amdahl定律(理解原理并能进行简单计算)
  • CPU性能公式(三个参数:时钟周期时间、CPI、IC):理解不同方案性能的提高程度;
  • 程序的局部性原理

计算机系统的实质

确定计算机系统中软硬件的界面,界面之上是软件实现的功能,界面之下是硬件和固件实现的功能。

指令集结构:用硬件实现的指令集,软硬件之间的主要界面

计算机系统的设计的4个定量原理

以经常性事件为重点:对经常发生的情况采用优化方法的原则进行选择,以得到更多的总体上的改进

  • 优化是指分配更多的资源、达到更高的性能或者分配更多的电能等。
  • 加快经常事件,整体事件时间减少很多

Amdahl定律

系统性能加速比(定量指标

  • 加速比依赖于两个因素

    • 可改进比例(Fe):在改进前的系统中,可改进部分的执行时间在总的执行时间中所占的比例。它总是小于等于1。

    例如:一个需运行60秒的程序中有20秒的运算可以加速,那么这个比例就是20/60。

    部件加速比(Se)(引入该参数) :可改进部分改进以后性能提高的倍数。它是改进前所需的执行时间与改进后执行时间的比。一般情况下部件加速比是大于1的。

例如:若系统改进后,可改进部分的执行时间是2秒,而改进前其执行时间为5秒,则部件加速比为5/2。

  • 改进前程序的总执行时间:T0:未改进比例 1-Fe + 改进的比例 Fe
  • 改进后程序的总执行时间:Tn:未改进比例 1-Fe + 改进的比例 Fe / Se

即:Tn=T0( 1-Fe+ Fe / Se )

  • 系统加速比:Sn 为改进前与改进后总执行时间之比 Sn=T0 / Tn=1 / (1-Fe+ Fe / Se )

Amdahl定律:一种性能改进的递减规则,如果仅仅对计算任务中的一部分做性能改进,则改进得越多,所得到的总体性能的提升就越有限。

  • 重要推论:如果只针对整个任务的一部分进行改进和优化,那么所获得的加速比不超过:1/(1-Fe

例1.2 某计算机系统采用浮点运算部件后,使浮点运算速度提高到原来的25倍,而系统运行某一程序的整体性能提高到原来的4倍,试计算该程序中浮点操作所占的比例。

CPU性能公式

执行一个程序所需的CPU时间

CPU时间 = 执行程序所需的时钟周期数×时钟周期时间

  • 其中时钟周期时间是系统时钟频率的倒数

每条指令执行的平均时钟周期数CPI = 执行程序所需的时钟周期数/IC

  • IC:所执行的指令条数

程序执行的CPU时间可以写成

CPU时间 = IC ×CPI ×时钟周期时间

  • 时钟周期时间:取决于硬件实现技术和计算机组成
  • CPI:取决于计算机组成和指令系统的结构
  • IC:取决于指令系统的结构和编译技术

假设:计算机系统有n种指令, C P I i CPI_i CPIi表示第i种指令的处理时间, I C i IC_i ICi表示在程序中第i种指令出现的次数

C P U 时钟周期数 = ∑ i = 1 n ( C P I i × I C i ) CPU时钟周期数 =\sum_{i=1}^n (CPI_i×IC_i) CPU时钟周期数=i=1n(CPIi×ICi)

C P I = 时钟周期数 I C = ∑ i = 1 n ( C P I i × I C i ) I C = ∑ i = 1 n ( C P I i × I C i I C ) CPI= \frac{时钟周期数}{IC}=\frac{\sum_{i=1}^n (CPI_i×IC_i)}{IC}=\sum_{i=1}^n (CPI_i×\frac{IC_i}{IC}) CPI=IC时钟周期数=ICi=1n(CPIi×ICi)=i=1n(CPIi×ICICi)

  • (ICi / IC)反映了第i种指令在程序中所占的比例。

程序的局部性原理:程序执行时所访问的存储器地址分布不是随机的,而是相对地簇聚(程序执行时间的90%都是在执行程序中10%的代码)。

例1.3 假设FP(浮点数操作)指令的比例为25%,其中,FPSQR(浮点数平方根操作)占全部指令的比例为2%FP操作的CPI4, FPSQR操作的CPI20 ,其他指令的平均CPI1.33。现有两种改进方案,第一种是把FPSQR操作的CPI减至2,第二种是把所有的FP操作的CPI减至2,试比较两种方案对系统性能的提高程度。

没有改进之前,每条指令的平均时钟周期CPI为:

C P I = ∑ i = 1 n ( C P I i × I C i I C ) = ( 4 × 25 % ) + ( 1.33 × 75 % ) = 2 CPI=\sum_{i=1}^n (CPI_i×\frac{IC_i}{IC})=(4×25\%)+(1.33×75\% )=2 CPI=i=1n(CPIi×ICICi)=(4×25%)+(1.33×75%)=2

(1)采用第一种方案: FPSQR操作的CPI由 C P I F P S Q R = 20 CPI_{FPSQR}=20 CPIFPSQR20 减至 C P I F P S Q R ′ = 2 CPI'_{FPSQR}=2 CPIFPSQR2

则整个系统的指令平均时钟周期数为: C P I 1 = C P I − ( C P I F P S Q R − C P I F P S Q R ′ ) × 2 % = 2 − ( 20 − 2 ) × 2 % ≈ 1.64 CPI_1=CPI-(CPI_{FPSQR}-CPI'_{FPSQR})× 2\% =2-(20-2) ×2\% ≈ 1.64 CPI1CPICPIFPSQRCPIFPSQR×2%2(202)×2%1.64

(2)采用第二种方案: 所有FP操作的CPI由 C P I F P = 4 CPI_{FP}=4 CPIFP4减至 C P I F P ′ = 2 CPI'_{FP}=2 CPIFP2,则整个系统的指令平均时钟周期数为(FPSQR操作不改变):

C P I 2 = C P I − ( C P I F P − C P I F P ′ ) × 25 % = 2 − ( 4 − 2 ) × 25 % = 1.5 CPI_2=CPI-(CPI_{FP}-CPI'_{FP})× 25\%=2-(4-2) ×25\% = 1.5 CPI2CPICPIFPCPIFP×25%2(42)×25%=1.5

从降低整个系统的指令平均时钟周期数的程度来看,第二种方案优于第一种方案。

程序的局部性原理:

程序执行时所访问的存储器地址分布不是随机的,而是相对地簇聚(程序执行时间的90%都是在执行程序中10%的代码)。

  • 程序的时间局部性:程序即将用到的信息很可能就是目前正在使用的信息。
  • 程序的空间局部性:程序即将用到的信息很可能与目前正在使用的信息。在空间上相邻或者临近。
  • 优化策略:cache引入,提高内存和CPU之间的访问效率
  • 局部性实例:例如for循环

第二章:指令系统的设计

了解指令系统结构三种类型:堆栈结构、累加器结构、通用寄存器结构

哈夫曼编码基本思想

  • 缩短编码长度;
  • 理解并掌握指令操作码的优化(计算案例)

掌握并能灵活应用常用的MIPS指令

  • MIPS指令特点(浮点寄存器与整数寄存器)、数据寻址方式
  • MIPS三种指令格式:I类指令、R类指令、J类指令
  • MIPS指令操作分为四大类:Load、分支与跳转、…、…

指令系统结构的分类

区别不同指令系统结构的主要因素:

CPU中用来存储操作数的存储单元的类型

CPU中用来存储操作数的存储单元(指令使用的数据)

  • 堆栈
  • 累加器
  • 通用寄存器组

根据操作数的来源不同,又可进一步分为:

  • 寄存器-存储器结构(RM结构)(操作数可以来自存储器 )
  • 寄存器-寄存器结构(RR结构)(所有操作数都是来自通用寄存器组)

也称为load-store结构,这个名称强调:只有load指令和store指令能够访问存储器。

表达式Z=X+Y在4种类型指令系统结构上的代码

通用寄存器型结构

现代指令系统结构的主流

在灵活性和提高性能方面有明显的优势

  • 寄存器的访问 速度比存储器快。
  • 对编译器而言,能更加容易、有效地分配和使用 寄存器。
  • 寄存器可以用来存放变量。

(1)减少对存储器的访问,加快程序的执行速度;(因为寄存器比存储器快)(例如for循环中的自变量)

(2)用更少的地址位(相对于存储器地址来说)来对寄存器进行寻址,从而有效地减少程序的目标代码的大小。

在 RISC 中,存储指令一般通过寄存器间接寻址的方式访问存储器

哈夫曼编码

操作码优化的程度可以用信息熵来衡量 H = − ∑ i = 1 n p i l o g 2 p i H=-\sum^n_{i=1} p_i log_2 p_i H=i=1npilog2pi

H即为用二进制编码表示n个码点时, 理论上的最短平均编码长度

哈夫曼编码的基本思想: 缩短编码长度, 利用字符的出现频率, 通过变长编码给高频字符分配短码, 低频字符分配长码, 实现整体编码长度最短。

例2.1 假设某模型机有7条指令,这些指令的使用频度如表所示。

(1) 计算这7条指令的操作码编码的最短平均码长;

(2) 画出哈夫曼树,写出这7条指令的哈夫曼编码,并计算该编码的平均码长和信息冗余量。

解 (1)这7条指令的操作码编码的最短平均码长

H = − ∑ i = 1 7 p i l o g 2 p i = 2.17 H=-\sum^7_{i=1} p_i log_2 p_i=2.17 H=i=17pilog2pi=2.17

哈夫曼编码的平均码长: H = ∑ i = 1 7 p i l i = 0.4 × 1 + 0.3 × 2 + 0.15 × 3 + 0.05 × 5 + 0.04 × 5 + 0.03 × 5 + 0.03 × 5 = 2.20 H=\sum^7_{i=1} p_i l_i=0.4×1+0.3×2+0.15×3+0.05×5+0.04×5+0.03×5+0.03×5=2.20 H=i=17pili=0.4×1+0.3×2+0.15×3+0.05×5+0.04×5+0.03×5+0.03×5=2.20

哈夫曼编码优缺点:可以减少操作码的平均位数,但所获得的编码是变长度的,不规整,不利于硬件处理

扩展操作码: 位于定长二进制编码和哈夫曼编码之间的一种编码方案。

用两位的00、01、10分别用于表示使用频度高的I1、I2、I3,然后用11作为高位扩展出4个4位的二进制编码,用于表示剩下的4条指令。

平均码长 H = ∑ i = 1 7 p i l i = 2.3 H=\sum^7_{i=1} p_i l_i=2.3 H=i=17pili=2.3

信息冗余量: 操作码的平均码长 − H 操作码的平均码长 \frac{操作码的平均码长-H}{操作码的平均码长} 操作码的平均码长操作码的平均码长H

哈夫曼编码: ( 2.2 − 2.17 ) / 2.2 ≈ 1.36 % (2.2-2.17)/2.2≈1.36\% (2.22.17)/2.21.36%

3位定长编码: ( 3 − 2.17 ) / 3 ≈ 28 % (3-2.17)/3≈28\% (32.17)/328%

拓展编码: ( 2.3 − 2.17 ) / 2.3 ≈ 5.56 % (2.3-2.17)/2.3≈5.56\% (2.32.17)/2.35.56%

MIPS指令

指令特点

特点: ALU指令的源和目标操作数都存放在寄存器中,只能通过Load和Store指令访问存储器,因此被称为Load-Store指令集结构;易于流水设计;寻址方式简单;操作简单

MIPS64 寄存器特点:

  • 32个64位通用寄存器(GPRs)

R0,R1,…,R31, 也称为整数寄存器, R0的值永远是0

  • 32个64位浮点数寄存器(FPRs)

F0,F1,…,F31, 用来存放32个单精度浮点数(32位),也可以用来存放32个双精度浮点数(64位)。存储单精度浮点数(32位)时,只用到FPR的一半,其另一半没用。

数据寻址方式

MIPS数据寻址方式的特点:

  • 立即数寻址与偏移量寻址, 立即数字段和偏移量字段都是16位的。
  • 寄存器间接寻址是通过把0作为偏移量来实现的;
  • 16位绝对寻址是通过把R0(其值永远为0)作为基址寄存器来完成的;

注意:

  • MIPS的存储器是按字节寻址的,地址为64位;
  • GPRS和FPRS之间的数据传送都是通过load和store指令来完成的。
  • 所有存储器访问都必须是边界对齐的。
  • 寻址方式编码到操作码中, 操作码占6

MIPS数据寻址方式支持4种:

  • 寄存器寻址:如ADD R1, R2;
  • 立即数寻址:ADD R1, R2, #42,#42表示立即数。
  • 偏移寻址: ADD R1, R2, 42(R3)
  • 寄存器间接寻址: ADD R1, R2, 0(R3),0偏移量可以省略;

三种指令格式

3种格式中,同名字段的位置固定不变。所有指令32位,操作码6位。固定长度

  • I 类指令(立即数类型):
    用于加载(load)、存储(store)、分支、寄存器跳转(修改pc)、链接跳转(函数调用)

格式:[op(操作码), rs, rt, immediate(立即数)]

rs: 源操作数寄存器编号 rt: 目标寄存器编号

load指令

访存有效地址:Regs[rs]+immediate

从存储器取来的数据放入寄存器rt

store指令

访存有效地址:Regs[rs]+immediate

要存入存储器的数据放在寄存器rt中

  • R 类指令(寄存器类型):
    用于算术运算等操作,格式:[op, rs, rt, rd, shamt, funct]

包括ALU指令,专用寄存器读/写指令,move指令等

所有的操作数来自寄存器

rs、rt分别表示源寄存器1和源寄存器2,rd表示目标寄存器,shamt字段用于移位操作,funct字段指定具体的操作类型。

ALU指令

Regs[rd]← Regs[rs] funct Regs[rt]

funct为具体的运算操作编码

  • J 类指令(无条件转移):
    包括跳转指令,跳转并链接指令,自陷指令,异常返回指令。在这类指令中,指令字的低26位是偏移量,左移两位,它与PC值相加形成跳转的地址。

格式:[op, address]
例如:j label

MIPS指令操作分为四大类

  • Load/Store 指令:加载和存储数据,例如 lwsw
  • 分支与跳转指令:条件或无条件跳转,例如 beqj
  • 算术与逻辑指令 (ALU 操作) :如 addsubandor
  • 浮点操作指令

符号的意义

  • x←ny:从y传送n位到x
  • x,y←z:把z传送到x和y

下标:表示字段中具体的位;

  • 对于指令和数据,按从最高位到最低位(即从左到右)的顺序依次进行编号,最高位为第0位,次高位为第1位,依此类推。
  • 下标可以是一个数字,也可以是一个范围。
  • 例如:Regs[R4]0:寄存器R4中内容的符号位

Regs[R4]56-63:共63-56+1=8位,寄存器R4内容的最低一个字节

Mem:表示主存

  • 按字节寻址,可以传输任意个字节。

上标:用于表示对字段进行复制的次数。

  • 例如:032:一个32位长的全0字段

第三章:流水线技术

流水线相关概念、分类

  • 部件级、处理机级及处理机间流水线
  • 单功能流水线与多功能流水线
  • 静态流水线与动态流水线
  • 线性流水线与非线性流水线
  • 顺序流水线与乱序流水线

掌握并应用流水线的性能指标

  • 各段时间均等与不均等的计算;
  • 吞吐率、加速比、效率
  • 静态与动态流水线分析举例

流水线的相关

  • 经典流水线的5个阶段及其作用
  • 相关的三种类型:数据相关、名相关、控制相关

流水线冲突

  • 三种:结构冲突、数据冲突、控制冲突——基本概念
  • 三种数据冲突:RAW、WAR、WAW
  • 控制冲突的三种软件解决方法:减少分支延迟、预测分支失败/成功、延迟槽技术

流水线概念和分类

流水线技术:

  • 把一个重复的过程分解为若干个子过程,每个子过程由专门的功能部件来实现。
  • 把多个处理过程在时间上错开,依次通过各功能段,这样,每个子过程就可以与其它的子过程并行进行。

流水线中的每个子过程及其功能部件称为流水线的级或段,段与段相互连接形成流水线。流水线的段数称为流水线的深度

流水技术的特点

  • 流水线把一个处理过程分解为若干个子过程(段),每个子过程由一个专门的功能部件来实现。
  • 流水线中各段的时间应尽可能相等,否则将引起流水线堵塞、断流。

时间最长的段将成为流水线的瓶颈

  • 流水线每一个段的后面都要有一个缓冲寄存器(锁存器),称为流水寄存器

作用:在相邻的两段之间传送数据,以保证提供后面要用到的信息,并把各段的处理工作相互隔离。(先完成的部件暂存结果数据而不必要等待下一个段的工作再继续自己当前的工作)

  • 通过时间:第一个任务从进入流水线到流出结果所需的时间。
  • 排空时间:最后一个任务从进入流水线到流出结果所需的时间。

流水线的分类:

  1. 部件级、处理机级及处理机间流水线
  2. 单功能流水线与多功能流水线
  3. 静态流水线与动态流水线
  4. 线性流水线与非线性流水线
  5. 顺序流水线与乱序流水线
  6. 标量处理机与向量流水处理机

流水线的性能指标

吞吐率加速比效率

吞吐率

在单位时间内流水线所完成的任务数量或输出结果的数量 T P = n / T k TP=n/T_k TP=n/Tk

n:任务数 Tk:处理完成n个任务所用的时间

各段时间均相等的流水线中,设单位时间∆t,段数为k,完成n个任务需要的时间Tk

T k = k Δ t + ( n - 1 ) Δ t = ( k + n - 1 ) Δ t T_k=kΔt+(n-1)Δt=(k+n-1)Δt TkkΔt(n1)Δt(kn1)Δt

流水线的实际吞吐率: T P = n ( k + n − 1 ) Δ t TP = \frac{n}{(k+n-1)Δt} TP=(k+n1)Δtn最大吞吐率: T P m a x = lim ⁡ n → ∞ n ( k + n − 1 ) Δ t = TP_{max} =\lim_{n→∞} \frac{n}{(k+n-1)Δt}= TPmax=limn(k+n1)Δtn= 1 Δ t \frac{1}{Δt} Δt1

即有 T P = n k + n − 1 T P m a x TP = \frac{n}{k+n-1}TP_{max} TP=k+n1nTPmax,只有当n>>k时,才有TP≈TPmax

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

最大吞吐率 T P m a x = 1 m a x ( Δ t 1 , Δ t 2 , ⋅ ⋅ ⋅ , Δ t k ) TP_{max}=\frac{1}{max(Δt_1,Δt_2,···,Δt_k)} TPmax=max(Δt1,Δt2,⋅⋅⋅,Δtk)1

例如:一条4段的流水线中,S1,S3,S4各段的时间:ΔtS2的时间:3Δt (瓶颈段),最大吞吐率为:

T P m a x = 1 3 Δ t TP_{max}=\frac{1}{3Δt} TPmax=t1

加速比

完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比

假设:不使用流水线(顺序执行)所用的时间为Ts,使用流水线后所用的时间为Tk,则该流水线的加速比 S = T s T k S=\frac{T_s}{T_k} S=TkTs

各段时间均相等的流水线中,流水线的实际加速比 S = T s T k = n k Δ t ( k + n − 1 ) Δ t = S=\frac{T_s}{T_k}=\frac{nkΔt}{(k+n-1)Δt}= S=TkTs=(k+n1)ΔtnkΔt= n k k + n − 1 \frac{nk}{k+n-1} k+n1nk

最大加速比 S m a x = lim ⁡ n → ∞ n k k + n − 1 = S_{max}=\lim_{n→∞}\frac{nk}{k+n-1}= Smax=limnk+n1nk= k k k

效率

流水线中的理论运行时间实际运行时间的比值,即流水线设备的利用率,即时空图上n个任务占用的时空面积和

k个段总的时空面积之比

各段时间均相等的流水线中,整条流水线的效率 E = e 1 + e 2 + ⋅ ⋅ ⋅ + e k k = e 1 = n Δ t T k = E=\frac{e_1+e_2+···+e_k}{k}=e_1=\frac{nΔt}{T_k}= E=ke1+e2+⋅⋅⋅+ek=e1=TknΔt= n k + n − 1 \frac{n}{k+n-1} k+n1n

nΔt: n个任务,每个段被使用n次,共使用时间为nΔt

最高效率 E m a x = lim ⁡ n → ∞ n k + n − 1 = E_{max}=\lim_{n→∞}\frac{n}{k+n-1}= Emax=limnk+n1n=1

各段时间不完全相等的流水线中,先求出每个段的效率,然后求所有段的效率和

性能指标间的关系

当流水线各段时间相等时,流水线的效率E与吞吐率TP成正比,是流水线的实际加速比S与它的最大加速比k的比值

S = k ⋅ E = k ⋅ T P ⋅ △ t S=k·E=k·TP·△t S=kE=kTPt

经典5段流水线

  1. 取指令周期 IF (Instruction Fetch)

以程序计数器PC中的内容作为地址,从存储器中取出指令并放入指令寄存器IR

同时PC值加4(假设每条指令占4个字节),指向顺序的下一条指令。

  1. 指令译码/读寄存器周期 ID (Instruction Decode)

对指令进行译码,并用IR中的寄存器地址去访问通用寄存器组,读出所需的操作数。

  1. 执行/有效地址计算周期 EX (Execute)

寄存器-立即数ALU指令ALU按照操作码指定的操作对从通用寄存器组中读出的操作数和指令中给出的立即数进行运算。

分支指令ALU把指令中给出的偏移量与PC值相加,形成转移目标的地址。同时,对在前一个周期读出的操作数进行判断,确定分支是否成功。

  1. 存储器访问/分支完成周期 MEM (Memory Access)

该周期处理的指令只有loadstore分支指令

  • load和store指令

load指令:用上一个周期计算出的有效地址从存储器中读出相应的数据;

store指令:把指定的数据写入这个有效地址所指出的存储器单元。

  • 分支指令

分支“成功”,就把转移目标地址送入PC。

分支指令执行完成。

  1. 写回周期 WB (Write Back)

ALU运算指令和load指令在这个周期把结果数据写入通用寄存器组

PC:程序计数器,存放当前指令的地址。

NPC:下一条程序计数器,存放下一条指令的地址。

IR:指令寄存器,存放当前正在处理的指令。

A:第一操作数寄存器,存放从通用寄存器组读出来的操作数。

B:第二操作数寄存器,存放从通用寄存器组读出来的另一个操作数。

Imm:存放符号扩展后的立即数操作数。

Cond:存放条件判定的结果。为“真”表示分支成功。

ALUo:存放ALU的运算结果。

LMD:存放load指令从存储器读出的数据。

请认真观察流水实现的数据通路图。完成以下内容:

请按照经典5段流水线的工作原理解析下面三条指令在上图数据通路中的实现。

  1. ADD R1,R2,R3
  2. load F6, 0(R6)
  3. IF (a>100) { } //只分析IF分支指令

1、ADD R1,R2,R3

IF段,将ADD指令取出放入IR寄存器。

ID段译码,将将源操作数R2,R3送入运算器的两端;

EX段,R1+R2,经ALU输出。

MEM段,无用;

WB 段通过ALUo输出写回通用寄存器R1。

2、 load F6, 0(R6)

IF段,将load指令取出放入IR寄存器。

ID段译码,将立即数符号扩展后送入ALU的一段, R6通过A口送入运算器的另一端,源操作数就绪;

EX段,立即数与R6内容相加,经ALU输出。MEM段,通过ALUo作为访存地址寻址到该单元;WB 段将寻址到的内容单元的内容写回通用寄存器F6。

3、IF (a>100) { } //只分析IF分支指令

IF段,将A分支指令取出放入IR寄存器。

ID段译码,将源操作数a和符号扩展后的立即数送往运算器的两端;

EX段,执行a-100,若条件成立,则修改cound=1;

MEM段完成分支目标地址返回IF段多路选择器,从而确定NPC的值;若分支失败,则cound=0,在多路选择器选择PC+4;

WB段,无用;

流水线相关

相关:两条指令之间存在某种依赖关系,如果两条指令相关,则它们就有可能不能在流水线中重叠执行或者只能部分重叠执行。

相关有3种类型

数据相关(也称真数据相关)

  • 对于两条指令i(在前,下同)和j(在后,下同),如果下述条件之一成立,则称指令j与指令i数据相关

指令j使用指令i产生的结果;

指令j与指令k数据相关,而指令k又与指令i数据相关。(数据相关具有传递性)

  • 数据相关反映了数据的流动关系,即如何从其产生者流动到其消费者。
  • 例:下面这一段代码存在数据相关。

名相关(反相关、输出相关)

  • :指令所访问的寄存器或存储器单元的名称。
  • 如果两条指令使用相同的名,但是它们之间并没有数据流动,则称这两条指令存在名相关
  • 指令j与指令i之间的名相关有两种(j后进入):

反相关指令j写的名=指令i读的名

输出相关指令j写的名=指令i写的名

  • 名相关的两条指令之间并没有数据的传送。如果一条指令中的名改变了,并不影响另外一条指令的执行,所以可以用换名技术消除名相关,改变指令中操作数的名,对于寄存器操作数进行换名称为寄存器换名

控制相关

  • 控制相关是指由分支指令引起的相关。

为了保证程序应有的执行顺序,必须严格按控制相关确定的顺序执行。

  • 典型的程序结构是“if-then”结构。

if p1 和 if p2 编译成目标代码以后都是分支指令。语句S1与p1控制相关,S2与p2控制相关,S与p1和p2均无关。

  • 与一条分支指令控制相关的指令不能被移到该分支之前。否则这些指令就不受该分支控制了。

对于上述的例子,then 部分中的指令不能移到if语句之前。

  • 如果一条指令与某分支指令不存在控制相关,就不能把该指令移到该分支中。

对于上述的例子,不能把S移到if语句的then 部分中。

流水线冲突

流水线冲突是指对于具体的流水线来说,由于相关的存在,使得指令流中的下一条指令不能在指定的时钟周期执行。

流水线冲突有3种类型:

  • 结构冲突:因硬件资源满足不了指令重叠执行的要求而发生的冲突。
  • 数据冲突:当指令在流水线中重叠执行时,因需要用到前面指令的执行结果而发生的冲突。
  • 控制冲突:流水线遇到分支指令和其它会改变PC值的指令所引起的冲突。

避免冲突:停顿一些指令的执行,当一条指令被暂停时,在该暂停指令之后流出的所有指令都=被暂停,而在该暂停指令之前流出的指令则继续进行(否则就永远无法消除冲突)

结构冲突

在流水线处理机中,为了能够使各种组合的指令都能顺利地重叠执行,需要对功能部件进行流水或重复设置资源。

如果某种指令组合因为资源冲突而不能正常执行,则称该处理机有结构冲突

常见的导致结构冲突的原因:

  • 功能部件不是完全流水
  • 资源份数不够

举例:访存冲突

有些流水线处理机只有一个存储器,将数据和指令放在一起,访存指令会导致访存冲突

  • 解决办法Ⅰ:(停顿指令)

插入暂停周期(“流水线气泡”或“气泡”),引入暂停后的时空图

为消除结构冲突引入的停顿将推迟流水线的完成时间,从而影响流水线的性能

  • 解决方法Ⅱ: (增加硬件资源)

设置相互独立的指令存储器和数据存储器或设置相互独立的指令Cache和数据Cache。

会增加了硬件损失

数据冲突

当相关的指令靠得足够近时,它们在流水线中的重叠执行或者重新排序会改变指令读/写操作数的顺序,使之不同于它们串行执行时的顺序,则发生了数据冲突。

根据指令读访问和写访问的顺序,可以将数据冲突分为3种类型。(两条指令i和j ,且i在j之前进入流水线)

写后读冲突(RAW)(i写、j读) 数据真相关

  • 后指令需要读取前指令尚未写完的值

DDIV在流水线中可能尝试读取 R1 的值,

但DADD 尚未完成对 R1 的写入。

读后写冲突(WAR)(I读、j写)

  • 后指令修改了前指令尚未读出的值
  • 这种冲突仅发生在这样的情况下:

有些指令的写结果操作提前了,而且有些指令的读操作滞后了

指令被重新排序了

写后写冲突(WAW)(i写、j写)

  • 两条指令试图写入同一个寄存器,后一条指令的结果被前一条指令的结果覆盖。 这种冲突对应于输出相关。
  • 写后写冲突仅发生在这样的流水线中:

流水线中不只一个段可以进行写操作;

指令被重新排序了。(乱序的流水线)

  • 前面介绍的5段流水线不会发生写后写冲突。(只在WB段写寄存器)

控制冲突的三种软件解决方法

控制冲突:控制流改变(分支指令)造成的延迟

把由分支指令引起的延迟称为分支延迟

三种通过软件(编译器)来减少分支延迟的方法:减少分支延迟预测分支成功/失败延迟槽

  • 对分支的处理方法在程序的执行过程中始终是不变的,是静态的(编译时完成的)。
  • 要么总是预测分支成功,要么总是预测分支失败。

减少分支延迟

  • 分支指令的条件测试和分支目标地址计算是在EX段完成,对PC的修改是在MEM段完成。它所带来的分支延迟是3个时钟周期。
  • 把上述工作提前到ID段进行

在ID段增设一个加法器:计算分支目标地址

把条件测试“=0?”的逻辑电路移到ID段

这些结果直接回送到IF段的MUX1

改进后的流水线对分支指令的处理:

预测分支有两种结果

  • 预测分支失败

    允许分支指令后的指令继续在流水线中流动,就好象什么都没发生似的;

    若确定分支失败,将分支指令看作是一条普通指令,流水线正常流动;

  • 预测分支成功

    当流水线检测到分支指令后,一旦计算出了分支目标地址,就开始从该目标地址取指令执行。

    注意:这和预测分支失败不是一种方法;

延迟槽

分支延迟槽是指分支指令后面紧跟的一个或多个指令,在分支条件计算结果未确定时,处理器仍然会执行这些指令。编译器通过将无关紧要的指令插入到分支指令后面,使得这些指令可以在等待分支判断结果时执行,从而减少等待时间。

第四章:向量处理机

向量处理机概念

向量处理机+流水线=向量处理机

向量处理机的两种方式(横向水平和纵向垂直两种方式);

  • 二者的特点差别(数据相关、功能切换、适用场景)

提高向量处理的性能方法

  • 连接技术:加快向量指令的执行;
    • 两条向量指令占用功能流水线…寄存器的4种情况
      • 指令相关、功能部件冲突、源寄存器冲突、结果寄存器冲突
    • 在Cray-1是用连接技术进行…,如何分析是…情况的执行时间

向量的处理方式

以计算表达式 D=A×(B-C)为例 A、B、C、D ── 长度为 N 的向量

横向水平

数据相关和功能切换随着向量长度增长而增长,硬件开销过大,不适合于向量处理机的并行处理

纵向垂直

缺点:若纵向处理向量太长,向量寄存器个数较少无法处理

向量处理机典型结构

  • 存储器-存储器型结构

    多个独立的存储器模块并行工作

    纵向处理方式采用

  • 寄存器-寄存器型结构

    运算通过向量寄存器进行

    分组处理方式采用

采用链接技术提高向量处理机性能

采用链接技术,加快一串向量指令的执行;

  • 两条向量指令占用功能流水线和向量寄存器的4种情况
  • 指令不相关

例如:
V0←V1+V2
V6←V4 * V5

这两条指令分别使用各自所需的流水线和向量寄存器,可以并行执行。

  • 功能部件冲突

例如:
V3←V1+V2
V6←V4+V5

这两条指令都要使用加法流水线,发生了功能部件冲突(但向量寄存器不冲突)。当第一条指令流出时,占用加法流水线。第二条指令要等加法流水线变成空闲后,才能流出。

  • 源寄存器冲突

例如:
V3←V1+V2
V6←V1 * V4

这两条向量指令的源向量之一都取自V1。由于两者的首元素下标可能不同,向量长度也可能不同,所以难以由V1同时提供两条指令所需要的源向量。

这两条向量指令不能同时执行。只有等第一条向量指令执行完、释放V1之后,第二条向量指令才能开始执行

  • 结果寄存器冲突

例如:
V4←V1+V2
V4←V3 * V5

这两条指令都要访问目的寄存器V4。由于第一条指令在先,所以它先占用V4直到运算完成,然后再流出后一条指令

当前一条指令的结果寄存器是后一条指令的源寄存器、且不存在任何其他冲突时,就可以用链接技术来提高性能

例如:
V3←V1+V2
V6←V3 * V4

向量流水线链接:具有先写后读相关的两条指令,在不出现功能部件冲突和源向量冲突的情况下,可以把功能部件链接起来进行流水处理,以达到加快执行的目的。

CRAY-1上用链接技术进行向量运算

链接特性的实质:把流水线定向的思想引入到向量执行过程的结果。

第五章:指令级并行及其开发-硬件方法

指令级并行概念

  • 开发ILP的两种途径(资源重复,流水线技术);
  • 开发ILP的方法
    • 基于硬件的动态开发方法,基于软件的静态开发方法:

流水线研究的并行技术以及所克服的停顿

  • 流水线调度、循环展开、寄存器换名、指令动态调度、动态分支预测、瞻、多指令流出;

衡量流水线最高性能指标(CPI)

  • 实际CPI和理想CPI的关系;

指令动态调度

  • 相关概念
  • Tomasulo算法基本原理、基本思想
  • 算法的三个阶段(流出、执行、写回)
  • 基于Tomasulo算法的MIPS处理器浮点部件的基本结构的工作原理及相应指令分析
  • 保留站7个字段的含义及其对应指令的应用

动态分支预测技术

  • 几种方法:采用分支历史表BHT、分支目标缓冲器BTB、基于硬件的前瞻执行
  • 前瞻执行基本思想(ROB)与Tomasulo算法的联系与区别
  • 前瞻执行基本思想(ROB)的4个阶段:流出、执行、写记过、确认

多指令流出技术

  • 引入目的:提高CPI
  • 常用的技术:超流水线、超长指令字VLIW

指令级并行的概念

指令级并行:指指令之间存在的一种并行性,利用它,计算机可以并行执行两条或两条以上的指令。(前提是不相关)(ILP:Instruction-Level Parallelism)

开发ILP的两种途径

  • 资源重复,重复设置多个处理部件,让它们同时执行相邻或相近的多条指令;
  • 采用流水线技术,使指令重叠并行执行。

流水线研究的并行技术以及所克服的停顿

技术所克服的停顿
基本流水线调度数据先写后读相关停顿
循环展开控制相关停顿
寄存器换名数据写后写和先读后写相关停顿
指令动态调度(记分牌和Tomasulo算法)各种数据相关停顿
动态分支预测控制相关停顿
前瞻所有数据/控制相关停顿
多指令流出(超标量和超长指令字)提高理想CPI

开发ILP的方法

  • 主要基于硬件的动态开发方法
  • 基于软件的静态开发方法

流水线处理机的实际CPI(执行一条指令所需要的时钟周期数)

  • 理想流水线的CPI加上各类停顿的时钟周期数:

CPI流水线 = CPI理想 + 停顿结构冲突 + 停顿数据冲突 + 停顿控制冲突

  • 理想CPI是衡量流水线最高性能的一个指标。

IPC:Instructions Per Cycle(每个时钟周期完成的指令条数)

指令动态调度

在程序的执行过程中,依靠专门硬件对代码进行调度,减少数据相关导致的停顿。(前面指令的阻塞不影响后面指令的继续前进)

到目前为止我们所使用流水线(传统的5级流水线)

  • 指令按序流出按序执行
  • 运算通路只有一条
  • 只有一个配置
  • 每一条指令都要经过流水线的五段(无论是否需要MEM)

动态调度

  • 指令乱序执行
  • 实现多配置
  • 每一条指令都要经过流水线的四段(流出、读数、执行、写回)

动态调度的核心思想:

  • 允许就绪指令越过前面的停顿指令,率先投入运行,即乱序执行
  • 为了支持乱序执行,需要对ID阶段进行改造,因为就绪指令就是在ID阶段被阻塞的
  • 为了改造ID,需要分析ID阶段的约束条件和存在的问题:

约束条件:ID段指令必须按序执行(译码),前一条尚未译码后续指令就无法进行冲突检测

存在问题:这个这段必须按序执行,前提又要先检测,导致停顿增加

  • 解决方法:将ID阶段拆分为两个阶段

Issue:对应之前的ID阶段,但精简操作,只做最必要的事:如指令译码、资源冲突检测。这一阶段仍是按序执行的,并且,在这一阶段停顿的指令,同样会阻塞后面的所有指令(比如因为资源冲突而未能发射的指令阻塞了后面所有的指令)。 但这一阶段不再检测所有数据冲突,因此不管就绪还是非就绪的指令,都有机会发射出去。

Read operands:等待数据冲突消除,然后读取操作数。 这一阶段检测数据冲突,也是乱序执行实际发生的位置:非就绪指令会停顿在这一阶段,就绪指令会直接投入运行

  • 不管是什么样的动态调度流水线,都要将ID做这样的拆分,差别主要是如何管理已发射、未就绪的指令:记分牌算法使用记分牌,Tomasulo算法使用保留站

Tomasulo算法

核心思想

  • 记录和检测指令相关,操作数一旦就绪就立即执行,把发生RAW冲突的可能性减少到最小;
  • 通过寄存器换名来消除WAR冲突和WAW冲突。

换名通过保留站实现,它保存正在执行指令所需的操作数

总结:指令流出,操作数若还没计算出来,则该指令中相应的寄存器换名为产生这个操作数的保留站的标识。即指令流出到保留站,操作数寄存器要么就绪要么换成保留站的标识,此时已和该寄存无关,后面指令对该寄存器写操作则不会产生WAR冲突)。

指令执行的步骤:

使用Tomasulo算法的流水线需3段(流出—执行—写回)

流出:从指令队列的头部取一条指令(完成两个工作:分析源操作数和预约结果存放)(分析操作数从哪里来

  • 如果该指令的操作所要求的保留站有空闲的,就把该指令送到该保留站(设为r)。
  • 如果其操作数在寄存器中已经就绪,就将这些操作数送入保留站r
  • 如果其操作数还没有就绪,就把将产生该操作数的保留站的标识送入保留站r
  • 一旦被记录的保留站完成计算,它将直接把数据送给保留站r

(寄存器换名(换成保留站的标识)和对操作数进行缓冲,消除WAR冲突)

  • 完成对目标寄存器的预约工作(分析 结果要到哪里去 ,将之设置为保留站r的结果,这相当于完成了写操作(预约))(由于指令按序流出,当多条指令写同一个结果寄存器,最后留下的一定是最后一条指令的,即消除了写后写冲突)(消除了WAW冲突)
  • 如果没有空闲的保留站,指令就不能流出。

画板

执行

  • 当两个操作数都就绪后,本保留站就用相应的功能部件开始执行指令规定的操作(即依靠推迟方法解决RAW冲突,由于结果数据是从其产生的部件(保留站)直接送到需要它的地方,因此已经是最大限度地减少了RAW冲突影响)。
  • load和store指令的执行需要两个步骤:

计算有效地址(要等到基地址寄存器就绪)

把有效地址放入load或store缓冲器,load执行的条件是存储器部件就绪,而store指令在执行前必须等要存入存储器的数据到达。通过按序进行有效地址计算确保程序的顺序,有助于避免访问存储器的冲突。

写结果

  • 功能部件计算完毕后,就将计算结果放到CDB上,所有等待该计算结果的寄存器和保留站(包括store缓冲器)都同时从CDB上获得所需要的数据。

基于Tomasulo算法的MIPS处理器浮点部件的基本结构:

保留站的7个字段

Op:要对源操作数进行的操作

QjQk:产生源操作数的保留站号或者0,0(就绪,操作数放在Vj或Vk或不需要操作数)

VjVk:源操作数的值

  • 对于每一个操作数来说,V或Q字段只有一个有效。
  • 对于load来说,Vk字段用于保存偏移量。

Busy:为“yes”表示本保留站或缓冲单元“忙”

A:仅loadstore缓冲器有该字段。开始是存放指令中的立即数字段,地址计算后存放有效地址。

Qi:寄存器状态表

  • 每个寄存器在该表中有对应的一项,用于存放将把结果写入该寄存器的保留站的站号。
  • 为0表示当前没有正在执行的指令要写入该寄存器,也即该寄存器中的内容就绪。否则当数据未就绪的时候展示该数据来源对应的保留站的标志或站号。

动态分支预测技术

动态预测:在程序运行时,根据分支指令过去的表现来预测其将来的行为。(预判结果处理、预测有效性、分支开销的影响因素等)

采用分支历史表 BHT

最简单的动态分支预测方法。

用BHT来记录分支指令最近一次或几次的执行情况(成功还是失败 ),并据此进行预测。

只有1个预测位的分支预测 (只记录分支指令最近一次的历史)

  • 记录分支指令最近一次的历史,BHT中只需要1位二进制位。(最简单)
  • 上次分支成功-----则分支预测下次成功
  • 上次分支失败-----则分支预测下次失败

采用两位二进制位来记录历史

  • 可提高预测的准确度
  • 研究结果表明:两位分支预测的性能与n位(n>2)分支预测的性能差不多。

采用分支目标缓冲器BTB

目标:将分支的开销降为 0(在IF段获取分支目标地址,顺序下一条指令地址,以及预测的结果)

方法:分支目标缓冲

  • 将分支成功的分支指令的地址和它的分支目标地址都放到一个缓冲区中保存起来,缓冲区以分支指令的地址作为标识。
  • 这个缓冲区就是分支目标缓冲器(Branch-Target Buffer,简记为BTB,或者分支目标Cache(ranch-Target Cache)。

好处:避免 CPU 每次执行分支跳转时重新计算目标地址

缓冲区:联想cache的组织映射方式(直接映射、组相连映射、全相连映射)

画板

采用BTB后,在流水线各个阶段所进行的相关操作:

如果预测错误或者在BTB中没有匹配的项且分支成功,会有至少2个时钟周期的延迟,因为对BTB的项进行修改时,需要停止取指令,所以取新的指令又要花费一个时钟周期

基于硬件的前瞻执行ROB

Tomasulo算法:

  • 通过寄存器换名、优化指令并行,并能处理数据依赖,但缺乏控制相关的处理;如果分支指令流出,该算法须等待分支指令执行结果或不等待但导致不精确处理;
  • 此外,BTB只能准确预知分支但不能满足并行流水的速度(可能一个周期执行一个指令。)
  • 乱序提交指的是一旦指令执行完毕且可以写回(记分牌可能因为读后写冲突而不允许写回),那就立刻写回。
  • 一旦发生意外,硬件很难恢复现场,因为是乱序执行-----怎么处理?

前瞻执行(speculation)的基本思想:

  • 对分支指令的结果进行猜测,并假设这个猜测总是对的,然后按这个猜测结果取指、流出和执行后续的指令。只是执行指令的结果不是写回到寄存器或存储器,而是写入一个称为再定序缓冲器ROB(ReOrder Buffer)中 。等到相应的指令得到“确认”(commit)(即确实是应该执行的)之后,才将结果写入寄存器或存储器。
  • 重排序缓存的目的是让乱序执行的指令被顺序地提交
  • 在处理机还没判断分支指令能否执行之前就提前执行,以克服控制相关

关键思想

  • 允许指令乱序执行,但必须顺序确认。在指令被确认之前,不允许它进行不可恢复的操作。
  • 只有确认以后的结果才是最终结果。加入指令确认阶段需要一套额外的硬件缓冲来保存那些执行完毕但未经确认的指令及其结果
  • 不同点在于Tomasulo算法中,一旦指令结果写到目的寄存器,下面的指令就会从寄存器文件中得到数据。而对于前瞻执行,直到指令确认后,才最终更新寄存器文件。

结合ROB的Tomasulo主要有三点改动:

  • 一是增加了Reorder Buffer(即ROB);
  • 二是CDB总线不再直通逻辑寄存器堆,而是直通ROB;
  • 三是指令需要从ROB读取数据。ROB在这里就像是一个FIFO队列,指令在发射时入队,在提交时出队。

采用前瞻执行机制后,指令的执行步骤

流出

  • 从浮点指令队列的头部取一条指令。
  • 如果有空闲的保留站(设为r)且有空闲的ROB项(设为b),就流出该指令,并把相应的信息放入保留站r和ROB项b。
  • 如果保留站或ROB全满,便停止流出指令,直到它们都有空闲的项。

执行

  • 如果有操作数尚未就绪,就等待,并不断地监测CDB。(检测RAW冲突)
  • 当两个操作数都已在保留站中就绪后,就可以执行该指令的操作。

写结果

  • 当结果产生后,将该结果连同本指令在流出段所分配到的ROB项的编号放到CDB上,经CDB写到ROB以及所有等待该结果的保留站。保留站也可以从ROB直接读到结果而不需要CDB。
  • 释放产生该结果的保留站。
  • store指令在本阶段完成,其操作为:

如果要写入存储器的数据已经就绪,就把该数据写入分配给该store指令的ROB项。

否则,就监测CDB,直到那个数据在CDB上播送出来,才将之写入分配给该store指令的ROB项

确认

  • 对分支指令、store指令以及其它指令的处理不同:
  • 其它指令(除分支指令和store指令)

当该指令到达ROB队列的头部而且其结果已经就绪时,就把该结果写入该指令的目的寄存器,并从ROB中删除该指令。

  • store指令

处理与上面的类似,只是它把结果写入存储器。

  • 分支指令

当预测错误的分支指令(执行结果发现预测错误)到达ROB队列的头部时,清空ROB,并从分支指令的另一个分支重新开始执行。(错误的前瞻执行)

当预测正确的分支指令到达ROB队列的头部时,该指令执行完毕。继续后续指令执行。

多指令流出技术

多流出技术允许在每个时钟周期内流出多条指令,这提高了处理器的指令吞吐率,使CPI(每条指令所需的时钟周期数)可以小于1。这意味着在相同的时间内,处理器可以完成更多的工作。

基本概念:

超标量(Superscalar)–可以乱序,如何加快多条指令的调度

  • 是指在CPU中有一条以上的流水线,并且每时钟周期内可以完成一条以上的指令,这种设计就叫超标量技术。 其实质是以空间换取时间。
  • 超级标量结构的cpu支持指令级并行,每个周期可以发射多条指令

超流水线

  • 是一条指令来实现多个操作的并行执行(通常只有一个控制器)
  • 以增加流水线级数的方法来缩短机器周期,相同的时间内超级流水线执行了更多的机器指令
  • 多采用简单指令加快速度。
  • 但配置了多个功能部件和译码电路。

超长指令字VLIW(不可以乱序,如何加快一个指令字的执行)

  • 类似于超级标量,是一条指令来实现多个操作的并行执行,之所以放到一条指令是为了减少内存访问。

第6章:指令级并行及其开发-软件方法

软件的静态调度

  • 循环展开的本质;
  • 全局指令调度引入的原因、目标
    • 分支结构的循环体需要在多个基本块间移动指令,称为“全局指令调度”
    • 目标:在保持原有数据相关和控制相关不变的前提下(保证结果正确),尽可能的能地缩短包含分支结构的代码段的总执行时间。
    • 全局指令调度基本思想:在循环体内的多个基本块间移动指令,扩大…频率较高的基本块的体积(放到延迟槽中)。优化执行效率高的…
  • 全局指令调度:踪迹调度、超块调度
  • 显示并行指令计算EPIC
    • 条件传输指令与谓词执行的简单应用…指令含义)

软件的静态调度

循环展开的本质是增加循环体内语句的并行性,利用CPU指令级并行,减少更多的停顿。

分支结构的循环体需要在多个基本块间移动指令,称为 “全局指令调度

  • 目标:在保持原有数据相关和控制相关不变的前提下(保证结果正确),尽可能地缩短包含分支结构的代码段的总执行时间。
  • 全局指令调度基本思想:在循环体内的多个基本块间移动指令,扩大那些执行频率较高的基本块的体积(放到延迟槽中)。优化执行效率高的基本块。

为了简化这一过程,提出新的全局指令调度(共同点:优化重点放在那些执行概率较高的路径,将这些路径上的基本块拼接一起成为一个更大的基本块,然后进行优化)

踪迹调度

  • 踪迹(trace):程序执行的指令序列,通常由一个或多个基本块组成,trace内可以有分支,但一定不能包含循环。
  • 踪迹调度(trace scheduling)会优化执行频率高的trace,减少其执行开销。由于需要添加补偿代码以确保正确性,那些执行频率较低的trace的开销反而会有所增加。
  • 踪迹调度非常适合多流出处理器。

超块调度

  • 在踪迹调度中,如果trace入口或出口位于trace内部,编译器生成补偿代码的难度将大大增加,而且编译器很难评估这些补偿代码究竟会带来多少性能损失。
  • 超块(superblock)是只能拥有一个入口,但可以拥有多个出口的结构

显示并行指令计算EPIC

  • EPIC技术通过显式并行指令计算,将指令的并行性明确地表达在编译器层面,这与传统体系结构中由硬件推测并行性的方式形成了鲜明对比。----VLIW
  • 指令级并行主要由编译器负责开发,处理器为保证代码正确执行提供必要的硬件支持,只有在这些硬件机制的辅助下这些优化技术才能高效完成。
  • 系统结构必须提供某种通信机制,使得流水线硬件能够了 解编译器“安排”好的指令执行顺序。
  • EPIC技术利用了VLIW来实现指令的捆绑,格式相似

第7章:存储系统

理解Cache三种映射方式;

  • 两种并行查找算法:相联存储器和单体多字存储器+比较器;

写策略

  • 写回与直达法的区别

评价系统性能的间接指标

  • 平均访存指标,计算公式:平均访存时间=命中时间+不命中率×不命中开销
  • 程序执行时间CPU时间=(CPU执行周期数+存储器停顿周期数)×时钟周期时间

不命中开销=不命中周期数(停顿)×时钟周期时间

存储器停顿时钟周期数=访存次数×不命中率×不命中开销

降低不命中率

  • 三种类型的不命中
    • 强制性不命中(增加块大小、预取)、容量不命中(增加容量)、冲突不命中(提高相联度)
  • 8种降低不命中率优化策略
    • 增加Cache块大小、增加Cache的容量、提高相联度、伪相联Cache(列相联Cache)、硬件预期、编译器控制的预取、编译器优化、“牺牲”Cache

减少Cache不命中开销-5种

  • 采用二级Cache(增加一级Cache,常用的方法)
  • 让读不命中优先于写
  • 写缓冲合并
  • 请求字处理技术
  • 非阻塞Cache或非锁定Cache技术

Cache三种映像规则

  1. 全相联映像:主存中的任一块可以被放置到Cache中的任意一个位置。
  • 对比:阅览室位置 ── 随便坐
  • 特点:空间利用率最高,冲突概率最低,实现最复杂(需要遍历比较)。

  1. 直接映象:主存中的每一块只能被放置到Cache中唯一的一个位置。(循环分配)
  • 对比:阅览室位置 ── 只有一个位置可以坐
  • 特点:空间利用率最低,冲突概率最高, 实现最简单。
  • 对于主存的第 i 块,若它映象到Cache的第 j 块,则:j=i mod (M) (M为Cache的块数)
  • M=2m,则当表示为二进制数时,j实际上就是i的低m位:

  1. 组相连映像:主存中的每一块可以被放置到Cache中唯一的一个组中的任何一个位置。
  • 组相联是直接映象和全相联的一种折中
  • 组的选择常采用位选择算法:

若主存第 i 块映象到第 k 组,则:k=i mod(G) (G为Cache的组数)

G=2g,则当表示为二进制数时,k 实际上就是i 的低 g 位:

低g位以及直接映象中的低m位通常称为索引。

并行查找实现算法

(采用直接映像或是组相联映像的情况下)

  1. 相联存储器
  • 目录由2g个相联存储区构成,每个相联存储区的大小为n×(h+log2n)位。
  • 根据所查找到的组内块地址,从Cache存储体中读出的多个信息字中选一个,发送给CPU。
  • 同时比较相联存储器的内容

  1. 单体多字存储器+比较器

举例: 4路组相联并行标识比较(比较器的个数及位数)

  • 将表目录和数据项重新排列,一组4块
  • CPU访存时,用本次访存地址中的索引作为地址从标识存储器中选取一行(对应于一组),并从该行并行读出4 个标识(分别对应于4路)。
  • 与此同时,也从Cache存储体中并行读出4个信息字。然后将所读出的4个标识与本次访存地址中的标识进行并行比较,以确定是否命中以及该组中哪一个块是要访问的块(若命中)。
  • 根据这些信息,就可以从已经读出的4个信息字中选择一个,送给CPU。

写策略

  1. 写回法
  • 执行“写”操作时,只写入Cache。仅当Cache中相应的块被替换时,才写回主存。 (设置“修改位”支持这种策略)

“修改位”:为了减少替换时数据块的写回而设置;1:已修改;0:未修改,若产生替换时,此时不须写回下一级存储器,因为这时下一级存储器中相应块的内容与 Cache 中的一致。

  • 减少了访问主存的次数从而提高了效率。
  1. 写直达法
  • 执行“写”操作时,不仅写入Cache,而且也写入下一级存储器。
  • 写cache与写主存同步进行,其优点是cache每行无需设置一个修改位以及相应的判测逻辑。
  • 缺点是,cache对CPU向主存的写操作无高速缓冲功能,降低了cache的功效。

写回法的优点:速度快(只有置换时才写回下一级存储器),所使用的存储器带宽较低(因为大部分是对Cache写)。

写直达法的优点:易于实现,一致性好(cache、主存两者同时写)。

Cache的性能分析

平均访存时间 = 命中时间+不命中率×不命中开销

不命中开销=不命中周期数(停顿)×时钟周期时间

区别于程序执行时间

存储器停顿时钟周期数=访存次数 × 不命中率 × 不命中开销 存储器停顿时钟周期数=访存次数×不命中率×不命中开销 存储器停顿时钟周期数=访存次数×不命中率×不命中开销

C P U 时间 = ( C P U 执行周期数 + 存储器停顿周期数) × 时钟周期时间 = ( C P U 执行周期数 + 访存次数 × 不命中率 × 不命中开销) × 时钟周期时间 = I C × ( C P I e x e c u t i o n + 访存次数 I C × 不命中率 × 不命中开销) × 时钟周期时间 = I C × ( C P I e x e c u t i o n + 每条指令平均访存次数 × 不命中率 × 不命中开销) × 时钟周期时间 \begin{align} CPU时间 &=(CPU执行周期数+存储器停顿周期数)×时钟周期时间 \\ &=(CPU执行周期数+访存次数×不命中率×不命中开销)×时钟周期时间 \\ &= IC×(CPI_{execution}+\frac{访存次数}{IC}×不命中率×不命中开销)× 时钟周期时间 \\ &= IC×(CPI_{execution}+每条指令平均访存次数×不命中率×不命中开销)\\ &×时钟周期时间 \end{align} CPU时间=CPU执行周期数+存储器停顿周期数)×时钟周期时间=CPU执行周期数+访存次数×不命中率×不命中开销)×时钟周期时间=IC×(CPIexecution+IC访存次数×不命中率×不命中开销)×时钟周期时间=IC×CPIexecution+每条指令平均访存次数×不命中率×不命中开销)×时钟周期时间

例7.1 用一个和Alpha AXP类似的机器作为第一个例子。假设Cache不命中开销为50个时钟周期,当不考虑存储器停顿时,所有指令的执行时间都是2.0个时钟周期,访问Cache不命中率为2%,平均每条指令访存1.33次。试分析Cache对性能的影响。

解:考虑Cache的不命中后,性能为:

C P U 时 间 有 c a c h e = I C × ( C P I e x e c u t i o n +每条指令的平均访存次数 × 不命中率 × 不命中开销) × 时钟周期时间 = I C × ( 2.0 + 1.33 × 2 % × 50 ) × 时钟周期时间 = I C × 3.33 × 时钟周期时间 \begin{align} CPU时间_{有cache}&=IC ×(CPI execution+每条指令的平均访存次数×不命中率\\&×不命中开销)× 时钟周期时间\\ &=IC ×(2.0+1.33×2\%×50)× 时钟周期时间 \\ &=IC × 3.33× 时钟周期时间\\ \end{align} CPUcache=IC×CPIexecution+每条指令的平均访存次数×不命中率×不命中开销)×时钟周期时间=IC×2.01.33×2%×50×时钟周期时间=IC×3.33×时钟周期时间

实际CPI :3.33

3.33/2.0 = 1.67(倍)

CPU时间也增加为原来的1.67倍。

但若不采用Cache,则:

CPI=2.0+50×1.33=68.5

降低不命中率

三种类型的不命中(3C)

强制性不命中(Compulsory miss)

  • 当第一次访问一个块时,该块不在Cache中,需从下一级存储器中调入Cache,这就是强制性不命中。 (冷启动不命中,首次访问不命中)
  • 解决:增加块大小,预取

容量不命中(Capacity miss )

  • 如果程序执行时所需的块不能全部调入Cache中,则当某些块被替换后,若又重新被访问,就会发生不命中。这种不命中称为容量不命中。
  • 解决:增加容量

冲突不命中(Conflict miss)

  • 与前两种不同
  • 在组相联或直接映象Cache中,若太多的块映象到同一组(块)中,则会出现该组中某个块被别的块替换(即使别的组或块有空闲位置),然后又被重新访问的情况,这就是发生了冲突不命中。(碰撞不命中,干扰不命中)
  • 解决:提高相联度

8种降低不命中率优化策略

  1. 增加Cache块大小
  • 对于给定的Cache容量,当块大小增加时,不命中率开始是下降,后来反而上升了。原因:

一方面它减少了强制性不命中;

另一方面,由于增加块大小会减少Cache中块的数目,所以有可能会增加冲突不命中。

  • Cache容量越大,使不命中率达到最低的块大小就越大。
  1. 增加Cache的容量
  • 缺点:

增加成本

可能增加命中时间

  1. 提高相联度
  • 采用相联度超过8的方案的实际意义不大。
  • 2:1 Cache经验规则

容量为N直接映象Cache的不命中率和容量为N/2两路组相联Cache的不命中率差不多相同。

  • 提高相联度是以增加命中时间为代价。
  1. 伪相联 Cache(列相联 Cache)

  • 伪相联Cache的优点:命中时间小、不命中率低

  • 原理:在逻辑上把直接映象Cache的空间上下平分为两个区(地址不连续)。对于任何一次访问,伪相联Cache先按直接映象Cache的方式去处理。若命中,则其访问过程与直接映象Cache的情况一样。若不命中,则再到另一区相应的位置去查找。若找到,则发生了伪命中,否则就只好访问下一级存储器。

  1. 硬件预期
  • 指令和数据都可以预取
  • 预取内容既可放入Cache,也可放在外缓冲器中。
  • 指令预取通常由Cache之外的硬件完成
  • 预取效果
  1. 编译器控制的预取:在编译时加入预取指令,在数据被用到之前发出预取请求。
  2. 编译器优化:通过对软件进行优化来降低不命中率
  3. “牺牲”Cache
  • 在Cache和它从下一级存储器调数据的通路之间设置一个全相联的小Cache,称为“牺牲”Cache(Victim Cache)。用于存放被替换出去的块(称为牺牲者),以备重用。

减少Cache不命中开销

  1. 采用二级Cache。(增加一级Cache,常用的方法)

第一级Cache(L1)小而快 (速度与CPU时钟周期相匹配)

第二级Cache(L2)容量大 (尽量捕获更多的访存情况,从而降低不命中率)

  1. 让读不命中优先于写
  • 一般在Cache(CPU内部的L1或L2)后面设置一个写缓冲器,临时存放处理器将要写入到主存中的数据,这样 CPU 在将数据写入 cache 和缓冲器之后可以继续执行,等到缓冲写入到主存中再释放。
  • 缺点:在读不命中时,所读单元的最新值有可能还在写缓冲器中,尚未写入主存
  1. 写缓冲合并。
  • 如果写缓冲器为空,就把数据和相应地址写入该缓冲器。
  • 如果写缓冲器中已经有了待写入的数据,就要把这次的写入地址与写缓冲器中已有的所有地址进行比较,看是否有匹配的项。如果有地址匹配而对应的位置又是空闲的,就把这次要写入的数据与该项合并。这就叫写缓冲合并
  • 如果写缓冲器满且又没有能进行写合并的项,就必须等待。
  1. 请求字处理技术。
  • 从下一级存储器调入Cache的块中,只有一个字是立即需要的。这个字称为请求字,应尽早把请求字发送给CPU
  1. 非阻塞Cache或非锁定Cache技术
  • Cache不命中时仍允许CPU进行其它的命中访问。即允许“不命中下命中”。

考虑某一个机器,假设Cache读不命中开销为25个时钟周期,写不命中开销70个时钟周期,当不考虑存储器停顿时,所有指令的执行时间都是2.0个时钟周期,Cache的读不命中率和写不命中率均为4%,平均每条指令读存储器0.8次,写存储器0.5次。试分析考虑的Cache不命中后,Cache对性能的影响。

  1. 平均每条指令存储器停顿时钟周期数=“读”的次数×读不命中率×读不命中开销+“写"的次数×写不命中率×写不命中开销=0.8×4%×25+0.5×4%×70=2.2
  2. CPU时间=IC×[CPI+(存储停顿周期数/指令数)]×时钟周期时间
  3. 考虑Cache的不命中后,性能为:
    CPU时间=IC×(2.0+2.2)×时钟周期时间=IC×4.2×时钟周期时间
    当考虑了Cache的不命中影响后,CPI从理想计算机的2.0增加到4.2,是原来的2.1倍。

本节完~~,如果你在实现过程中遇到任何问题,欢迎在评论区指出或者私信我!💕

创作不易,如果有收获可否👍点赞✍评论⭐收藏一下?O(∩_∩)O

THANKS FOR WATCHING

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

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

相关文章

计算机网络复习(大题)

📢📢📢传送门 一、简答题(1)五层原理体系结构每层功能:(2)TCP建立连接三次握手过程:(3)访问浏览器的过程:(4)抓…

AWS re:Invent 的创新技术

本月早些时候,Amazon 于 12 月 1 日至 5 日在内华达州拉斯维加斯举行了为期 5 天的 re:Invent 大会。如果您从未参加过 re:Invent 会议,那么最能描述它的词是“巨大”——不仅从与会者人数(60,000 人)来看&…

深入理解Java的 JIT(即时编译器)

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

民宿酒店预订系统小程序+uniapp全开源+搭建教程

一.介绍 一.系统介绍 基于ThinkPHPuniappuView开发的多门店民宿酒店预订管理系统,快速部署属于自己民宿酒店的预订小程序,包含预订、退房、WIFI连接、吐槽、周边信息等功能。提供全部无加密源代码,支持私有化部署。 二.搭建环境 系统环境…

量子计算:定义、使用方法和示例

什么是量子计算? 量子计算是计算机科学的一个领域,它运用量子理论的原理。量子理论阐释了原子及亚原子层面上能量和物质的行为表现。 量子计算会用到诸如电子或光子之类的亚原子粒子。量子比特使得这些粒子能够同时处于多种状态(即 1 和 0&…

一文讲清楚HTTP常见的请求头和应用

文章目录 一文讲清楚HTTP常见的请求头和应用1. 啥是个HTTP请求头2. 常见的请求头,作用和示例3.协商缓存4.会话状态 一文讲清楚HTTP常见的请求头和应用 1. 啥是个HTTP请求头 一句话,说白了就是限定HTTP传输的一些规则参数,比如Accept&#xf…

Wend看源码-Java-Executor异步执行器学习

摘要 本文主要介绍了Java.util.concurrent包所提供的 Executor 异步执行器框架,涵盖了相关的接口和类。 并发执行器类图 图1 java 并发执行器相关类图 Executor 接口 Executor 接口提供了一种将任务的提交与任务的实际执行机制分离开来的方法。它只有一个方法 exe…

单片机-独立按键矩阵按键实验

1、按键介绍 按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态, 如果按键按下,初始导通状态变为断开,初始断开状态变为导通 我们开发板是采用软件消抖,一般来说一个简单的按键消抖就是先读取按键的状…

Elasticsearch: 高级搜索

这里写目录标题 一、match_all匹配所有文档1、介绍: 二、精确匹配1、term单字段精确匹配查询2、terms多字段精确匹配3、range范围查询4、exists是否存在查询5、ids根据一组id查询6、prefix前缀匹配7、wildcard通配符匹配8、fuzzy支持编辑距离的模糊查询9、regexp正则…

HTML5实现喜庆的新年快乐网页源码

HTML5实现喜庆的新年快乐网页源码 前言一、设计来源1.1 主界面1.2 关于新年界面1.3 新年庆祝活动界面1.4 新年活动组织界面1.5 新年祝福订阅界面1.6 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现喜庆的新年快乐网页源码,春节新年网…

LeetCode热题100-两数之和【JavaScript讲解】

题目: 根据题目想思路: 使用哈希表进行索引查找。利用nums[j] target - nums[i]获得我们需要的值,在数组中进行查询。查询成功后返回这两个下标;否则当前元素的值和索引存储到哈希表中,以便后续查找。 题解: /*** …

沙箱模拟支付宝支付3--支付的实现

1 支付流程实现 演示案例 主要参考程序员青戈的视频【支付宝沙箱支付快速集成版】支付宝沙箱支付快速集成版_哔哩哔哩_bilibili 对应的源码在 alipay-demo: 使用支付宝沙箱实现支付功能 - Gitee.com 以下是完整的实现步骤 1.首先导入相关的依赖 <?xml version"1…

NLP CH3复习

CH3 3.1 几种损失函数 3.2 激活函数性质 3.3 哪几种激活函数会发生梯度消失 3.4 为什么会梯度消失 3.5 如何解决梯度消失和过拟合 3.6 梯度下降的区别 3.6.1 梯度下降&#xff08;GD&#xff09; 全批量&#xff1a;在每次迭代中使用全部数据来计算损失函数的梯度。计算成本…

【办公类-47-02】20250103 课题资料快速打印(单个docx转PDF,多个pdf合并一个PDF 打印)

背景需求&#xff1a; 2023区级大课题《运用Python优化3-6岁幼儿学习活动材料的实践研究》需要做阶段资料 本来应该2024年6月就提交电子稿和打印稿。可是python学具的教学实验实在太多了&#xff0c;不断生成&#xff0c;我忙着做教学&#xff0c;都没有精力去整理。 2025年…

Android布局layout的draw简洁clipPath实现圆角矩形布局,Kotlin

Android布局layout的draw简洁clipPath实现圆角矩形布局&#xff0c;Kotlin 通常&#xff0c;如果要把一个相对布局&#xff0c;FrameLayout&#xff0c;或者线性布局等这样的布局变成具有圆角或者圆形的布局&#xff0c;需要增加一个style&#xff0c;给它设置圆角&#xff0c;…

深入Android架构(从线程到AIDL)_08 认识Android的主线程

目录 3、 认识Android的主线程(又称UI线程) 复习&#xff1a; 各进程(Process)里的主线程​编辑 UI线程的责任&#xff1a; 迅速处理UI事件 举例 3、 认识Android的主线程(又称UI线程) 复习&#xff1a; 各进程(Process)里的主线程 UI线程的责任&#xff1a; 迅速处理UI事…

[微服务]分布式搜索Java客户端

快速入门 使用RestClient客户端进行数据搜索可以分为两步 构建并发起请求 代码解读&#xff1a; 第一步&#xff0c;创建SearchRequest对象&#xff0c;指定索引库名第二步&#xff0c;利用request.source()构建DSL&#xff0c;DSL中可以包含查询、分页、排序、高亮等 query…

RabbitMQ基础篇之Java客户端快速入门

文章目录 需求 项目设置与依赖管理 配置RabbitMQ的连接信息创建队列与消息发送创建消费者&#xff08;消息接收&#xff09;环境准备与操作 需求 利用控制台创建队列 simple.queue在 publisher 服务中&#xff0c;利用 SpringAMQP 直接向 simple.queue 发送消息在 consumer 服…

单片机-静动态数码管实验

P0控制数码管 &#xff0c;P0低电平 P1,P2,P3高电平 1、静态数码管 需求&#xff1a;数码管显示0&#xff0c;即让p0端口输出数字0的段码0x3f(共阴) #include "reg52.h" typedef unsigned int u16; typedef unsigned char u8; //数码管显示数字的数组 共阴极 …

创龙3588——debian根文件系统制作

文章目录 build.sh debian 执行流程build.sh源码流程 30-rootfs.sh源码流程 mk-rootfs-bullseys.sh源码流程 mk-sysroot.sh源码流程 mk-image.sh源码流程 post-build.sh 大致流程系统制作步骤 build.sh debian 执行流程 build.sh 源码 run_hooks() {DIR"$1"shiftf…