跳转至

性能公式与 Amdahl 定律

“更快”必须先说明指标、工作负载和基线。峰值频率、单条延迟、系统吞吐量、能耗和尾延迟可能给出完全不同的结论。

CPU 时间公式

程序 CPU 时间可分解为:

\[ T_{CPU}=IC\times CPI\times T_{cycle} \]

或:

\[ T_{CPU}=\frac{IC\times CPI}{f}. \]

\(IC\) 是动态指令数,\(CPI\) 是每条指令平均周期数,\(f\) 是时钟频率。编译器优化可能减少 \(IC\) 却增加 cache miss;微体系结构优化可能降低 CPI 却拉长时钟周期。单看其中一项会误判。

若多类指令的 CPI 不同:

\[ CPI=\sum_i p_i CPI_i, \]

其中 \(p_i\) 是动态比例。

延迟、吞吐与尾延迟

  • 延迟:一个任务从开始到完成的时间;
  • 吞吐量:单位时间完成的任务数;
  • 尾延迟:较慢分位数,如 P99 响应时间。

批处理和流水线可提高吞吐,却可能增加单个请求等待。平均值也会掩盖罕见的 cache miss、页故障或 SSD 垃圾回收,因此在线系统常看分位数。

加速比

新方案相对旧方案的加速比是:

\[ Speedup=\frac{T_{old}}{T_{new}}. \]

若时间从 10 s 降到 8 s,加速比为 1.25,而不是“快 2 s”就能跨工作负载比较。

Amdahl 定律

设原执行时间中比例 \(p\) 的部分可加速 \(s\) 倍,其余不变,则:

\[ Speedup_{total}=\frac{1}{(1-p)+\frac{p}{s}}. \]

最小完整例子

某程序 60% 时间在向量计算,向量单元让这部分快 4 倍:

\[ Speedup=\frac{1}{0.4+\frac{0.6}{4}}=\frac{1}{0.55}\approx 1.82. \]

局部快了 4 倍,整体只有约 1.82 倍。如果可加速部分无限快:

\[ Speedup_{max}=\frac{1}{1-p}=2.5. \]

不可优化的 40% 决定上限。

“比例”会随优化变化

优化前占 60% 的部分被加速后,它在新运行时间中的比例会下降。不能拿优化后的采样比例直接代入以原时间为基准的 \(p\),也不能连续优化时简单相加加速比。

这解释了性能工作的循环:优化最大热点后重新测量,新瓶颈会浮现。

并行效率

\(N\) 个处理单元获得加速比 \(S_N\) 时,并行效率为:

\[ E_N=\frac{S_N}{N}. \]

同步、通信、负载不均和串行部分会让效率下降。弱扩展通过随处理器数增加问题规模,可能保持较好利用率;强扩展固定问题规模,更快遇到 Amdahl 上限。

性能、功耗与能量

功率是单位时间能量,能量是完成任务的总消耗:

\[ E=P\times T. \]

更快完成可能提高瞬时功率却减少总能量,也可能相反。移动设备关注能量与热约束,数据中心还关注吞吐每瓦。降低电压对动态功耗影响显著,但可能迫使频率下降。

正确的测量习惯

  1. 使用代表性输入和完整系统;
  2. 明确冷 cache、热 cache和预热阶段;
  3. 多次测量并报告波动与分位数;
  4. 区分 CPU 时间、墙钟时间和 I/O 等待;
  5. 同时查看指令数、周期、miss 和带宽等计数器;
  6. 先验证结果正确,再比较性能。

自测

  1. 为什么提高频率可能反而增加总执行时间?请从 CPI 变化举例。
  2. 可优化比例 90%、局部加速 10 倍时,总加速比是多少?
  3. 吞吐量提升但 P99 变差,可能发生了什么排队权衡?