想象你是一家装修队的老板。今天接到两种活儿:第一种,一套60平米的小公寓,面积固定,活就这么多;第二种,一套可以不断加建的大别墅,客户撂下话——你人多就多盖几间。第一种活儿,请1个工人30天干完,请10个工人就3天?不可能。因为有些工序,比如等水泥干透、等漆晾干,你请100个工人也得干等,这些“只能一个人等”的工序,决定了你请多少人都快不到哪去。第二种活儿就不一样:房子越盖越大,能分给工人同时干的活儿越来越多,人越多干得越快,工期反而能稳住。这两种装修生意的本质,就是并行计算里大名鼎鼎的Amdahl定律和Gustafson定律。一个盯着“固定工作量下,串行工序卡死提速”,一个盯着“允许工作量扩展,并行工序带飞提速”。两双眼睛看同一个工地,却得出截然相反的结论——这篇文章就带你看懂这两把尺子,以及它们如何衡量计算机的“加速比”。

岗位关联

加速比是并行计算的“体检报告”:读懂Amdahl与Gustafson定律,你就能为AI训练、大数据集群算出该买多少算力、该优化哪段代码,这是分布式与高性能计算岗位的核心基本功。

目录
  1. 可视化演示
  2. 1. 阿姆达尔(Amdahl)定律:串行瓶颈锁死加速比
  3. 2. 古斯塔夫森(Gustafson)定律:扩大规模突破天花板
  4. 3. 两定律对比:假设定结论
  5. 4. 加速比与效率:别只看提速就上头
  6. 5. 强扩展与弱扩展:装修队的两门生意
  7. 6. Kumar尺度分析:工地上的三把尺子
  8. 7. 多核与集群设计指导:装修队的排兵布阵
  9. 8. 加速比测量实践:工地验收的真相
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

Amdahl定律和Gustafson定律从不同角度分析并行计算的加速比上限,指导并行系统设计。本文讲解Amda... 切换模式查看不同维度。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Amdahl:核心原理 动态展示关键流程与数据流动 交互控件调节参数实时渲染 f(x) = transform(x) 核心概念的可视化呈现

1. 阿姆达尔(Amdahl)定律:串行瓶颈锁死加速比

装修队接下了60平米小公寓的活儿。面积是客户定死的,活就这么多:拆改、贴砖、刷墙、等漆干、验收。贴砖刷墙可以分成八个区域让八个工人同时干,但“等漆干”这三天不行——你请一百个工人来,也得等三天。更扎心的是,“等审批”“等干透”这类工序,不管工期多紧都省不掉。于是你会发现一个残酷的事实:工人从1个加到10个,工期从30天降到8天;从10个加到100个,工期只降到6天半——越加人,提速越不明显。

这就是Amdahl定律的视角:问题规模固定,串行部分的比例s决定了加速比的天花板。所谓加速比,就是“单人工期 ÷ N人工期”,代表提升了多少倍。设串行比例s=0.2(20%的时间在等),可并行比例1-s=0.8,请N个工人后:

再让N无限增大,看看极限:

所以公寓装修的老板很快明白:与其盲目加人,不如去缩短“等漆干”的时间——比如换成快干漆,把s从0.3压到0.1,天花板立刻从3.3倍抬到10倍。Amdahl定律的工程启示就在这儿:先砍串行,再加核。

S=1s+1−sN\displaystyle S = \frac{1}{s + \dfrac{1-s}{N}}
  1. 并行项归零当工人数趋于无穷,可并行部分的时间被摊薄到几乎为零、可忽略不记。
    lim⁡N→∞1−sN=0\displaystyle \lim_{N\to\infty} \frac{1-s}{N} = 0
  2. 分母只剩串行比例整个工期的下限就是“等漆干”那几天。
    s\displaystyle s
  3. 极限加速比提速的上限就是串行比例的倒数,比如s=0.2时最多提速5倍,请10000个工人也没用。
    1s\displaystyle \frac{1}{s}

2. 古斯塔夫森(Gustafson)定律:扩大规模突破天花板

装修队老板沮丧了一阵子,突然接到一个电话:客户要把房子从60平扩建成300平的大别墅!老板眼睛一亮——活变多了,但可并行的工序(贴砖、刷墙、走线)也跟着变多了,而且占比越来越大!原来“等漆干”占工期的20%,现在房子大了、漆要刷的面积多了,但等干的时间并没按比例涨那么多,串行占比反而被“稀释”了。更重要的是,别墅的活可以分成几十个区域让几十个工人同时干,每个工人干的量不变,人越多干的区域越多,总工期反而能稳住。

这就是Gustafson定律的视角:问题规模随处理器数量扩展。在扩展规模后的世界里,串行占比s和并行占比1-s是扩展后的比例,但那些并行工作若只交给一个核来做,需要N倍的时间。于是加速比变成:

代入数字感受一下:s=0.1,N=32时,S=0.1+32×0.9=28.9,几乎是线性提速!对比Amdahl在同样s下只能到7.8——同一个串行比例,两种问题规模设定,结论天差地别。Gustafson定律的工程启示是:在可扩展的工作负载(科学模拟、海量数据)面前,加核是真的能带飞。

S=s+N(1−s)\displaystyle S = s + N(1-s)
  1. 扩展后的串行占比在大别墅(扩展后的规模)里,串行工序占单个核总工作量的比例。
    s\displaystyle s
  2. 扩展后的并行占比能分给工人同时干的工作占比例。
    1−s\displaystyle 1-s
  3. 并行量的单核倍数这些并行工作如果只让一个核干,要花N倍的时间——因为现在有N个核在分担。
    N(1−s)\displaystyle N(1-s)
  4. 相加得加速比单核总耗时 ÷ 扩展后并行耗时,就是扩展规模下的加速比。
    S=s+N(1−s)\displaystyle S = s + N(1-s)

3. 两定律对比:假设定结论

同样是这支装修队,为什么两把尺子量出来的结论会“打架”?因为老板问的问题根本不是同一个。Amdahl问的是:“这套公寓就60平、活就这么多,我加人,最快多久干完?”Gustafson问的是:“我打算把房子加盖到300平,人越多活越多,单位时间能干多少?”一个固定工作量看极限,一个扩展工作量看增长——前提不同,答案自然不同。

把两个定律的底层假设摊开:Amdahl假设问题规模(总工作量W)固定,分析“固定负载加速比”;Gustafson假设并行执行时间固定,分析“扩展负载加速比”。无论哪个世界,N核总时间都可以拆成两段:

在现实生活中,串行比例s扮演的角色也完全不同:Amdahl里s是“天花板刻度尺”,s越小上限越高;Gustafson里s是“斜率折扣”,s越大线性加速的斜率损失越多。适用场景也因此分工明确——实时渲染、固定数据集批处理这类工作量恒定的任务,用Amdahl分析;气候模拟、基因测序、大模型训练这类规模可无限扩大的任务,用Gustafson分析。两定律不是敌人,而是同一个工地上的两把互补的尺子:一把量“能不能更快”,一把量“能不能更大”。

TN=s T1+(1−s)T1N\displaystyle T_N = s\,T_1 + (1-s)\frac{T_1}{N}
  1. 单核总时间整个工程让一个工人(一个核)从头干到尾的总耗时,是衡量加速比的基准。
    T1\displaystyle T_1
  2. 串行段耗时等漆干这类工序花掉的时间,在两个世界里都原封不动。
    s T1\displaystyle s\,T_1
  3. 并行段均摊耗时可并行的工作量被N个核平摊,每个核只花单核时的N分之一。
    (1−s)T1N\displaystyle (1-s)\frac{T_1}{N}
  4. 相加得N核总时间串行段加上被摊薄的并行段,就是N核并行的真实耗时。
    TN=s T1+(1−s)T1N\displaystyle T_N = s\,T_1 + (1-s)\frac{T_1}{N}

4. 加速比与效率:别只看提速就上头

别墅项目开工了,老板请了32个工人,工期从单人的30天压到3天——提速10倍!但老板心里咯噔一下:32个人只提速10倍?平均每个人贡献的提速只有10÷32≈0.31,也就是说每个工人的产出效率只有三成。工钱可是按人头算的,32份工钱换10倍提速,这买卖划算吗?如果加到64人只提速11倍,那新增的32人几乎在“摸鱼”——他们不是偷懒,而是工地太小、工序有前后依赖,人多了反而互相递料、让路,产生内耗。

这就是“效率”的含义。效率E定义为单位处理器贡献的加速比:

为什么N增大后效率一定下滑?因为工人之间要沟通、要递料、要等别人干完才能接手下一道工序——这些“协作开销”(通信、同步、资源竞争)随着人数增加而增长。于是存在一个边际收益递减点:从1核到2核,提速接近2倍;从32核到64核,可能只提速20%。精明的老板会算总账:如果目标是“最短工期”,那就多请人、接受低效率;如果目标是“性价比最高”,就停在效率过半的拐点。并行系统设计也是如此——超算中心的算力规划,本质就是权衡S和E。

E=SN=T1N×TN\displaystyle E = \frac{S}{N} = \frac{T_1}{N \times T_N}
  1. 加速比N核并行相对单核的提速倍数。
    S\displaystyle S
  2. 处理器数你为提速付出的资源代价。
    N\displaystyle N
  3. 效率平均每个核贡献了多少提速。理想线性加速时S=N,效率=100%。
    E=SN\displaystyle E = \frac{S}{N}
  4. 等价变形代入S=T_1/T_N,效率就是“单核时间 ÷ (核数×并行时间)”,核数越多,分母越大,效率越容易被拖垮。
    E=T1N×TN\displaystyle E = \frac{T_1}{N \times T_N}

5. 强扩展与弱扩展:装修队的两门生意

经历了别墅项目之后,装修队老板总结出两种生意模式。第一种叫“固定单”:客户给定面积,工期越短越好,这是强扩展(Strong Scaling)——问题规模不变,处理器越来越多,每个工人分到的活越来越少,效率注定下滑,Amdahl定律是它的判决书。第二种叫“包干单”:客户按人头给活,每人每天的工作量恒定,加人就加面积,整体工期不变,这是弱扩展(Weak Scaling)——问题规模随处理器数同步增长,每人工作量不变,效率可以保持稳定,Gustafson定律是它的理论靠山。

如何科学地判断一个并行系统“扩展性好不好”?看效率能否保持。定义扩展后的效率相对基准的比值:

实操中的判断标准很简单:固定规模下不断加核,当效率跌破某个阈值(比如50%)时,那个核数就是扩展临界点——继续加核纯属浪费钱。而在弱扩展场景下,只要实测效率曲线基本水平,说明系统可以“无限加盖”。大模型训练集群的搭建思路就属于后者:数据量随着GPU卡数线性切分,每个GPU的处理量不变,目标就是让效率曲线别掉下来。

η=ENE1\displaystyle \eta = \frac{E_N}{E_1}
  1. 单核效率基准1个核时效率自然为1,这是完美参照。
    E1=1\displaystyle E_1 = 1
  2. N核效率用加速比除以核数得到当前实际效率。
    EN=S(N)N\displaystyle E_N = \frac{S(N)}{N}
  3. 效率保持比η越接近1,说明加核没有稀释单核产出,弱扩展性越好。
    η=ENE1\displaystyle \eta = \frac{E_N}{E_1}

6. Kumar尺度分析:工地上的三把尺子

老练的装修队老板出门带三把尺子:量面积、量工期、量分工。同样一个工地,用不同尺子去量,得出的“该不该加人”结论就不同。1994年,Kumar等人在《并行计算导论》里也提出了三把“尺子”——三种并行算法的尺度分析视角,把Amdahl和Gustafson统一到了同一个框架下:

  • 固定存储尺度(固定规模):问题规模W不变,分析加速比如何随处理器N变化——这就是Amdahl定律的世界。
  • 扩展时间尺度(固定时间):允许问题规模随N增大,让并行总时间保持稳定——这就是Gustafson定律的世界。
  • 固定粒度尺度(固定单核负载):每个处理器承担的工作量不变,规模随N等比增长——弱扩展分析的世界。

三种尺子的统一公式,是把总工作量W拆成“理想分工”和“协作开销”两块:

这三把尺子的价值在于:它告诉我们Amdahl与Gustafson并不矛盾,只是“固定W”与“让W随N变大”两个假设的产物。工程师真正要做的,是先确定自己的场景该用哪把尺子,再判断并行粒度合不合理。

S=WWN+To(N,W)\displaystyle S = \frac{W}{\dfrac{W}{N} + T_o(N,W)}
  1. 总工作量整个工程的总墙面积、总砖块数,代表问题规模。
    W\displaystyle W
  2. 理想分工时间工作量平均分给N个核,每个核花的时间,是理论最优值。
    WN\displaystyle \frac{W}{N}
  3. 并行开销工人之间沟通递料、抢工具、等待前序工序等额外消耗,随核数N和规模W变化。
    To(N,W)\displaystyle T_o(N,W)
  4. 加速比统一式单核总时间除以实际并行总时间;固定W就是Amdahl,固定时间让W随N长就是Gustafson。
    S=WWN+To(N,W)\displaystyle S = \frac{W}{\dfrac{W}{N} + T_o(N,W)}

7. 多核与集群设计指导:装修队的排兵布阵

接了大别墅项目,老板开始排兵布阵:派多少工人?哪些工序并行?哪些必须等?这里的核心问题是——给定目标提速倍数,反推需要多少核。比如客户要求提速10倍,串行比例s=0.1,从Amdahl公式反解N:

代入S_target=10、s=0.1,得到N=0.9÷(0.1-0.1)——分母是0,说明s=0.1时天花板就是10,目标10倍需要无穷多核!这提醒设计者:先降s,再谈核数。实际工程中的三条设计准则随之而来:

  • 多核芯片规划:核数不盲目堆,根据目标应用的可并行度选择合适的核数与缓存架构,单核能效与并行收益要平衡。
  • 集群节点预算:用反推公式算出理论核数,再留出通信开销的余量,决定采购多少节点。
  • 负载均衡优化:像装修队避免“有人忙死、有人闲死”一样,调度器要把任务均匀分配到各核,减少同步等待——同步等待就是一种隐藏的串行段。
N=1−s1Starget−s\displaystyle N = \frac{1-s}{\dfrac{1}{S_{target}} - s}
  1. 目标提速对应的剩余时间提速10倍意味着新工期是单核工期的1/10。
    1Starget\displaystyle \frac{1}{S_{target}}
  2. 减去不可压缩的串行段这个剩余时间里,串行部分仍占s,剩下的才是并行部分被压缩后的空间。
    1Starget−s\displaystyle \frac{1}{S_{target}} - s
  3. 并行段总量除以可压缩空间可并行的工作量(1-s)要摊进这个极小的时间分数里,就需要这么多核。
    N=1−s1Starget−s\displaystyle N = \frac{1-s}{\dfrac{1}{S_{target}} - s}

8. 加速比测量实践:工地验收的真相

房子装完了,客户问:“到底提速了几倍?”老板拍胸脯说“10倍”——但客户要看施工日志。测量加速比没有捷径,必须老老实实做对比实验:用最优的串行方案跑一遍,记录单核时间T_1;再用N个核并行跑同一方案,记录时间T_N,两者一比:

测量时要跑两组基线:固定输入基线(问题规模不变,N从1加到64,对应Amdahl场景)和扩展输入基线(问题规模随N等比增长,对应Gustafson场景)。如果实测加速比明显低于理论预测,别急着怪定律——先排查三件事:数据没喂饱(内存带宽瓶颈)、同步太多(工人互相等)、负载不均(有人闲着有人累死)。就像装修验收时发现实际工期比预估长,队长要拿着日志一个工序一个工序地找“卡脖子”的地方,定位到瓶颈之后,收益往往比简单加核大得多。

Smeasured=T1TN\displaystyle S_{measured} = \frac{T_1}{T_N}
  1. 最优串行基线T_1必须是认真优化过的单核实现,否则拿一个低劣的串行程序当基准,测出的加速比会虚高。
    T1\displaystyle T_1
  2. N核并行实测在N个处理器上跑同一任务的真实耗时,包含计算、通信、同步所有开销。
    TN\displaystyle T_N
  3. 实测加速比两者相除,得到真实的提速倍数,再与理论公式预测值对照。
    Smeasured=T1TN\displaystyle S_{measured} = \frac{T_1}{T_N}

AI 应用场景

场景1:大模型训练的并行策略选择

阶段:分布式训练与资源调度

解决的问题:大模型训练(如GPT类)用数据并行时,每步都要做梯度同步(AllReduce),同步等待就是“等漆干”的串行瓶颈;模型并行则受层间依赖限制。传统做法是“卡不够就加卡”,结果加速比远低于预期。

具体案例:某团队用256张GPU训练百亿参数模型,实测加速比只有理论值的55%。用Amdahl定律拆解后发现,梯度同步的串行占比高达15%,按公式极限只有6.7倍。他们改用梯度压缩与异步更新把同步开销降到3%,同时引入流水线并行,加速比翻了一倍。

场景2:大数据平台节点扩容决策

阶段:数据ETL与批处理

解决的问题:数据量从10TB涨到100TB,按Amdahl“固定规模”的思路,加节点很快触及天花板;但按Gustafson“弱扩展”的思路,数据量涨、节点数也涨,单节点处理量不变,吞吐可以近线性扩展。

具体案例:某电商公司的Spark集群从20节点扩到80节点,日处理数据量增长3倍,单作业耗时基本不变——这正是Gustafson定律的实践:问题规模与资源同比例扩张,加速比保持线性。架构师用效率曲线确认弱扩展成立后,大胆按需扩容。

场景3:云上算力采购预算

阶段:资源成本优化

解决的问题:云GPU按小时计费,盲目买32卡不如先算清楚效率拐点。传统采购凭经验拍脑袋,容易“人多亏本”。

具体案例:某AI公司用效率公式E=S/N核算,串行比例s≈0.1、要求效率不低于60%,按公式一算采购8卡实例即可;若买32卡,边际收益只剩十几%。调整后单卡平均利用率提升30%,月成本下降40%。

Python 演示

python64 行
# -*- coding: utf-8 -*-import math  def amdahl_speedup(s, n):    # 固定问题规模, 串行比例 s, 处理器数 n    return 1.0 / (s + (1.0 - s) / n)  def gustafson_speedup(s, n):    # 扩展问题规模, 串行比例 s, 处理器数 n    return s + n * (1.0 - s)  def efficiency(speedup, n):    # 效率 = 加速比 / 处理器数    return speedup / n  def print_table(s):    header = "{:>6} {:>10} {:>12} {:>10} {:>12}".format(        "N", "AmdahlS", "GustafsonS", "AmdahlE", "GustafsonE")    print(header)    print("-" * len(header))    for n in [1, 2, 4, 8, 16, 32, 64]:        sa = amdahl_speedup(s, n)        sg = gustafson_speedup(s, n)        print("{:>6} {:>10.2f} {:>12.2f} {:>10.3f} {:>12.3f}".format(            n, sa, sg, efficiency(sa, n), efficiency(sg, n)))  def plot_curves(s, outfile="speedup.png"):    # 尝试用 matplotlib 画对比曲线, 无库时静默跳过    try:        import matplotlib        matplotlib.use("Agg")        import matplotlib.pyplot as plt    except ImportError:        return    ns = list(range(1, 65))    amps = [amdahl_speedup(s, n) for n in ns]    gusts = [gustafson_speedup(s, n) for n in ns]    plt.figure(figsize=(7, 4))    plt.plot(ns, amps, label="Amdahl (fixed size)", color="#F43F5E")    plt.plot(ns, gusts, label="Gustafson (scaled size)", color="#10B981")    plt.axhline(1.0 / s, color="#818CF8", linestyle="--", label="Amdahl ceiling")    plt.xlabel("Processors N")    plt.ylabel("Speedup S")    plt.legend()    plt.tight_layout()    plt.savefig(outfile, dpi=100)  def main():    s = float(input("请输入串行比例 s (0 到 1, 默认 0.1): ") or 0.1)    s = max(0.0, min(1.0, s))    print("串行比例 s = {:.2f}".format(s))    print_table(s)    plot_curves(s)    print("对比图已保存为 speedup.png (如已安装 matplotlib)")  if __name__ == "__main__":    main()
目的:输入串行比例s,程序输出Amdahl与Gustafson两种加速比随核数变化的对照表,并画出一条“躺平”、一条“起飞”的对比曲线。
  1. def amdahl_speedup(s, n): return 1.0 / (s + (1.0 - s) / n)固定规模加速比,串行时间原样保留,并行时间除以核数。
  2. def gustafson_speedup(s, n): return s + n * (1.0 - s)扩展规模加速比,被N个核分担的并行工作量若单核来做要N倍时间。
  3. def efficiency(speedup, n): return speedup / n每个核平均贡献的提速,越高越划算。
  4. sa = amdahl_speedup(s, n)计算当前核数下Amdahl的加速比,用于和Gustafson对照。
  5. sg = gustafson_speedup(s, n)计算当前核数下Gustafson的加速比,两条曲线的差距一目了然。
  6. plt.axhline(1.0 / s, color="#818CF8", linestyle="--", label="Amdahl ceiling")画出Amdahl的极限天花板,提醒你串行比例不降、加核白搭。
  7. s = float(input("请输入串行比例 s (0 到 1, 默认 0.1): ") or 0.1)交互式输入串行比例,方便对比不同“等漆干”时长的影响。
  8. s = max(0.0, min(1.0, s))把s夹在0到1之间,防止输入越界导致公式无意义。

常见误区

误区我加了100个核,程序怎么才快了2倍?肯定是服务器坏了,或者云厂商偷工减料。

正解Amdahl定律早就给出了判决:串行比例s=0.5时,哪怕100个核,加速比上限也只有2倍。就像装修请100个工人,也快不过“等漆干”的那几天。正确做法是先测量s的大小,再决定是加核还是优化串行段——很多时候优化串行代码比买新机器便宜得多。

为何常见:人的直觉是“人多好办事”,但忽略了工序之间的先后依赖和协作开销这些不可并行的部分。

误区一个说加速比有上限,一个说能线性加速,肯定有一个是错的,是不是Gustafson后来推翻了Amdahl?

正解两者根本不在一个假设下说话。Amdahl假设问题规模固定,问“更快”;Gustafson假设规模随核数扩展,问“更大”。60平小公寓加人当然有极限,300平大别墅活多了人多了自然快。现实中两者互补:固定负载任务看Amdahl,可扩展负载任务看Gustafson。

为何常见:只看结论不看前提,把两个不同问题的答案强行放在一起比较。

误区我测出来s=0.05,那这个数永远是0.05,公式算出来的天花板就是20倍。

正解s不是物理常数,它会随问题规模、算法优化和并行粒度变化。规模扩大时,许多原本串行的初始化、I/O可以被摊销,s占比下降;调整同步策略、改用更好的并行算法也能显著改变s。所以工程上要定期重新测量s,而不是测一次用一辈子。

为何常见:把模型里的参数当成固定属性,忽略了并行系统的动态性。

误区我N=8时实测加速比9,比Amdahl算出的上限还高,这定律肯定是过时的。

正解先检查测量方法:T_1用的是不是最优串行实现?如果拿一个没优化的串行程序当基准,并行版当然显得“超神”。再检查问题规模是否真没变——如果规模悄悄变大了,就滑进了Gustafson的领域,Amdahl的上限当然不适用。定律本身没错,错的是测量的前提条件不满足。

为何常见:把“基准不公平”误判成“定律错误”,忽略了Amdahl对固定规模和最优串行基线的严格假设。

误区反正云上核多,加速比上去了就行,效率低一点多买几张卡补回来。

正解效率E=S/N直接决定成本收益。N翻倍、S只涨10%时,你多付一倍的算力钱只换回10%的提速,纯亏。而且随着通信开销膨胀,继续加核可能让S不升反降。精明的做法是画一条“边际收益曲线”,停在效率过半的点上,把预算花在刀刃上。

为何常见:只盯着绝对提速,忽视了资源成本和边际递减规律。

面试题

Q1. Amdahl定律中,串行比例s=0.2,处理器数量趋于无穷大时,加速比的极限是多少?

单选题 · easy

  • A.2倍
  • B.5倍← 正确答案
  • C.10倍
  • D.20倍

答案:B。Amdahl的极限加速比是1/s。s=0.2时1/s=5倍。就像公寓装修里“等漆干”占20%工期,请再多工人也压不掉这20%的时间,提速上限就是5倍。其他选项分别是把s与倍率直接混淆(2倍)、或误算了1/(1-s)(10倍、20倍)。

Q2. 并行效率E的定义是?

单选题 · easy

  • A.E = N / S
  • B.E = S / N← 正确答案
  • C.E = S × N
  • D.E = T_1 / T_N

答案:B。效率是每个处理器平均贡献的加速比,即E=S/N。N=8、S=6时效率0.75,说明每个核只发挥了75%的功力。A是效率倒数,D是加速比本身而非效率,C完全不对。

Q3. 高效并行系统设计应重点关注哪些方面?

多选题 · easy

  • A.尽可能减小串行段占比← 正确答案
  • B.减少通信与同步等待← 正确答案
  • C.保证各节点负载均衡← 正确答案
  • D.无条件增加处理器数量

答案:ABC。Amdahl定律告诉我们串行段是天花板,所以A对;通信同步是隐藏的串行开销,B对;负载均衡避免“有人忙死有人闲死”,C对。D错误——无脑加核会撞上天花板并拉低效率,还必须先算清边际收益。

Q4. Gustafson定律的核心假设是什么?

单选题 · mid

  • A.问题规模固定,并行时间随核数减少
  • B.问题规模随处理器数扩展,并行时间基本固定← 正确答案
  • C.串行比例始终为0
  • D.处理器数量固定,问题规模可变

答案:B。Gustafson假设的是“缩放负载”——核数增加时问题规模同比例扩大,每个核承担的工作量基本不变,总时间保持稳定。A是Amdahl的假设;C是理想幻想;D说反了,Gustafson扩展的是问题规模而非处理器固定。

Q5. 串行比例s=0.1,N=10时,Amdahl定律给出的加速比约为多少?

单选题 · mid

  • A.5.26← 正确答案
  • B.6.67
  • C.8.33
  • D.10.00

答案:A。代入S=1/(s+(1-s)/N)=1/(0.1+0.9/10)=1/(0.1+0.09)=1/0.19≈5.26。B是忽略串行部分直接算9/10的错误结果,D是理想线性加速。记住公式:串行项s不可压缩,并行项除以核数。

Q6. 关于强扩展与弱扩展,下列说法正确的是?

多选题 · mid

  • A.强扩展固定问题规模,增加处理器数← 正确答案
  • B.弱扩展固定单核负载,规模随核数增长← 正确答案
  • C.强扩展场景适合用Amdahl定律分析← 正确答案
  • D.弱扩展场景适合用Amdahl定律分析

答案:ABC。强扩展=固定总量加核,效率必然下降,正是Amdahl的固定规模假设,A、C对;弱扩展=每核负载不变、总量随核数增长,对应Gustafson的缩放负载场景,B对、D反了。就像小公寓加人限速、大别墅加人加面积。

Q7. Kumar尺度分析中,“扩展时间尺度”(允许问题规模增长以保持总时间不变)对应哪个定律的世界?

单选题 · mid

  • A.Amdahl定律
  • B.Gustafson定律← 正确答案
  • C.摩尔定律
  • D.帕金森定律

答案:B。扩展时间尺度让问题规模随处理器数增长、总时间保持不变,这正是Gustafson定律的前提假设——固定并行时间、缩放负载。Amdahl对应的是“固定存储尺度”(固定规模),C和D与并行加速比分析无关。

Q8. 串行比例s=0.05,若目标加速比达到16倍,按Amdahl定律需要约多少个处理器?

单选题 · hard

  • A.64
  • B.76← 正确答案
  • C.100
  • D.256

答案:B。反推公式N=(1-s)/(1/S_target - s)=(0.95)/(1/16-0.05)=(0.95)/(0.0625-0.05)=0.95/0.0125=76。64核算出来约15.2倍差一口气,100核虽能达到但成本偏高,256核严重浪费。这就是“按需定核数”的工程计算。

Q9. 实测加速比显著低于Amdahl理论值,可能的原因有哪些?

多选题 · hard

  • A.并行部分引入了额外的通信与同步开销← 正确答案
  • B.内存带宽或I/O成为新的瓶颈← 正确答案
  • C.串行基线T_1使用了未优化的蹩脚实现← 正确答案
  • D.处理器数量还不够多

答案:ABC。Amdahl模型只算了计算时间的串并行拆分,没算通信、同步、带宽竞争这些现实开销,A、B对;T_1若没优化,测出的加速比会虚高而不是偏低,但若并行实现反而比串行基线差,C也可能导致“实测偏低”的错觉(基线过差会让结果不可信),更常见的是通信开销吞掉收益。D错误——核数多只会让瓶颈更明显,不会导致低于理论值。

Q10. s=0.05、N=20时,Gustafson加速比与Amdahl加速比的差值约为多少?

单选题 · extreme

  • A.5.5
  • B.8.8← 正确答案
  • C.12.3
  • D.15.0

答案:B。Amdahl:S_A=1/(0.05+0.95/20)=1/(0.05+0.0475)=1/0.0975≈10.26。Gustafson:S_G=0.05+20×0.95=0.05+19=19.05。差值19.05-10.26≈8.8。同样的串行比例,扩展规模比固定规模多出近一倍提速——这就是“活多了人多了反而更快”的直观体现。