1.4 指令的流水处理
计算机体系结构知识点总结
一、流水线原理
定义
将指令执行过程分解为多个独立阶段,不同指令的不同阶段在时间上重叠执行,从而提高指令吞吐率。
公式
T_流水线 = Σ(t_i) + (n - 1) × Δt
生活例子:洗衣房
洗衣机有洗涤、烘干、折叠三个阶段。不用流水线时,洗完第1桶再洗第2桶;用流水线后,第1桶在烘干时,洗衣机已经在洗第2桶了——多个任务的不同阶段同时进行。
二、流水线冒险
定义
流水线中导致指令无法顺利执行的三类冲突。
分类与例子
| 冒险类型 | 原因 | 生活例子 |
|---|---|---|
| 结构冒险 | 多条指令争用同一硬件资源 | 两个人同时要用水龙头——解决方案:多装一个水龙头(资源重复) |
| 数据冒险 | 后续指令依赖前序指令的结果 | 第2桶衣服要用第1桶洗完的水——解决方案:直接把水递过去(数据前递) |
| 控制冒险 | 分支指令导致后续取指地址不确定 | 不知道下一桶该洗什么——解决方案:先猜一个,猜错重来(分支预测) |
三、流水线周期
定义
流水线中各段执行时间不相等时,所有段必须同步工作,快的段要等慢的段完成,因此流水线周期由最慢的那一段决定。
公式
Δt = max(t₁, t₂, ..., tₖ)
生活例子:工厂流水线
一条流水线有3个工位,分别耗时10秒、30秒、20秒。整条流水线的节奏由最慢的工位(30秒)决定——每30秒才能出一件成品,快的工位必须等慢的工位完成。
四、流水线执行时间
定义
流水线处理n条指令所需的总时间。
公式
T = Σ(t_i) + (n - 1) × Δt
即:第一条指令跑完所有段的总时间 + 后续(n-1)条指令逐条流出
的时间。
生活例子:火车过站
一列火车有5节车厢(5个段),每站间距10分钟(流水线周期)。火车头到达终点需要50分钟(第一条指令的总时间),之后每隔10分钟就有一节车厢到达(后续指令逐条流出)。处理10列火车的总时间 = 50 + (10-1) × 10 = 140分钟。
五、流水线吞吐率
定义
单位时间内流水线完成的指令条数,衡量流水线的实际工作效率。
公式
吞吐率 = n / T_流水线
生活例子:餐厅出菜速度
一家餐厅1小时内做出了60道菜,吞吐率就是60道/小时。流水线同理——1秒内完成了多少条指令,吞吐率就是多少。当指令数趋于无穷时,吞吐率趋近于理论最大值 1/Δt(每个周期完成1条)。
六、流水线加速比
定义
使用流水线后比不使用流水线快了多少倍,衡量流水线的效率提升程度。
公式
S = T_非流水线 / T_流水线 = (n × Σtᵢ) / (Σtᵢ + (n-1) × Δt)
生活例子:搬砖对比
不用流水线:1个人搬完100块砖要100分钟。用流水线(5人接力):100块砖只需24分钟。加速比 = 100/24 ≈ 4.2倍。理论上,k段流水线的最大加速比趋近于k倍。
七、超流水线
定义
将流水线的各阶段进一步细分(增加级数),缩短每段处理时间,从而提高时钟频率(主频)。本质是以时间换空间。
生活例子:把大任务拆成更多小步骤
原来洗衣服分3步,每步30分钟,每30分钟出一批成品。现在把每步再拆成2小步,变成6步,每步15分钟——每15分钟就能出一批成品。单件衣服仍然要90分钟洗完,但出成品的频率翻倍了。
典型实例
Intel Pentium 4采用20级超深流水线,主频高达3.8GHz,但分支预测失败的惩罚也高达20个周期。
八、超标量
定义
在处理器内部集成多条流水线,单个时钟周期内同时执行多条独立指令,使IPC > 1。核心是硬件动态调度。本质是以空间换时间。
生活例子:多个水龙头同时放水
原来厨房只有1个水龙头,一次只能接1桶水。超标量 = 装了2个水龙头,一次能同时接2桶水。厨房里的调度员(硬件)现场判断哪两桶可以同时接。
简单代码示例
指令1:R1 = R2 + R3 (独立)
指令2:R4 = R5 + R6 (独立)
普通流水线需要2个周期,2发射超标量只需1个周期。
典型实例
ARM Cortex-A77:6-wide超标量,每周期可发射6条指令。
九、VLIW(超长指令字)
定义
由编译器在编译阶段将多条无依赖的独立指令打包成一条超长指令字,硬件按固定宽度拆包后同步发射到各执行单元并行执行。无需硬件动态调度。本质是以软件换硬件。
生活例子:厨师长提前写好大订单
4个厨师各管一摊(炒菜、煲汤、备料、装盘)。厨师长(编译器)在开工前就把所有菜安排好,写成一张大订单:同一时刻厨师A炒饭、厨师B煮汤、厨师C取鸡蛋、厨师D放剩菜。厨师们不需要动脑子,照单干活。
简单代码示例
指令1:LOAD R1, [b] (取数据b)
指令2:LOAD R2, [e] (取数据e)
指令3:ADD R3, R1, R4 (b+c,依赖指令1)
指令4:ADD R5, R2, R6 (e+f,依赖指令2)
编译器发现指令1和2无依赖,打包并行执行;指令3和4无依赖,打包并行执行。4条指令只需2个周期。
VLIW的弱点
如果所有指令都有依赖(炒饭→蛋炒饭→装盘),4个厨师只有1个在忙,其他3个闲着填NOP。因此VLIW适合规则循环(如DSP信号处理),不适合通用程序。
典型实例
TI TMS320C6x系列DSP、Intel Itanium(EPIC架构)。
十、三种并行技术对比
| 对比维度 | 超流水线 | 超标量 | VLIW |
|---|---|---|---|
| 核心思想 | 细化流水段,提高主频 | 硬件动态多发射 | 编译器静态打包 |
| 本质 | 以时间换空间 | 以空间换时间 | 以软件换硬件 |
| IPC | = 1 | > 1 | > 1 |
| 硬件复杂度 | 中等 | 极高 | 极低 |
| 生活比喻 | 把大步骤拆成更多小步骤 | 多个水龙头同时放水 | 厨师长提前写好大订单 |
十一、单缓冲区
定义
只有一块缓冲区。DMA把数据写入缓冲区后,CPU必须先把数据搬走,缓冲区才能被释放给下一次读入。读入(T)和传送(M)不能并行,因为它们共用同一块缓冲区。
公式
T_单缓冲 = n × (T + M) + C
稳定状态下每块耗时 = max(T, C) + M
生活例子:一个货架
快递员(DMA)把包裹放到唯一的货架上,前台(CPU)必须先把包裹拿走处理,货架空了快递员才能放下一批。快递员经常闲着等货架空出来。
数值例子
T=100μs, M=40μs, C=30μs,处理3块数据:
- 流水线周期 = T + M = 140μs
- 总时间 = 3 × 140 + 30 = 450μs(最后传送完成)+ 30μs(最后处理)= 480μs
十二、双缓冲区
定义
有两块缓冲区A和B交替使用(乒乓操作)。DMA往A写时,CPU从B读;DMA写完A切换到B,CPU切换到A。读入和传送可以完全并行。
公式
T_双缓冲 = (n-1) × max(T, M+C) + T + M + C
稳定状态下每块耗时 = max(T, M+C)
生活例子:两个货架
快递员往货架A放包裹时,前台同时从货架B取包裹处理。A满了换B,B满了换A。双方都不用互相等,效率大幅提升。
数值例子
T=100μs, M=40μs, C=30μs,处理3块数据:
- 流水线周期 = max(T, M+C) = max(100, 70) = 100μs
- 总时间 = 2 × 100 + 170 = 370μs
单缓冲 vs 双缓冲对比
| 对比维度 | 单缓冲 | 双缓冲 |
|---|---|---|
| 读入与传送 | 串行 | 并行 |
| 流水线周期 | T + M | max(T, M+C) |
| 3块数据总耗时 | 480μs | 370μs |
十三、流水线划分原则(段间均衡)
定义
- 能同时执行的操作(使用不同硬件资源)→ 划分为独立的流水线阶段
- 只能串行执行的操作(共享同一硬件资源)→ 合并为一个阶段
生活例子:厨房工位划分
炒菜和煲汤用不同的炉灶 → 划分为两个独立工位。但如果加盐和翻炒都用同一把铲子 → 应该合并为一个工位,否则分成两个工位也没有意义(后一个必须等前一个用完铲子)。
反例
错误划分:
段1:加法(用ALU)→ 段2:移位(也用ALU)
问题:段2必须等段1完成,中间有气泡,白白浪费
正确划分:
段1:加法+移位(都用ALU,合并为"执行"段)
好处:没有无意义的气泡,各段资源独立
全局记忆口诀
| 知识点 | 一句话记忆 |
|---|---|
| 流水线原理 | 洗衣房:第1桶在烘干时,第2桶已经在洗了 |
| 流水线冒险 | 水龙头冲突、数据依赖、不知道下一步干什么 |
| 流水线周期 | 工厂最慢的工位决定整条线的节奏 |
| 执行时间 | 火车过站:头车到达时间 + 后续车厢逐节到达 |
| 吞吐率 | 餐厅每小时出多少道菜 |
| 加速比 | 搬砖:5人接力比1人快多少倍 |
| 超流水线 | 把大步骤拆成更多小步骤,出成品更快 |
| 超标量 | 多个水龙头同时放水,硬件现场调度 |
| VLIW | 厨师长提前写好大订单,厨师照单干活 |
| 单缓冲区 | 一个货架,快递员和前台轮流用 |
| 双缓冲区 | 两个货架,快递员和前台各用各的 |
| 段间均衡 | 共用铲子的操作合并,不同炉灶的操作分开 |

浙公网安备 33010602011771号