本文简单介绍了流水线.
基本概念
流水线(Pipeline) 是一种通过将任务分解为多个子任务(阶段),并让不同子任务并行执行以提高效率的技术。其灵感来源于工业流水线,每个阶段专注于特定操作,多任务在不同阶段重叠执行,从而提升整体吞吐率(Throughput)。
经典五级流水线阶段(RISC为例)
取指(IF, Instruction Fetch)
从指令存储器中读取下一条指令。
程序计数器(PC)更新,指向下一条指令地址。
译码(ID, Instruction Decode)
解析指令操作码(Opcode),确定操作类型(如加法、跳转)。
读取寄存器文件(Register File)中的源操作数。
执行(EX, Execute)
执行算术逻辑运算(ALU操作),如加减乘除。
计算内存地址(如加载/存储指令)或分支目标地址。
访存(MEM, Memory Access)
访问数据存储器(读/写数据)。
对于非访存指令,此阶段可能为空(直接传递结果)。
写回(WB, Write Back)
将执行结果(如ALU输出或内存数据)写入寄存器文件。
示例:假设三条指令依次进入流水线,每个时钟周期推进一个阶段。理想情况下,每个周期完成一条指令(吞吐率为1 IPC),而单条指令仍需要5个周期(延迟不变)。
硬件利用率高:每个阶段硬件资源(如ALU、存储器)在不同时刻被不同指令使用,减少空闲。
RAW(Read After Write):后指令读前指令未写的数据(最常见)。
WAR(Write After Read)与WAW(Write After Write):在乱序流水线中可能出现。
解决方法:
旁路(Forwarding/Bypassing):将前一条指令的结果直接传递给后续指令的输入,无需等待写回。
流水线暂停(Stall):插入“气泡(Bubble)”延迟后续指令(效率较低)。
(2)结构冒险(Structural Hazard)
问题:硬件资源冲突(如两条指令同时访问存储器)。
解决方法:
分离指令与数据存储器(哈佛架构)。
增加资源副本(如多端口寄存器文件)。
(3)控制冒险(Control Hazard)
问题:分支指令(如条件跳转)导致后续指令地址不确定,需等待分支结果。
解决方法:
分支预测(Branch Prediction):
静态预测:总预测分支不跳转(或固定策略)。
动态预测:基于历史行为(如两位饱和计数器)。
延迟槽(Delay Slot):MIPS架构中填充分支后必然执行的指令(需编译器配合)。
投机执行(Speculative Execution):预测分支路径并提前执行,若预测错误则清空流水线(现代CPU常用)。
超标量(Superscalar):每个周期发射多条指令(如Intel的乱序执行架构)。
动态调度(Dynamic Scheduling):Tomasulo算法通过寄存器重命名解决WAR/WAW冒险,支持乱序执行。
向量流水线(Vector Pipeline):SIMD(单指令多数据)加速并行数据计算(如GPU)。
加速比(Speedup):流水线速度相对于非流水线的提升,理想为阶段数(如五级流水线加速比5)。
效率(Efficiency):实际加速比与理想加速比的比值(因冒险和停顿降低)。
多核与多线程:结合流水线与并行计算(如同时多线程SMT)。
功耗与复杂度:更深的流水线需要复杂冒险处理电路,增加设计难度和能耗。
旁路解决:ADD在EX阶段结束后即可将结果旁路给SUB的EX阶段输入,无需等待WB。