流水CPU

流水CPU结构

  • 指令部件

  • 指令队列FIFO

  • 执行部件

原理

  • 在流水线(Pipeline)中必须是连续的任务,只有不断提供任务才能充分发挥流水线的效率

  • 把一个任务分解为几个有联系的子任务,每个子任务由一个专门的功能部件实现

  • 流水线中各段时间应尽量相等,否则会引起堵塞、断流现象

  • 流水线需要装入时间和排空时间。流水线完全充满时才能充分发挥效率

指令处理的分解

  • IF(Instruction Fetch)取指

  • ID(Instruction Decode)译码

  • EX(Execution)执行

  • WB(Write Back)写回

四级指令流水线

时空图

非流水线时空图:

上一条指令与下一条指令存在时间上的重叠,每一个时钟周期就能输出一个结果

超标量流水线时空图:

5-31

在标量流水线基础上增加空间并行技术,一次执行多条指令

线性流水线有三个阶段:

5-32

性能指标

  • 加速比(Speedup Ratio)

    • 衡量不使用流水线使用流水线完成同样任务所用的时间比

    • k级流水线时钟周期t,则不使用流水线完成n各任务所需时间T0=nkt,使用k级流水线完成n个连续任务所需时间为Tk=(k+n-1)t

    • 显然当n远大于k时最大加速比为k

  • 吞吐率

    • 单位时间完成的任务数

    • n为任务数,Tk为完成n各任务的时间,则吞吐率TP = n / Tk

    • 显然n趋近无穷时最大吞吐率为1/t

流水线冲突

  • 资源相关

如流水线的不同部分在同一时钟周期同时访问内存。假设某流水线分为五部分:取指、译码、执行、取存、写回,那么在流水线执行时取指和取存都会访问存储器,这就导致了冲突

解决方案

  1. 某条指令在冲突时停顿一拍

  2. 分离数据与指令的存储

  • 数据相关

流水线的不同节拍同时需要读写一个地址的数据。如运算结果在第3拍需要写入内存,而后面的操作需要用到这个内存。可能会发生“先读后写”冲突。注意同时读是不冲突的

为了解决冲突,流水CPU设置了许多结果缓存寄存器,保存结果给后面的指令直接使用

  • 控制相关

由转移指令引起。因为流水线不知道判定结果,不知道应该顺序执行还是转移执行。常用处理技术:

  1. 延迟转移 - “先执行再转移”。在条件转移之前已经有若干个指令进入流水线了,把这些指令执行完毕,如果正好是目标指令则没有浪费时间

  2. 分支预测 - 猜测分支的方向

    1. 静态分支预测。硬件固定的预测方式,如总是转移或总是不转移

    2. 动态分支预测。内部保存一个表,记录最近的以此转移的情况,然后根据此情况转移

Last updated

Was this helpful?