AIGC标识 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 厨师长提前写好大订单,厨师照单干活
单缓冲区 一个货架,快递员和前台轮流用
双缓冲区 两个货架,快递员和前台各用各的
段间均衡 共用铲子的操作合并,不同炉灶的操作分开
posted @ 2026-09-04 15:46  渡solong~  阅读(2)  评论(0)    收藏  举报