IE4756 性能与 I/O 练习

IE4756 性能与 I/O 练习

9 道原创题 · 对应讲义 5(性能)与讲义 6(总线 / I/O / 存储)· 全部数值已校验
用法 答案默认折叠。先自己算完再点开,别偷看。每题下面都标了「陷阱」——那是真题里实际扣分的地方。

A 组 CPI 与性能Lecture 5

A1指令混合求 CPI、MIPS 与指令条数8 分

一台 Load-Store 架构的计算机工作在 800 MHz。某基准程序的指令混合与各类指令的 CPI 如下表。

指令类别出现频率CPI
Integer ALU50 %1
Load20 %3
Store10 %3
Branch15 %2
Floating-Point5 %16

求平均 CPI 与 MIPS rating。已知该程序运行 0.25 秒,求执行的浮点指令条数。

查看详解
① 平均 CPI = 按频率加权求和
0.50(1) + 0.20(3) + 0.10(3) + 0.15(2) + 0.05(16)
= 0.5 + 0.6 + 0.3 + 0.3 + 0.8 = 2.5
CPI = 2.5
② MIPS rating

每秒 800×10⁶ 个周期,每条指令平均吃 2.5 个周期:

800×10⁶ ÷ 2.5 = 320×10⁶ 条/秒
320 MIPS
③ 浮点指令条数
总指令数 = 320×10⁶ × 0.25 = 80×10⁶
浮点 = 5% × 80×10⁶ = 4×10⁶
4 × 10⁶ 条(400 万条)
顺手记一笔:浮点只占 5% 的指令条数,却贡献了 0.8 / 2.5 = 32% 的周期。这个观察在下一题和 Amdahl 那题会直接用到。
A2新编译器:CPI 上升,程序却变快了12 分

针对 A1 的同一台机器和同一个基准程序,新编译器可以消除 50% 的 Integer ALU 指令和 20% 的 Floating-Point 指令,但会让 Load、Store、Branch 各增加 20%。

求优化后的平均 CPI 与 MIPS rating,以及新编译器带来的加速比。对结果作出评论。

查看详解
① 取 100 条指令作基准,把百分比变成条数
类别原条数新条数CPI新周期
Integer ALU5025125
Load2024372
Store1012336
Branch1518236
Floating-Point541664
合计10083—233

原周期数 = 100 × 2.5 = 250(与 A1 一致,可作验算)。

② 新 CPI 与新 MIPS
新 CPI = 233 ÷ 83 = 2.807
新 MIPS = 800 ÷ 2.807 = 285.0
CPI ≈ 2.807  MIPS ≈ 285.0
③ 加速比(频率不变,比周期数即可)
250 ÷ 233 = 1.073
加速比 ≈ 1.073(快约 7.3%)
④ 评论 —— 这才是这题的考点

CPI 从 2.5 升到 2.807,MIPS rating 从 320 降到 285,但程序实际快了 7.3%。

原因是编译器删掉的恰恰是最便宜的 ALU 指令(CPI = 1),剩下的指令里「贵指令」占比变高,平均 CPI 自然上升;但指令总数从 100 降到 83,总周期数从 250 降到 233,真正的工作量减少了。

陷阱:只看 CPI 或 MIPS 都会得出「变慢了」的错误结论。唯一可信的是 CPU 时间 = IC × CPI ÷ f —— IC 掉 17%,CPI 涨 12%,净效果是时间降到 93.2%。这句评论通常值 2–3 分。
A3Amdahl 定律:换 FPU 的加速上限5 分

在 A2 的优化代码基础上,换装一个新的浮点单元,可以显著降低浮点指令的 CPI,且不影响时钟频率和其它功能。

用 Amdahl 定律求可能达到的最大总加速比。写明你的假设。

查看详解
① 找出「可被改进的部分」占多大比例

A2 的优化代码共 233 个周期,其中浮点占 4 × 16 = 64 个:

f = 64 ÷ 233 = 0.2747
② 套 Amdahl 上限
Speedup_max = 1 ÷ (1 − f) = 233 ÷ (233 − 64) = 233 ÷ 169
最大加速比 ≈ 1.379
③ 必须写出的假设
  1. 浮点部分的执行时间可压缩到趋近 0(数学极限,物理上做不到)
  2. 时钟频率不变
  3. 指令数与指令混合比例不变
  4. 非浮点部分完全不受影响
加分写法:再给一个现实上界——浮点 CPI 最低也就到 1(一条指令总得占一个周期),此时总周期 = 233 − 64 + 4 = 173,加速比 = 233 ÷ 173 ≈ 1.347。把 1.379 当理论上界、1.347 当实际上界一起写,改卷老师会喜欢。
A4倒推:预测器要多准才值得装10 分

某 CPU 有 50% 的时间花在分支指令上。加装分支预测后,预测正确时一条分支快 4 倍,预测错误时慢 2 倍。

  1. 要达到 1.25 倍的总加速比,预测准确率至少要多高?
  2. 准确率低到多少时,加装预测器反而得不偿失?
  3. 即使预测 100% 正确,总加速比的上限是多少?
查看详解
① 先把总时间拆成两块

设原总时间 = 1,准确率 = a。快 4 倍 ⇒ 时间 × 1/4;慢 2 倍 ⇒ 时间 × 2。

T′ = 0.5 + 0.5 [ a/4 + 2(1 − a) ]
② 解第 (1) 问

加速比 1.25 ⇒ T′ = 1 ÷ 1.25 = 0.8:

0.5 [ 0.25a + 2 − 2a ] = 0.3
0.25a + 2 − 2a = 0.6 ⇒ −1.75a = −1.4
a = 0.8,即准确率至少 80%
③ 第 (2) 问:盈亏平衡点

令加速比 = 1,即 T′ = 1:

0.25a + 2 − 2a = 1 ⇒ −1.75a = −1 ⇒ a = 4/7
a = 4/7 ≈ 57.1%

低于此值,预测器反而让机器变慢——因为猜错的惩罚(2 倍)比猜对的奖励(1/4)更重。

④ 第 (3) 问:理论上限
a = 1 ⇒ T′ = 0.5 + 0.5 × 0.25 = 0.625
上限 = 1 ÷ 0.625 = 1.6

这就是 Amdahl 天花板:剩下那 50% 的非分支时间纹丝不动。

准确率50%57.1%70%80%90%100%
加速比0.9411.0001.1271.2501.4041.600
陷阱:「快 k 倍」是时间除以 k,「慢 k 倍」是时间乘以 k。写反了整题作废,这是这类题唯一的技术难点。
A5流水线 CPI 的最紧上界5 分

某流水线 CPU 有如下特性:

  1. 每条浮点除法指令最多 24 个周期完成;
  2. 其它指令最多 4 个周期完成(忽略 cache 缺失);
  3. 任何使用除法结果的指令,要等最近一条除法完成后才开始执行;
  4. 其它指令都在前一条指令开始后的 1 个周期开始执行。

程序 Q 在每条除法之后都紧跟 1 条使用除法结果的指令和至少 3 条无关指令。求该 CPU 运行 Q 时 CPI 的最紧上界。

查看详解
① 先判断哪个数据用得上

「其它指令 4 个周期」是干扰项——规则 4 保证每周期能发射一条,没有任何指令在等它们的结果,所以这个 4 从头到尾用不上。唯一会造成停顿的是规则 3。

② 排时间线(设除法在周期 0 开始)
指令开始周期依据
浮点除法0起点
使用结果的指令24规则 3:必须等除法完成
无关指令 ①25比前一条晚 1 周期
无关指令 ②26同上
无关指令 ③27同上
下一条除法28新一轮开始
CPI ≤ 28 ÷ 5 = 5.6
CPI ≤ 5.6
③ 为什么这是「最紧」的

自由度一(无关指令条数 k):一轮周期 = 25 + k,指令数 = k + 2,CPI = (25+k)/(k+2)。k = 3 时 5.6;k = 4 时 4.83;k = 5 时 4.29——单调递减,k = 3 最坏。

自由度二(排列顺序):若把 3 条无关指令排在使用结果的指令之前,它们就被塞进了 24 周期的空洞里:除法 0,无关 1、2、3,使用结果 24,下一条除法 25 ⇒ CPI = 25/5 = 5.0。比 5.6 小。

所以 5.6 是取遍所有合法情况的最大值,且该排法合法、可达 ⇒ 既是上界又可达 ⇒ 最紧。

通式:除法延迟 L、后跟 k 条无关指令时,CPI ≤ (L + k + 1) / (k + 2)。本题 L = 24、k = 3 ⇒ 28/5。

B 组 总线 / I/O / 存储Lecture 6

B1磁盘:延迟与传输各占多少10 分

一块磁盘转速 10000 RPM,寻道时间 5 ms,传输率 100 MB/s。

  1. 读取 200 个各 1.2 MB 的文件(分散存放)需要多久?其中延迟占多大比例?
  2. 若这些数据合并成一个连续的 240 MB 文件,又需要多久?加速多少倍?
查看详解
① 先算平均延迟
每转 = 60000 ÷ 10000 = 6 ms
平均旋转延迟 = 6 ÷ 2 = 3 ms (平均等半圈)
平均延迟 = 寻道 5 + 旋转 3 = 8 ms
② 第 (1) 问:200 个分散的小文件

每个文件都要重新寻道 + 等旋转,然后才传输:

传输 = 1.2 MB ÷ 100 MB/s = 12 ms
每文件 = 8 + 12 = 20 ms ⇒ 200 × 20 = 4000 ms
4.0 秒,其中延迟占 8/20 = 40%
③ 第 (2) 问:一个连续大文件

只需要一次寻道和旋转,之后连续传完:

8 ms + 240 MB ÷ 100 MB/s = 8 + 2400 = 2408 ms
2.408 秒,加速 4000 ÷ 2408 ≈ 1.66 倍
考点:同样的数据量,仅仅因为「分散 vs 连续」就差了 1.66 倍——延迟是按次数收费的,传输是按字节收费的。文件越小、个数越多,延迟占比越高。这也是为什么操作系统要做磁盘碎片整理,以及为什么 SSD(几乎没有寻道和旋转)对小文件的提升远大于对大文件。
对照 Tutorial 5 Q2:那道题没给传输率,所以只能算到 Latency(答案 700 ms);这道题给了传输率,就必须把传输时间算进去。题目给了什么参数,决定你能算到哪一步。
B2DMA 占用了多少 CPU 时间8 分

一块视频采集卡以恒定 163,840,000 bit/s 产生数据。每个数据块先经一次 DMA 从采集卡传入主存缓冲区,再经一次 DMA 从缓冲区传到 SSD。DMA 块大小 4096 字节。CPU 主频 200 MHz,每次 DMA 传输需要 800 个周期设置、传输结束后再用 400 个周期处理中断。

  1. 录制过程中,CPU 有多大比例的时间被占用?
  2. 数据率要达到多少,才会把 CPU 完全占满?
查看详解
① 一秒钟有多少个数据块
163,840,000 ÷ 8 = 20,480,000 字节/秒
20,480,000 ÷ 4096 = 5,000 块/秒
② 每块要几次 DMA —— 最容易漏的一步

题干说得很明白:每块要两次(采集卡→主存,主存→SSD):

5,000 × 2 = 10,000 次 DMA / 秒
③ 每次占用 CPU 多少周期

DMA 的意义是搬运本身不用 CPU 管,但两头的手续还得 CPU 做:

800(设置)+ 400(中断服务)= 1,200 周期/次
④ 占比
10,000 × 1,200 = 12,000,000 周期/秒
12,000,000 ÷ 200,000,000 = 0.06
占用 6%
⑤ 第 (2) 问:占满需要多大数据率
每秒可用周期 200×10⁶ ÷ 1200 = 166,667 次 DMA
÷ 2 = 83,333 块 × 4096 B = 341,333,333 B/s
约 341 MB/s(≈ 2.73 Gbit/s)
考点:DMA 的威力就在这两个数字里。若改用程序查询 I/O,CPU 要亲手搬每一个字节,占用率会飙到几十个百分点;用了 DMA,CPU 只在每块的头尾出面一下,2000 万字节/秒才占 6%,而且要到 341 MB/s 才会被占满。这就是讲义 6 那句 "The CPU gives bus control temporarily to the DMA controller" 的定量版本。
B3同步总线的带宽、效率与时钟偏移10 分

一条同步总线工作在 200 MHz,数据通路 64 位。每次事务用 1 个周期送地址,随后每个周期传一个数据字。

  1. 传输一个 64 字节的块,需要多少时间?实际带宽和总线效率各是多少?
  2. 若每次只传 1 个字(8 字节),效率又是多少?说明差别的原因。
  3. 若把时钟提到 1 GHz,而总线两端的时钟偏移(skew)固定为 1 ns,会发生什么?
查看详解
① 第 (1) 问
64 字节 ÷ 8 字节/字 = 8 个字
周期数 = 1(地址)+ 8(数据)= 9
时间 = 9 ÷ 200 MHz = 45 ns
带宽 = 64 B ÷ 45 ns = 1.422 GB/s
效率 = 8 ÷ 9 = 88.9%
45 ns | 1.42 GB/s | 效率 88.9%
② 第 (2) 问
周期数 = 1 + 1 = 2,时间 = 10 ns
带宽 = 8 B ÷ 10 ns = 0.8 GB/s,效率 = 1/2 = 50%
效率只有 50%,带宽掉到 0.8 GB/s

原因:地址那一个周期是固定开销,它被摊薄在数据周期上。块越大摊得越薄(8 个数据字时开销只占 1/9),块越小占比越高。这就是为什么现代总线和 cache 都用「成块传输」。

③ 第 (3) 问:时钟偏移
200 MHz ⇒ 周期 5 ns,1 ns 偏移 = 周期的 20%,还能容忍
1 GHz ⇒ 周期 1 ns,1 ns 偏移 = 整整一个周期

此时总线两端对「现在是第几个周期」的理解完全不一致,同步协议直接失效。

这正是讲义 6 讲总线演进的理由:频率一高,同步总线就撞上时钟偏移的墙。解决办法要么换成异步总线(用四相全互锁握手,不依赖共同时钟),要么像 PCIe 那样把时钟嵌进数据流里由接收端恢复,并从「并行共享」转向「串行点对点」。
B4带宽可以叠加,延迟不能8 分

一个存储阵列有 4 块磁盘,每块的传输率 150 MB/s,平均访问延迟 10 ms。

  1. 读取一个 300 MB 的文件,它被条带化(striping)均匀分布在 4 块盘上。需要多久?比单盘存放快多少?
  2. 读取一个 4 KB 的数据块(只在一块盘上)需要多久?增加盘数对这个操作有帮助吗?
  3. 由此总结一条原则。
查看详解
① 第 (1) 问:条带化读大文件

4 块盘同时工作,每块只需读 300 ÷ 4 = 75 MB:

10 ms + 75 MB ÷ 150 MB/s = 10 + 500 = 510 ms

若全部放在单块盘上:

10 ms + 300 ÷ 150 = 10 + 2000 = 2010 ms
510 ms,比单盘快约 3.94 倍

注意加速比是 3.94 而不是 4——那 10 ms 的延迟没有被分摊掉。

② 第 (2) 问:读一个小块
传输时间 = 4 KB ÷ 150 MB/s ≈ 0.026 ms
总时间 = 10 + 0.026 ≈ 10.03 ms
10.03 ms,而且增加盘数完全没有帮助

因为 99.7% 的时间花在那一块盘的机械寻道和旋转上,其它三块盘帮不上任何忙——一个 4 KB 的块没法被切成四份分给四块盘去找。

③ 第 (3) 问:原则
带宽可以叠加,延迟不能。加设备、加通道、加宽总线,都能成倍提高吞吐;但单次操作的延迟由物理过程(磁头移动、盘片旋转、信号飞行时间)决定,并行化对它无能为力。

这条原则在整门课里反复出现:流水线提高吞吐但不缩短单条指令的延迟;cache 减少的是延迟而不是带宽;多核提高吞吐但单线程延迟不变。