【计组笔记】CPU

目录

指令执行步骤

单周期CPU

指令执行动作

R型指令

I型指令

J型指令

load指令

store指令

控制信号

延迟计算

多周期CPU

指令执行动作

算逻指令

load指令

beq指令

j指令

延迟计算

流水线CPU

流水线特点

性能指标

流水段数选择问题

指令流水线实现

流水线冒险

结构冲突

解决方案

数据冲突

解决方案

控制冲突

解决方案

异常处理

MIPS异常处理流程

异常嵌套


指令执行步骤

  1. 读指令(IF,instruction fetch):读指令存储器,地址PC
  2. 指令译码(ID,instruction decode):读源寄存器rs
  3. 执行(EXE,execute)
  4. 存储器读写(MEM,memory):读写数据存储器
  5. 写回(WB,write back):写目的寄存器rd
  • 数据通路:实现数据流动

    • D触发器:时钟上升沿写入数据,保持稳定直到下一个上升沿

    • 寄存器组(堆)

      • 3个地址端口,2个读接口,1个写接口

      • 每个时钟周期可以完成3次访问

  • 控制器:指挥数据流动

单周期CPU

指令串行执行

每条指令都用一个CPU周期

  • 对于单条指令,不管何种指令,都占用一个周期
    • 计算资源浪费
  • ID段得到指令类型后给出整个周期的全部控制信号
    • 周期内控制信号保持不变
  • 不需要状态信息,在周期的结束边沿写入结果
  • lw指令周期决定时钟周期,因load指令步骤时延最长

指令执行动作

选取7条MIPS指令实现单周期CPU

  • lw、sw
  • addu、subu、ori
  • beq、j

R型指令

op rd, rs, rt

  • R[rd] = R[rs] op R[rt]

I型指令

ori rt, ts, imm

  • R[rt] = R[rs] or zext(imm)

J型指令

beq rs, rt, imm

  • cond = R[rs] - R[rt]
  • if (cond eq 0)
    • PC += 4 + sext(imm) << 2
      • CPU拿到指令就把PC+4,指令给出的立即数偏移是另外计算的

      • 因指令总是4个字节打包出现,编码时省略最低2位,但译码时左移2位还原

  • else
    • PC += 4

j target

  • PC = PC[31 : 28] || target << 2
    • 跳转范围有限制,(在一条j语句中)PC高4位不动

load指令

lw rt, rs, imm

  • addr = R[rs] + sext(imm)
  • R[rt] = MEM[addr]

store指令

sw rt, ts, imm

  • addr = R[rs] + sext(imm)
  • MEM[R[rs] + sext(imm)] = R[rt]

控制信号

延迟计算

  1. 算逻指令
    • IF:获取指令,1个存储器延迟
    • ID:读操作数,1个寄存器读延迟
    • EXE:ALU计算,1个ALU延迟
    • MEM:无
    • WB:结果写入寄存器,1个寄存器写延迟
  2. load指令:lw rt, rs, imm
    • IF:获取指令,1个存储器延迟
    • ID:读操作数,1个寄存器读延迟
    • EXE:ALU计算addr,1个ALU延迟
    • MEM:MEM[addr]获取,1个存储器延迟
    • WB:load进寄存器,1个寄存器写延迟
  3. store指令:sw rt, ts, imm
    • IF:获取指令,1个存储器延迟
    • ID:读操作数,1个寄存器读延迟
    • EXE:ALU计算addr,1个ALU延迟
    • MEM:存入MEM[addr],1个存储器延迟
    • WB:无
  4. 跳转指令:beq rs, rt, imm
    • IF:获取指令,1个存储器延迟
    • ID:读操作数,1个寄存器读延迟
    • EXE:ALU计算cond,1个ALU延迟
    • MEM:无
    • WB:无

假定某单周期CPU各主要部件的延迟为:

  • 存储器:2ns
  • 运算器:2ns
  • 寄存器组:1ns

该单周期CPU执行100条指令:

  • 25%Load指令
  • 10%Store指令
  • 45%算逻指令
  • 20%跳转指令

单条load指令延迟为8ns,时钟周期为8ns,CPI=1,总执行时间800ns

多周期CPU

把指令分为若干步骤

每个步骤占用一个时间周期,尽量使用单一部件

  • 单步骤最长时延决定时钟周期

控制器只提供当前步骤的控制信号

PC给出取指令地址,取来的地址存入IR,而后PC+4

ALU有A路和B路输出

  • A路为A寄存器或PC
  • B路为B寄存器、4、或imm符号扩展或扩展后左移2位值

指令执行动作

算逻指令

  1. 取指周期
    • IR = MEM[PC]
    • PC = PC + 4
  2. 译码周期
    • A = [rs]
    • B = [rt]
  3. 执行周期
    • C = A + B
  4. 内存周期
  5. 写回周期
    • [rd] = C

load指令

  1. 取指周期
    • IR = MEM[PC]
    • PC = PC + 4
  2. 译码周期
    • A = [rs]
  3. 执行周期
    • C = A + sext(imm)
  4. 内存周期
    • DR = MEM[C]
  5. 写回周期
    • [rt] = DR

beq指令

  1. 取指周期
    • IR = MEM[PC]
    • PC = PC + 4
  2. 译码周期
    • 结果寄存器 = PC + sext(imm)
  3. 执行周期
    • C = A - B
    • PC = 结果寄存器
  4. 内存周期
  5. 写回周期

j指令

  1. 取指周期
    • IR = MEM[PC]
    • PC = PC + 4
  2. 译码周期
    • PC = PC[31 : 28] || target << 2
  3. 执行周期
  4. 内存周期
  5. 写回周期

延迟计算

  1. 算逻指令:4周期延迟
  2. load指令:5周期延迟
  3. store指令:4周期延迟
  4. 分支指令:3周期延迟
  5. 跳转指令:2周期延迟

假定某单周期CPU各主要部件的延迟为:

  • 存储器:2ns
  • 运算器:2ns
  • 寄存器组:1ns

该单周期CPU执行100条指令:

  • 25%Load指令
  • 10%Store指令
  • 45%算逻指令
  • 20%跳转指令

单步骤最长2ns,时钟周期为2ns,总执行时间为25×10+10×8+45×8+20×3=810ns

流水线CPU

 流水线连接图表示法

流水线时空图表示法

装入时间:第一个任务进入流水线到输出流水线的时间

排空时间:最后一个任务进入流水线到输出流水线的时间

流水线特点

  • 流水线的时钟周期不能短于最慢的流水段
  • 每个子任务由一个专门部件实现
    • 每个功能部件每条指令只能用一次
    • 每个功能部件必须在相同的阶段被使用

性能指标

  • 吞吐率:单位时间执行指令的数量
  • 加速比:与串行执行时速度提高的比率

流水段数选择问题

【2020-912】提高流水线的段数可提高CPU的频率,并提高单位时间内执行指令的速度。(×)

指令流水线实现

对应指令执行五阶段,采用五阶段流水线,每个功能段对应指令执行的一个阶段

  • 即使有的指令不需要五个功能段,也要填空段变成五个功能段,这是流水线内部同步并行性决定的
    • R-型指令、I-型指令:4功能段
    • load指令:5功能段
    • store指令:4功能段
    • beq指令:4功能段
      • [rs] - [rt]和跳转地址的计算都在EXE段
      • cond = 0的改写PC在MEM段完成
    • j指令:3功能段
      • 在EXE段改写PC
IFIDEXEMEMWB
R/I-型指令
load指令
store指令
beq指令
j指令
  • PC多路选择器在IF段使用,避免多指令写PC冲突
  • 流水线锁存器(寄存器):流水线每个功能段后都要有一个缓冲寄存器,保存本流水段的结果
    • 既保留数据,也保留控制信号
    • 每个流水段的时延=流水段模块时延+流水线锁存器时延
      • WB段最后亦有锁存器时延
      • WB段有控制信号,锁存器需要存储
  • IF:指令存储器IM、PC、总线
    • IF/ID
      • PC+4
      • IR
  • ID:寄存器组、控制信号生成部件
    • ID/EXE
      • A、B、imm
      • rt/rd
      • PC+4
      • func
  • EXE:ALU
    • EXE/MEM
      • PC
      • ALU结果
      • 结果状态
        • 溢出等状态
      • B、目的寄存器
  • MEM:数据存储器DM、总线
    • MEM/WB
      • 目的寄存器
      • ALU结果
      • 存储器读出的结果
  • WB:寄存器组

【2023-912】5级流水线处理器实现中,指令流经各个功能段的时间分别为60ns、50ns、40ns、60ns、30ns,忽略流水线寄存器的延迟,则该处理器的时钟周期至少是(A)

A. 60ns

B. 50ns

C. 40ns

D. 30ns

流水线冒险

结构冲突

硬件资源不满足某种指令组合

解决方案
  • 插入空指令nop
  • 增加硬件资源
  • 增加端口或分开管理

数据冲突

Reg实线为写,虚线为读

Load与sub、and冲突,与or、xor不冲突

  • 写后读冲突(RAW)
    • 上一条指令还没来得及写寄存器,下一条指令就要读
  • 写后写冲突(WAW)
    • 上一条指令寄存器结果覆盖下一条指令同一寄存器结果
    • MIPS指令流水不会发生WAW
      • 只有WB段会使用寄存器写端口
      • 各指令到达WB段的顺序就是本身的顺序
  • 读后写冲突(WAR)
    • 下一条指令脏读
    • MIPS指令流水不会发生WAR
      • 只有ID段读寄存器
      • 只有WB段写寄存器(不含PC,改写PC的冲突已不属于数据冲突)
解决方案
  • 插入空指令nop
  • 插入气泡
    • 推迟后续指令的进行
    • 并不增加总指令条数
  • 旁路(转发、定向)技术
    • 将结果尽快传送到需要使用的位置
    • 解决RAW(在MIPS下也只有这一种数据冲突)
    • 各锁存器与各部件间有数据旁路,可以直接给数据和控制信号
      • 各部件照常读数据

      • 如果正常读数据和旁路数据均到达多路选择器,选择旁路数据

      • 冲突检测

        • EXE段冲突(add指令与sub指令冲突)

          • 检查当前指令的EXE/MEM锁存器和下一条指令的ID/EXE锁存器

            • 本条指令的目的寄存器是下一条指令的源寄存器

            • 本条指令将改写目的寄存器

            • 目的寄存器不是0寄存器

        • MEM段冲突(add指令与and指令冲突)

          • 检查当前指令的MEM/WB锁存器和下下一条指令的ID/EXE锁存器

            • 本条指令的目的寄存器是下一条指令的源寄存器

            • 本条指令将改写目的寄存器

            • 目的寄存器不是0寄存器

  • 编译器调度方法(静态调度)
    • load-use冲突
      • 旁路技术不再有效
        • load指令在WB段才写入数据
        • 下一条指令在EXE段就需要使用
        • 使用时数据还没有计算出来
      • 插入一个nop
      • 插入一个气泡
      • 编译器调度
      • ​​​​​​冲突检测
        • 上一条指令是load指令(控制信号MemRead = 1)
        • load指令的写入寄存器是当前指令的源寄存器

【2018-912】指令可以分为5个阶段完成,流水线模块延迟10ns,流水线寄存器延迟5ns,执行下面一组指令所需时间至少是多少?分别采用旁路技术和不采用旁路技术两种情况分析。

Iw R1, 0(R2)
sub R3, R1, R4
add R5, R1, R6
or R7, R1, R8
add R9, R1, R10

  • 采用旁路技术
    • load-use冲突,插入1个气泡
      • load指令MEM/WB送数据给sub指令EXE段
    • 其他指令间无冲突
    • CC1CC2CC3CC4CC5CC6CC7CC8CC9CC10
      Iw R1, 0(R2)IFIDEXEMEMWB
      sub R3, R1, R4IFIDEXEMEMWB
      add R5, R1, R6IFIDEXEMEMWB
      or R7, R1, R8IFIDEXEMEMWB
      add R9, R1, R10IFIDEXEMEMWB
    • 需要10个时钟周期:10×15=150ns
  • 不采用旁路技术
    • load-use冲突,插入2个气泡
      • load指令WB前半段写入,sub指令ID后半段读出
    • 其他指令间无冲突
    • CC1CC2CC3CC4CC5CC6CC7CC8CC9CC10CC11
      Iw R1, 0(R2)IFIDEXEMEMWB
      sub R3, R1, R4IFIDEXEMEMWB
      add R5, R1, R6IFIDEXEMEMWB
      or R7, R1, R8IFIDEXEMEMWB
      add R9, R1, R10IFIDEXEMEMWB
    • 需要11个时钟周期:11×15=165ns
  • 动态调度
    • 指令顺序发射
    • 乱序执行
    • 指令乱序流出

【2012-408】

1) [R1] = 1111 1101 1111 1111

SHR R1 → [R1] = 1111 1110 1111 1111 = 0xFEFF

2) 8

3) 未转发,I3的源寄存器在I2写回寄存器后才能获取,插入了3个气泡,I4的IF段随之阻塞

4) 需要17个时钟周期

1234567891011121314151617
LOAD R1, [x]IFIDEXMWB
LOAD R2, [a]IFIDEXMWB
SHL R1IFIDEXMWB
ADD R2, R1IFIDEXMWB
STORE R1, [x]IFIDEXMWB

控制冲突

转移类指令导致的程序方向改变

  • 对流水线性能影响最大
    • 所有指令都要在IF段使用PC
    • 出现转移指令后要到该指令EXE阶段结束才能确定PC
解决方案
  • 插入nop
    • 为减小暂停周期数
      • 尽早判断分支转移是否成功
        • 增加比较器比较源操作数
      • 尽早计算出成功转移时的PC
        • ID段增加加法器
  • 分支预测
    • 预测转移失败:视转移指令为普通指令,顺序向下执行
      • 如果转移成功,清除已执行指令的影响
    • 预测转移成功:假设转移指令都会转移,找到分支目标处执行
      • 如果转移失败,清除已执行指令的影响
  • 动态预测
    • 认为如果发生转移,下次也发生转移;如果不发生转移,下次也不发生转移
      • 执行一个循环体
    • 1位预测位:一旦预测错了就改变预测方向
    • 2位预测位:连续两次预测错才改变预测方向
  • 延迟槽
    • 分支指令后续指令放在延迟槽中
      • 无论转移是否成功,延迟槽内指令均上流水线执行
    • 延迟槽指令选择
    • MIPS处理器采用延迟分支技术,延迟槽数为1
    • RISCV处理器不采用延迟分支技术

A

C

【2023-912】分支预测包含了静态预测以及动态预测,在下面的MIPS程序中,计算不同预测方法下的预测准确率:


(1)采用静态预测,预测转移发生;
(2)采用1位预测位,初始预测转移不发生;

(3)采用2位预测位,初始预测转移不发生。

$9对$1的值没有影响。每执行一次Loop,$1 += 1,初始$1 = 1,总共100次执行bne指令,99次跳转,1次不跳转。

(1)99%

(2)98%

(3)97%

异常处理

【2023-912】应用程序执行的过程中发生了中断或者异常,假设在指令A处发生了中断或者异常,以下描述正确的是(D)
A.如果返回到该应用程序,则开始执行A的下一条指令

B.如果返回到该应用程序,则从指令A处开始执行(A 被再一次执行)

C.不会返回到该应用程序执行
D.以上都有可能

MIPS异常处理流程

【2020-912】MIPS 中断中不是由硬件负责的是(B)

A.保存断点

B.保存寄存器
C.关中断
D.保存异常原因

  • EPC寄存器
    • 保存异常指令地址
      • 多周期CPU
        • 中断:EPC=PC
        • 异常:EPC=上一条指令的地址
      • 流水线CPU
        • 精确异常
          • 产生异常之前的指令都执行完毕
          • 取消后续指令
    • 中断处理后返回

异常嵌套

在异常处理中出现另一个异常

  • 大多数系统对异常进行优先级划分
    • 规定处理异常时只有更高优先级才被允许

异常前状态被保存在寄存器中,内部异常会重写寄存器值,因此必须先保存寄存器的值

异常帧:为保存寄存器的值的主存空间的数据结构

  • 通常保存在栈中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值