人们很容易以为,把处理器和核心增加到两倍、四倍,程序也会相应地快那么多。可真正运行起来,体感速度的提升往往远小于预期。无法并行拆分的部分会拖住整体速度——这一洞见就是“阿姆达尔定律(Amdahl’s Law)”。
简单来说,阿姆达尔定律是指“只改进或并行化某项工作的一部分时,整体加速比的上限由无法改动的串行部分决定”。计算机科学家吉恩·阿姆达尔(Gene Amdahl)在1967年AFIPS春季联合计算机会议上发表的论文《实现大规模计算能力的单处理器方法的有效性》(Validity of the Single Processor Approach to Achieving Large Scale Computing Capabilities)中提出了这一论述。
本文将依次介绍阿姆达尔定律所说的加速比含义、串行比例如何决定上限、烹饪与装配线等日常比喻和多核的现实,以及它与古斯塔夫森定律的区别和使用方法。
阿姆达尔定律揭示的并行极限
加速比与串行部分的含义

阿姆达尔定律原本是讨论“改进系统一部分时整体性能能提高多少”的一般原理,如今最常用于预测并行计算的理论加速比。关键不在于一次性放大整个工作,而在于把可以并行拆分的部分和必须按顺序完成的部分区分开来看。
设总执行时间中可并行的比例为p,处理器(或核心)数为N,理论加速比就是1除以((1−p)+p/N)。若改用串行比例s表示,加速比就是1除以(s+(1−s)/N)。N越大,并行部分的影响越小,但串行部分s始终不变。即使处理器无限增加,加速比也不会超过1/s。
- 加速比(Speedup):改进前的执行时间除以改进后的执行时间。
- 串行比例(Serial Fraction):无法同时拆分、必须按顺序处理的时间比例。
- 并行比例(Parallel Fraction):可以分给多个处理器同时运行的时间比例。
为什么增加核心,体感却不明显

只看公式可能有些抽象,想想常被提到的上限就有直观感受了。如果工作只有一半能并行,那么核心再多,整体加速比最多也只有两倍。即使可并行的比例达到95%,理论上限也只有二十倍,因为剩下5%的串行部分拖住了整体速度。
(1) 收益递减来得很快
在串行比例相同的情况下,核心从2个增加到4个、8个,带来的收益会越来越小。当并行部分已经变短之后,串行部分就成了瓶颈。
(2) 通信与同步也接近串行
实际把工作分到各个核心上时,会产生汇总结果、加锁、保持内存一致的时间。这些开销不在公式“完美并行”的假设之内,所以体感加速比往往比理论值还低。
(3) 一条单行道的瓶颈决定全局
即使是读取文件、初始化、最终汇总这样短小的串行代码,只要所占比例不小,就会大幅削低上限。这就是设计多核CPU和GPU加速时,先问“哪里还留有串行”,再问“该并行化哪里”的原因。
用烹饪和装配线看日常比喻

阿姆达尔定律在计算机之外也以同样的结构出现。想象一下为十位客人准备晚餐。切菜、炒菜的帮手越多就越快,但放进烤箱烘烤的时间,人再多也不会缩短。如果烤箱是串行部分,那么无论增加多少人手,整个晚餐的准备时间都会被这一段牵制。
工厂装配线也是如此。即使多个工位同时组装零件,只要最终检验或包装只能排成一条线进行,这条线的处理量就决定了整体速度。开会时也一样,资料调查可以分头进行,但做出决定的那一次协商很难同时完成。
日常中值得留意的地方
- 瓶颈(Bottleneck):最慢的串行环节支配整个流程。
- 可拆分的工作(Parallel Work):能够独立、同时推进的部分。
- 协调的工作(Coordination):汇总结果、理顺顺序的成本,也会削减体感速度。
与古斯塔夫森定律一起看

阿姆达尔定律展示的是“在问题规模固定的情况下”增加处理器时的上限。而约翰·古斯塔夫森(John Gustafson)于1988年前后整理的古斯塔夫森定律(Gustafson’s Law),则是另一种视角:处理器增加时,问题本身也随之扩大,在同样的时间里完成更大的工作。更快完成一份固定的作业,和在同一期限内运行更精细的模拟,是不同的问题。
(1) 对固定规模的问题,阿姆达尔更犀利
当目标是在相同数据、相同分辨率下“更快”时,关键在于降低串行比例。更换算法、减少I/O、去掉不必要的同步,都属于这一类设计。
(2) 扩大规模时,古斯塔夫森更有力
在气象、科学计算这类可以增加网格或样本的问题上,核心越多,并行消化的工作量也随之增大,实际收益可能会很大。
(3) 不要把两者对立起来
与其说其中一个是错误的公式,不如说它们是关于“固定什么、扩大什么”的不同情景。做产品时,先确定目标是缩短延迟,还是提高处理量、扩大规模,再选用合适的视角即可。
与其看着核心数的广告抬高期望,不如先测一测自己的工作中哪里还留有串行部分。并行化的成败,与其说取决于买了多少核心,不如说更接近于把无法拆分的时间缩短了多少。
阿姆达尔定律是这样一条原理:即使只改进可以并行的部分,整体加速比的上限仍由串行部分所占的比例决定。比起增加核心,找出并缩短构成瓶颈的串行部分,更能直接触及性能的天花板。
在数处理器之前,先测一测无法拆分的时间——这就是在实践中用好阿姆达尔定律的第一步。