第 1 课|CPU Time、CPI 与 Amdahl 定律

阅读提示:这是从聊天授课内容重构的课程讲义,不是原消息的逐字拷贝。建议先阅读概念动画,再跟随推导、数值算例和练习巩固知识。

学习问题

性能必须比较同一任务的执行时间。

[[diagram:amdahl]]

核心公式

\[CPU_Time = IC × CPI / Frequency\]

数值例题

当 IC_A=2.4e9、CPI_A=1.25、f_A=3.0GHz,执行时间为 1s;系统 B 的 IC=1.8e9、CPI=1.7、f=3.2GHz,执行时间是 0.95625s,B 的加速比约为 1.0458。

推导、假设与边界

Amdahl 定律:S = 1 / ((1-p)+p/k)。其中 p 是优化部分占原执行时间的比例,k 是它被加速的倍数;极限 S_max=1/(1-p)。

延伸推导:为什么 CPI 可以小于 1?

单发射五级流水线在稳态理想情况下可以每周期完成一条指令,因此 $IPC=1,CPI=1$。多发射流水线则可能一个周期完成多条指令,例如理想四发射设计有:

\[IPC=4,\qquad CPI=\frac{1}{IPC}=0.25.\]

但这不意味着一条指令只要 0.25 个周期就执行完:单条指令延迟和整体退休吞吐量是不同概念。后续的流水线、乱序执行都会利用这一点。

延伸推导:优化优先级不是看哪块最慢

Amdahl 公式:

\[S(k)=\frac{1}{1-p+p/k}.\]

当 $k\to\infty$ 时,不能加速的比例 $1-p$ 形成硬上界。局部改进速度越快,其额外收益通常越小:

\[\frac{dS}{dk}=\frac{p}{k^2(1-p+p/k)^2}>0.\]

例如两个候选方案:A 占总时间 10% 并能加速 10 倍,B 占 40% 但只能加速 1.5 倍。应分别计算 $S_A$ 与 $S_B$,而不能简单选择“局部加速倍数更大”的方案。

什么时候 CPI 分解容易失效?

如果两个 Cache Miss 可以与计算阶段相互重叠,那么把“每次 Miss 的服务延迟”直接累加到总周期会重复计数。对于真实乱序处理器,推荐结合周期统计、退休瓶颈分析与关键路径解释,而不是只从 Cache Miss Count 推算总时间。

实际测量的口径

Linux 上常见的 cycles、instructions、task-clock 等性能计数器分别反映不同的量。要确保频率、指令数、执行时间来自相同进程、相同范围和相同测试负载。频率动态变化时,用单一额定频率计算可能出现明显误差。

课后练习(暂不提供答案)

练习:程序计算占 55%、内存停顿占 30%、分支停顿占 15%。分支停顿加速 2 倍后,整体至少加速 1.5 倍要求内存停顿加速多少倍?

后续学习

沿各门课 12 周知识树继续递进,必要时回顾本课基本概念。