【软考备考】流水线计算详解:吞吐率、加速比、效率,看懂时空图就不用背公式(附 10 道练习)
数据表示四篇收官之后,开一个新战场:流水线。
软考上午题每年固定考一道流水线计算题,问法就三种:总时间多少、吞吐率多少、加速比多少。很多同学是背公式上考场的,一紧张就串——其实这三个公式根本不用背,看懂一张时空图,公式是你自己推出来的。
一、流水线:指令执行的"工厂装配线"
一条指令的执行可以分成几段,以经典的三段为例:取指 → 分析(译码)→ 执行。
顺序执行就像小作坊:取完第 1 条、分析第 1 条、执行第 1 条,然后才开始第 2 条。n 条指令就是 n 个"三段",慢慢磨。
流水线是装配线思路:第 1 条指令离开"取指"进入"分析"的那一刻,"取指"工位别闲着,马上开始取第 2 条。这样三条指令在时间上是重叠的:
段\时间 | 1 | 2 | 3 | 4 | 5 取指 | ① | ② | ③ | | 分析 | | ① | ② | ③ | 执行 | | | ① | ② | ③ |这就是时空图:横轴时间,纵轴流水段。3 条指令、3 段,总共 5 个时间片就全部走完;顺序执行要 9 个。
先建立一个关键认知(概念题爱考):流水线没有缩短单条指令的执行时间——指令 ① 从头到尾照样花 3 个时间片。它提高的是整体吞吐:单位时间内完成的指令条数变多了。
二、总时间公式:看图推,不用背
设流水线 k 段、每段时间 Δt、执行 n 条指令。看时空图:
第 1 条指令要完整走过 k 段,花k·Δt;
它一旦"流出",后面每过一个 Δt 就流出一条新指令,剩下 n-1 条再花(n-1)·Δt。
合起来:
T = (k + n - 1)·Δt
对照上面的图:k=3、n=3,T = (3+3-1)Δt = 5Δt,和图一致 ✓。
顺序执行时间更简单:每条指令 k·Δt,n 条就是n·k·Δt。
三、三个指标,都是上面两个时间的变形
1. 吞吐率 TP= 完成的指令数 ÷ 总时间:
TP = n / [(k+n-1)·Δt]n 趋于无穷大时,(k+n-1)≈n,所以最大吞吐率 TP_max = 1/Δt——每个时间片流出一条,这是流水线的理论极限。
2. 加速比 S= 顺序时间 ÷ 流水时间:
S = n·k·Δt / [(k+n-1)·Δt] = nk / (k+n-1)n 趋于无穷大时 S→k——最大加速比就是段数。三段流水线撑死快 3 倍,很直觉:三个工位同时干活。
3. 效率 E:时空图里"被占用的格子"占"总格子"的比例:
E = n·k 个占用格 / [k·(k+n-1)] 个总格 = n / (k+n-1)注意一个隐藏关系:E = S ÷ k(加速比除以段数)。三个指标一串,记一个全有了。
四、各段时间不相等:瓶颈说了算
真实的流水线各段 rarely 一样长。比如取指 2Δt、分析 2Δt、执行 1Δt——流水线还能按 1Δt 的节奏走吗?
不能。装配线的节奏由最慢的工位决定,慢工位前会堆积,快工位会饿肚子。所以:
流水线周期 Δt = 各段时间的最大值(瓶颈段时间)总时间 T = 各段时间之和 + (n-1) × 瓶颈时间
公式变了形:第一条指令还是要把每段都真实走一遍,所以首条花的是各段时间之和;之后每过一个瓶颈时间流出一条。
例题:取指 2Δt、分析 2Δt、执行 1Δt,执行 100 条指令。
周期 = max(2,2,1) = 2Δt T = (2+2+1) + 99×2 = 5 + 198 = 203Δt TP = 100 / 203Δt注意 203Δt ≠ (3+100-1)×2Δt = 204Δt——"各段之和"和"段数×瓶颈"不相等时,套错公式就差这一点点,软考选项里一定躺着这个错误答案等你。
五、断流:概念题的三分
流水线理想很丰满,实际会"断流",三种相关(了解概念即可):
数据相关:后一条指令要用前一条的结果,结果还没算出来,只能等;
控制相关:转移(跳转)指令改变了执行顺序,后面预取的指令作废;
结构相关:硬件资源冲突,比如两条指令同时要访存。
记住关键词"相关",概念题看到就能选。
六、10 道练习题
基础题(1~5)
1.流水线技术的本质是( )。
A. 提高单条指令的执行速度 B. 减少程序中的指令条数 C. 让多条指令在时间上重叠执行,提高整体吞吐 D. 提高 CPU 主频
2.某流水线分为 k 段,每段时间均为 Δt,连续执行 n 条指令,所需总时间为( )。
A. n·k·Δt B. (k+n-1)·Δt C. (k+n)·Δt D. n·Δt
3.某 3 段流水线,每段时间均为 2ns,连续执行 10 条指令,总时间为( )。
A. 60ns B. 22ns C. 20ns D. 24ns
4.同上题条件,流水线相对于顺序执行的加速比为( )。
A. 3 B. 2.5 C. 2 D. 10
5.各段时间均为 Δt 的流水线,其最大吞吐率为( )。
A. 1/Δt B. k/Δt C. n/Δt D. 1/(k·Δt)
进阶题(6~10,带坑)
6.某流水线 4 段,各段时间分别为 1ns、3ns、2ns、2ns,该流水线的周期应取( )。
A. 2ns(平均值) B. 8ns(各段之和) C. 1ns(最快段) D. 3ns(最慢段)
7.同上题的流水线,连续执行 100 条指令,总时间为( )。
A. 800ns B. 305ns C. 309ns D. 300ns
8.某 3 段流水线每段均为 2ns,执行 10 条指令,其效率为( )。
A. 100% B. 62.5% C. 83.3% D. 25%
9.关于流水线,下列说法错误的是( )。
A. 流水线段数越多,最大加速比越大 B. 转移指令可能导致流水线断流 C. 流水线能提高单条指令的执行速度 D. 数据相关会影响流水线的效率
10.某指令流水线由取指(2Δt)、译码(2Δt)、执行(1Δt)三段组成,连续执行 100 条指令,其吞吐率为( )。
A. 100/(203Δt) B. 1/(5Δt) C. 1/(2Δt) D. 100/(303Δt)
七、答案与详解
1. C本题是概念题的坑王:流水线不缩短单条指令的执行时间(每条指令照样走完所有段),它靠的是多条指令时间重叠提高吞吐。选 A 的最多,务必扭转这个直觉。
2. B第一条走满 k·Δt,之后每 Δt 出一条:(k+n-1)·Δt。A 是顺序执行的时间,放这儿当诱饵。
3. DT = (3+10-1)×2 = 12×2 =24ns。选 A 的算成了顺序时间 10×3×2=60;选 C 的是 n×Δt,忘了第一条要"灌满"流水线。
4. B加速比 = 顺序 ÷ 流水 = 60 ÷ 24 =2.5。坑:选 A 的用了"最大加速比 = 段数"——那是 n→∞ 的极限,10 条指令还到不了。
5. A最大吞吐率 = 1/Δt,每拍出一条。和段数无关——段数多只是让"接近这个极限"来得更快。
6. D瓶颈定周期:流水线节奏由最慢段决定,取 max =3ns。选 A(平均值)是最常见的错法——流水线不按平均节奏走,慢工位前会积压。
7. B各段不等套变形公式:T = 各段之和 + (n-1)×瓶颈 = (1+3+2+2) + 99×3 = 8 + 297 =305ns。坑:选 C(309ns)的错用等段公式 (k+n-1)×Δt = 103×3——首条指令花的是各段之和 8,不是 4×3=12,差就差在这里。
8. CE = n/(k+n-1) = 10/12 ≈83.3%。也可以用 E = S/k = 2.5/3 验算,结果一致——这两条路的交汇点软考都埋过选项。
9. C选"错误的":A 对(最大加速比=段数);B 对(控制相关);D 对。C 错——第 1 题的坑换个马甲再来一次:流水线提高的是吞吐,单条指令的执行时间一点没变短。
10. A真题原型。周期 = max(2,2,1) = 2Δt;T = (2+2+1) + 99×2 = 203Δt;TP =100/(203Δt)。三个干扰项全是坑:B 是拿顺序时间算的(100/(100×5Δt));C 是最大吞吐率1/(2Δt)——题目问的是这 100 条的实际吞吐率,不是理论极限;D 是错用等段公式 (3+100-1)×2=204…… 甚至错上加错凑出 303。这类题做完一定要问自己:问的是"实际"还是"最大"。
八、五句话带走
流水线靠时间重叠提高吞吐,单条指令一点没变快;
各段相等:T = (k+n-1)·Δt;
各段不等:周期取瓶颈,T = 各段之和 + (n-1)×瓶颈;
三个指标:TP = n/T,S = nk/(k+n-1),E = n/(k+n-1) = S/k;
看清题目问"实际"还是"最大"——最大值都是 n→∞ 的极限:TP_max = 1/Δt,S_max = k。
下一篇预告:计算机组成原理的最后一座大山——存储系统:Cache 命中率与平均访问时间怎么算、主存地址怎么按"字块号+块内地址"拆分、直接映射/全相联/组相联到底差在哪。拿下它,计组部分就毕业了。