假设你是一家本地快递公司“新芽速递”的运营总监。公司想证明自己不比行业巨头“闪电速运”差,但最忌讳的就是各跑各的:雨天小巷对晴天主干道,5 公斤小件对 50 公斤大件,比出来的数字根本不能说明问题。国产芯片与 NVIDIA GPU 的对比也是如此——要回答“到底差多少、差在哪”,必须先制定一场公平的配送挑战赛规则,给每辆配送车装上 GPS 秒表,把配送过程拆成“装货—行驶—交接”三段逐一计时,最后照着流水账单决定钱该投到哪里。这套“制定规则 → 装 GPS → 拆段计时 → 理清账本”的方法,就是性能 gap 分析的全貌:它把“国产芯片不行”这种模糊感觉,变成“内存段贡献了 67% 的差距,优先优化访存”这样可执行的数据结论。

岗位关联

对 AI 从业者而言,性能 gap 分析是国产芯片迁移、选型和优化的基本功:它能用数据说服决策者把预算投向最值得优化的环节,而不是凭感觉“大力出奇迹”。

目录
  1. 可视化演示
  2. 基准设计:一场公平的配送挑战赛
  3. 性能剖析方法:给配送车装上 GPS
  4. 计算瓶颈分析:引擎到底使了多大劲
  5. 内存瓶颈分析:货舱太窄,吞吐上不去
  6. 通信瓶颈分析:站点交接的损耗
  7. 差距归因框架:理清账本,排定优先级
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示国产芯片与NVIDIA GPU的Roofline性能边界、内存带宽与计算密度实测对比及Kernel级差距归因分析,交互切换查看性能gap分析核心方法。

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

Roofline模型:性能上界与瓶颈定位 Roofline由峰值算力和峰值带宽共同决定性能上界 转折点AI*区分计算受限区与带宽受限区 P = min(peak_FLOPS, BW * AI) 国产芯片在两个区域均存在性能差距

基准设计:一场公平的配送挑战赛

假设“新芽速递”想证明自己能追平“闪电速运”,最忌讳的就是各跑各的:晴天主干道对暴雨天小巷,5 公斤小件对 50 公斤大件,比出来的数字往好里说是参考,往坏里说是误导。同理,拿国产芯片和 NVIDIA GPU 比性能,第一件事不是跑代码,而是先写一份“比赛规则”——这就是基准设计(benchmark design)。

基准设计的核心思想只有一句话:除了“被测芯片”这一个变量,其余一切变量都按住不动。映射到现实工作里,规则手册有四条关键条款。第一,工作负载选择:挑的代表性模型要覆盖真实业务场景,比如图像分类、自然语言处理、大模型推理,不能只选自己擅长的负载去“刷分”。第二,指标定义:用端到端耗时、每秒吞吐量还是能效比?赛前必须定义清楚,否则两边各说各话。第三,环境控制:锁定驱动版本、算子库版本、编译器、输入数据和计算精度,两边必须完全一致。第四,重复实验:至少跑三次取中位数,观察方差,把温度降频、后台进程这类噪声过滤掉。

有了这四条,就能算出最核心的量化指标——性能差距比:

规则手册越严谨,赛后答疑越硬气。当有人质疑“你是不是偷跑了轻负载”时,你能直接甩出负载清单和环境快照。用数据堵住争论,这正是基准设计在国产替代项目中的第一份价值。

Gap=TdomesticTreference\text{Gap} = \frac{T_{\text{domestic}}}{T_{\text{reference}}}
这个比值大于 1 就说明国产芯片更慢;它把“感觉有差距”的模糊判断,变成“差距是 1.38 倍”这样板上钉钉的数字。
  1. T_reference 基准耗时NVIDIA GPU 在固定工作负载下的实测端到端耗时(秒)。它是整个比较的"1"的标尺,相当于挑战赛上闪电速运的完赛成绩。
    TreferenceT_{\text{reference}}
  2. T_domestic 国产耗时国产芯片跑完全相同负载的实测耗时(秒)。注意“完全相同”四个字——输入、精度、批大小都要复用同一套。
    TdomesticT_{\text{domestic}}
  3. 比值 Gap两者相除。等于 1 说明打平;大于 1 说明有差距,1.38 就意味着国产芯片慢 38%,这就是优化工作要啃的“硬骨头”。
    Gap=TdomesticTreference\text{Gap} = \frac{T_{\text{domestic}}}{T_{\text{reference}}}

性能剖析方法:给配送车装上 GPS

比赛成绩单上只写了一行字:“新芽速递慢 38%。”作为运营总监,你肯定要追问:慢在哪一段?是仓库装货慢、路上堵车,还是站点交接拖延?于是你给每辆配送车装上 GPS 和传感器——这就是性能剖析(profiling)的日常工作。

剖析的目标是把“总耗时”这团迷雾拆成可定位的片段。它靠三类手段协同工作。硬件计数器:芯片内部自带计数器,能记录指令数、缓存未命中、访存事务等底层事件,这是最精确的“传感器”,不打扰程序本身。时间分解:把总耗时拆成计算、访存等待、通信三段,三段相加约等于总时间,残差归为调度开销。热点识别:定位耗时占比最高的算子或函数——比如发现某个卷积算子独占 30% 时间,优化靶子就明确了。工具链方面,NVIDIA 常用 Nsight Systems 和 Nsight Compute,国产平台也有对应的 profiler(如昇腾的 msprof),工具决定了你能把问题看到多细。

时间分解的骨架公式如下:

GPS 账单拿到手,哪个环节拖后腿就一目了然了。接下来要做的是深入每一段,找出“为什么慢”的底层原因。

Ttotal=Tcompute+Tmemory+Tcomm+TotherT_{\text{total}} = T_{\text{compute}} + T_{\text{memory}} + T_{\text{comm}} + T_{\text{other}}
总耗时不是铁板一块,而是四段可测的时间之和。每一段都能单独计时、单独归因,这就是“拆段计时”的数学表达。
  1. T_total 端到端耗时一次完整运行从开始到结束的墙钟时间,是用户能直接感知的指标,也是 gap 分析的总账本。
    TtotalT_{\text{total}}
  2. T_compute 计算时间计算单元真正执行算术指令的时间,包括流水线停顿。它回答“引擎有没有在空转”。
    TcomputeT_{\text{compute}}
  3. T_memory 访存时间等待数据搬运的时间。GPU 算得飞快,但数据喂不上来就只好干等,这是国产芯片常见的隐形杀手。
    TmemoryT_{\text{memory}}
  4. T_comm 通信时间多卡或多节点之间传输数据、等待同步的时间。分布式训练里它常常是最大的一项。
    TcommT_{\text{comm}}
  5. T_other 杂项开销内核启动、内存分配、任务调度等无法归入前三类的开销。如果这一项异常大,说明软件栈本身有待打磨。
    TotherT_{\text{other}}

计算瓶颈分析:引擎到底使了多大劲

快递员的“手速”不能只看他搬了多少件,更要看他搬这些件时手上有没有空转。GPU 的峰值 FLOPS 是纸面手速,实际用到的才算数。国产芯片往往纸面算力不低,但真实跑起来利用率却上不去,这就是计算瓶颈分析的切入点。

计算瓶颈分析关注三个层面。第一是 FLOPS 利用率:用实际有效计算量除以(耗时 × 峰值算力),得到芯片被“喂饱”的程度。利用率只有 0.5,说明一半算力在空转。第二是算子效率:同一个卷积算子,用 cuDNN、手写汇编、国产算子库实现,性能可能相差数倍。算子层是国产替代优化最肥沃的土壤。第三是量化影响:切到 FP16 或 INT8 能让峰值算力翻倍,但也带来精度损失;量化方案选不好,精度和速度两头落空。

计算利用率的公式是:

引擎轰鸣不等于车子在前进,关键看轮子实际转了几圈。如果利用率低,别急着换更强芯片,先看看负载是不是真的“喂得饱”它。

Ucompute=FLOPseffectiveT×FLOPSpeakU_{\text{compute}} = \frac{\text{FLOPs}_{\text{effective}}}{T \times \text{FLOPS}_{\text{peak}}}
利用率衡量的是“引擎实际使出的劲”占“最大劲”的比例。0.7 意味着有三成算力被浪费了,这部分就是优化空间。
  1. FLOPs_effective 有效计算量完成该负载理论上必需的浮点运算次数,通过模型结构统计得到,单位 FLOPs。它代表“必须干的活”。
    FLOPseffective\text{FLOPs}_{\text{effective}}
  2. T 实测耗时profiling 测得的计算段时间(秒)。把它乘以峰值算力,就是“这段时间里机器最多能干的活”。
    TT
  3. FLOPS_peak 峰值算力芯片标称的最大浮点运算能力(TFLOPS)。注意不同精度下峰值不同,比较时不能张冠李戴。
    FLOPSpeak\text{FLOPS}_{\text{peak}}
  4. U_compute 利用率分子分母相除,取值在 0 到 1 之间。0.5 意味着算力有一半在空转,这是可以挖掘的优化空间。
    Ucompute=FLOPseffectiveT×FLOPSpeakU_{\text{compute}} = \frac{\text{FLOPs}_{\text{effective}}}{T \times \text{FLOPS}_{\text{peak}}}

内存瓶颈分析:货舱太窄,吞吐上不去

引擎再猛,如果货舱门口只容一个人搬货,整车的吞吐量也上不去。内存带宽就是那扇窄门:计算强度低、数据搬运量大的负载,会被这道门死死卡住。国产芯片与 NVIDIA 的差距,常常不在算力,而在内存系统。

内存瓶颈分析有三个抓手。带宽利用率:用实际访存字节数除以(耗时 × 峰值带宽),接近 100% 说明已被带宽锁死,此时堆算力毫无意义。访存模式:连续访存效率高,随机跳变或跨步访存会浪费大量带宽;通过调整数据布局(如 NHWC 与 NCHW 的选择、合并访存)能显著改善。缓存命中率:L2 缓存命中率高,就能大幅减少对显存的压力;反之数据反复搬运,带宽再宽也白搭。

判断负载到底被哪条“天花板”压住,业界用 Roofline 模型:

货舱窄就是窄,别一个劲怪引擎不够力。做 gap 分析时,先用 Roofline 判断负载类型,再决定优化方向,能少走很多弯路。

Pmax⁡=min⁡(πcompute, πmemory×I),I=FLOPsBytesP_{\max} = \min\left(\pi_{\text{compute}},\ \pi_{\text{memory}} \times I\right),\quad I = \frac{\text{FLOPs}}{\text{Bytes}}
Roofline 像一张“屋顶图”:水平屋顶是算力上限,斜坡是带宽上限。负载的计算强度越低,就越容易被斜坡压住,这就是“内存瓶颈”。
  1. I 计算强度每搬运一个字节的数据,能做多少次运算,单位 FLOPs/Byte。I 越大说明负载越“算术密集”。
    I=FLOPsBytesI = \frac{\text{FLOPs}}{\text{Bytes}}
  2. π_compute 算力上限芯片的峰值 FLOPS。它决定屋顶图中水平段的高度,是算力密集型负载的天花板。
    πcompute\pi_{\text{compute}}
  3. π_memory × I 带宽上限峰值内存带宽乘以计算强度。搬运同样的数据量,带宽越高、每秒能做的运算越多,它构成图中的斜坡段。
    πmemory×I\pi_{\text{memory}} \times I
  4. P_max 取两者较小值实际性能永远到不了两条线的上方。落在斜坡上的负载是“内存瓶颈”,优化访存才有用;贴近水平线的才是“算力瓶颈”。
    Pmax⁡=min⁡(πcompute, πmemory×I)P_{\max} = \min(\pi_{\text{compute}},\ \pi_{\text{memory}} \times I)

通信瓶颈分析:站点交接的损耗

包裹要经过多个站点转运,站点之间交接慢、协调乱,再快的快递员也只能干等。多卡、多机训练里的通信,就是站点之间的接力环节。国产芯片在单卡算力上追得很快,但一上多卡集群,通信瓶颈立刻现形。

通信瓶颈分析围绕三点展开。第一是集合通信:AllReduce、AllGather 这些操作在每次梯度同步时都要调用,集合通信库(NVIDIA 的 NCCL vs 国产的 HCCL)的实现质量直接决定带宽能不能跑满。第二是拓扑与同步:NVLink 直连、PCIe 交换、跨机网络各有各的带宽;国产平台拓扑差异大,且梯度同步是全局屏障,任何一张卡慢,全体就得等。第三是通信占比:通信时间占端到端时间的比例一旦超过 30%,就要考虑梯度压缩、流水线并行、减少同步频率等手段。

通信占比的公式简单但有力:

站点交接理顺了,整体节奏才能提上去。多卡训练的性能 gap,很多时候不是“每张卡不够快”,而是“卡与卡之间太慢”。

Rcomm=TcommTtotalR_{\text{comm}} = \frac{T_{\text{comm}}}{T_{\text{total}}}
通信占比直接告诉你“等数据”的时间占了多大比重。0.4 意味着四成时间在干等,这是分布式训练优化最响亮的警报。
  1. T_comm 通信耗时profiling 测得的通信段时间总和,包括数据搬运和屏障等待。它衡量的是“站点交接”的总损耗。
    TcommT_{\text{comm}}
  2. T_total 总耗时端到端执行时间。用它做分母,才能得到通信在所有环节中的相对重量。
    TtotalT_{\text{total}}
  3. R_comm 通信占比比值越接近 1,训练越“通信密集”。占比高于 0.3 就亮黄灯,高于 0.5 则必须动刀优化通信策略。
    Rcomm=TcommTtotalR_{\text{comm}} = \frac{T_{\text{comm}}}{T_{\text{total}}}

差距归因框架:理清账本,排定优先级

现在手里有一本完整的流水账:三段耗时、两边对比、差距占比全齐了。老板问“钱先投哪一块?”差距归因框架就是回答这个问题决策工具——不是看哪里差距最大就投哪里,而是看投入产出比最高。

归因框架分四步走。分层归因:从“总差距 → 段差距(计算/内存/通信)→ 算子级差距 → 底层原因”逐层下钻,每一层的贡献占比都要量化,不允许含混的“感觉”。优先级排序:按“差距贡献占比”和“优化成本”两个维度打分,贡献大且成本低的先做。预期收益评估:用 Amdahl 定律估算某个环节优化后整体能快多少,避免“优化了看似最慢的环节,整体却纹丝不动”。持续监控:驱动、算子库、编译器都在快速迭代,gap 分析必须变成基准回归机制,跟随版本持续更新。

预期收益用 Amdahl 定律计算:

账本会说话。谁贡献了最大的差距、谁最容易优化、优化后能换来多少整体收益——这三个问题的答案排在一起,投入优先级自然浮出水面。

S=1(1−f)+fsS = \frac{1}{(1 - f) + \dfrac{f}{s}}
整体加速比不是局部加速比,而是被“不可优化部分”拖累后的结果。f 越大、s 越大,整体收益才越明显,这就是排优先级的数学依据。
  1. f 可优化占比待优化环节(比如内存段)耗时占总耗时的时间比例,是 0 到 1 之间的小数。
    ff
  2. s 局部加速比该环节被优化后能快多少倍。s=3 表示局部快 3 倍,但整体绝不会快 3 倍。
    ss
  3. (1-f) 不动部分总耗时中不可优化的那部分,优化后依然原样保留,它是整体提速的“锚”。
    (1−f)(1 - f)
  4. (1-f)+f/s 新总耗时不动部分加上局部加速后的可优化部分,就是优化后的新总耗时(相对值)。
    (1−f)+fs(1 - f) + \frac{f}{s}
  5. S 整体加速比优化前总耗时看为 1,用 1 除以新总耗时得到整体加速比。它永远小于局部加速比 s,这就是“木桶效应”的数学形态。
    S=1(1−f)+fsS = \frac{1}{(1 - f) + \frac{f}{s}}

AI 应用场景

大模型推理服务迁移评估

阶段:模型部署与推理

解决的问题:某公司想把线上大模型推理服务从 NVIDIA 迁移到国产芯片,但担心时延不达标。传统做法是“全量部署后再看线上监控”,风险高、回滚成本巨大。通过 gap 分析,先在离线环境用真实 prompt 集跑基准,用 profiling 拆出计算/内存/通信三段耗时,提前定位瓶颈并评估迁移可行性。

具体案例:某 AI 公司计划将 7B 参数 LLM 推理从 A10 迁移到昇腾 910B。团队用 1000 条真实 prompt 作为固定工作负载,锁定 FP16 精度与相同 batch size,测出端到端时延比为 1.42。profiling 显示内存段耗时占比高达 55%,归因后定位到 GEMV 算子的访存模式不连续。优化该算子访存布局后,时延比降到 1.21,达到可接受的迁移标准。

训练集群采购决策

阶段:算力基础设施规划

解决的问题:智算中心采购时要决定“买谁的卡”,不能只看峰值 FLOPS 这种纸面手速。通过负载适配度基准测试加三段时间分解,评估典型训练负载在国产平台上的计算利用率、通信占比与扩展效率,用数据支撑动辄千万级的采购决策。

具体案例:某智算中心用 Megatron 训练 13B 模型,分别评估 8 卡 A100 与 8 卡国产芯片。结果显示计算段利用率接近(均为 65% 左右),但国产平台通信占比高达 45%、A100 只有 22%。归因指向集合通信库对拓扑感知不足,团队据此决定暂不增加节点数,而是优先联合厂商优化 HCCL 通信库。

国产算子库优化排期

阶段:AI 框架与算子开发

解决的问题:算子库团队人力有限,不可能同时优化几百个算子。用 gap 分析的归因框架,对目标模型逐算子 profiling,按“耗时占比 × 差距倍数”打分排序,把有限人力投到收益最大的算子上。

具体案例:某算子库团队为 YOLOv8 做国产化适配,profiling 发现 Conv 算子耗时占 47%、NMS 占 12%。进一步归因显示 Conv 的差距主要来自 im2col 访存模式,通过算子融合把内存段缩短 40%,模型整体性能提升 1.35 倍。NMS 的优化被排到下一迭代,因为它的贡献占比和解法成本都不占优。

Python 演示

python61 行
# -*- coding: utf-8 -*-"""性能gap分析演示:时间分解与差距归因模拟同一工作负载在 NVIDIA GPU 与国产芯片上的三段耗时,量化总差距并归因到计算、内存、通信三个环节。"""import random random.seed(42) WORKLOADS = {    "ResNet50": (7.7, 30.0, 5.0),    "BERT-base": (0.35, 25.0, 120.0),    "LLM推理": (0.2, 500.0, 30.0),} NVIDIA = {"name": "NVIDIA A100", "compute": 312.0, "memory": 1555.0, "comm": 600.0}DOMESTIC = {"name": "国产芯片", "compute": 280.0, "memory": 800.0, "comm": 300.0}  def simulate(chip, workload):    """模拟一次基准测试:返回计算/内存/通信三段耗时(秒)"""    flops, mem_gb, comm_gb = WORKLOADS[workload]    util_c = random.uniform(0.6, 0.8)    t_compute = flops * 1e3 / (chip["compute"] * util_c)    util_m = random.uniform(0.5, 0.9)    t_memory = mem_gb / (chip["memory"] * util_m)    util_k = random.uniform(0.4, 0.8)    t_comm = comm_gb / (chip["comm"] * util_k)    return t_compute, t_memory, t_comm  def analyze_gap(workload, repeat=3):    """重复实验取累计耗时,计算各环节差距贡献占比"""    total_n = [0.0, 0.0, 0.0]    total_d = [0.0, 0.0, 0.0]    for _ in range(repeat):        seg_n = simulate(NVIDIA, workload)        seg_d = simulate(DOMESTIC, workload)        for i in range(3):            total_n[i] += seg_n[i]            total_d[i] += seg_d[i]     gap_total = sum(total_d) - sum(total_n)    names = ["计算段", "内存段", "通信段"]    print("=" * 58)    print(f"工作负载: {workload}   (重复实验 {repeat} 次取累计)")    print("=" * 58)    for i in range(3):        seg_gap = total_d[i] - total_n[i]        share = seg_gap / gap_total * 100        print(f"{names[i]} | N卡:{total_n[i]:7.2f}s | "              f"国产:{total_d[i]:7.2f}s | 差距:{seg_gap:+7.2f}s | 贡献:{share:5.1f}%")    ratio = sum(total_d) / sum(total_n)    print(f"总耗时: N卡 {sum(total_n):.2f}s, 国产 {sum(total_d):.2f}s, "          f"总差距 {gap_total:.2f}s, 耗时比 {ratio:.2f}x")    return ratio  if __name__ == "__main__":    for wl in WORKLOADS:        analyze_gap(wl)
目的:模拟三种典型负载在 NVIDIA 与国产芯片上的三段耗时,演示“重复实验 → 时间分解 → 差距归因”的完整流程,输出每个环节对总差距的贡献占比。
  1. WORKLOADS = {...}定义三种代表性负载的计算量、访存量、通信量,对应基准设计中的“工作负载选择”。
  2. random.seed(42)固定随机种子,保证每次运行结果可复现,这本身就是“重复实验”的前提。
  3. def simulate(chip, workload):模拟一次基准测试,返回计算/内存/通信三段耗时。
  4. t_compute = flops * 1e3 / (chip["compute"] * util_c)计算段耗时 = 计算量 ÷ 有效算力,util_c 模拟算子效率造成的损耗。
  5. t_memory = mem_gb / (chip["memory"] * util_m)内存段耗时 = 访存数据量 ÷ 有效带宽,注意国产芯片带宽和利用率都更低。
  6. for _ in range(repeat):重复实验多次并累加,压低单次运行的噪声。
  7. seg_gap = total_d[i] - total_n[i]计算每个环节的绝对时间差,这是归因的第一步。
  8. share = seg_gap / gap_total * 100该环节时间差除以总差距,得到“贡献占比”,是排序优先级的核心数字。
  9. ratio = sum(total_d) / sum(total_n)总体耗时比,即为开篇所说的 Gap 量化指标。

常见误区

误区“我拿国产芯片跑了一下 ResNet50,比 A100 慢了 40%,结论很明确:国产芯片就是不行。”

正解单次运行充满噪声:驱动编译缓存未命中、温度导致的降频、后台进程抢占、输入批次差异,都会造成大幅波动。规范的基准要求重复实验至少 3 次取中位数、锁定驱动/算子库/编译器版本、验证结果正确性。这就好比测快递员手速,只掐一次表,可能恰好赶上他喝水休息。

为何常见:人脑偏爱“眼见为实”的简单结论,一次跑完的数字最直观,而统计思维需要刻意训练才能建立。

误区“国产芯片总耗时长 40%,那一定是算力不行,得换更强的芯片或者加卡。”

正解总耗时是计算、内存、通信三段叠加的结果。profiling 常常揭示真相:拉开差距的其实是访存模式导致的带宽利用率低,或者集合通信库的效率差,芯片峰值算力反而没差多少。不剖析就归因,等于不看病历就开药,药方大概率开错。

为何常见:峰值指标(FLOPS)宣传最响、最容易获取,人们习惯用最显眼的数字解释一切现象。

误区“这台国产芯片的峰值 FLOPS 比 A100 还高,纸面性能更强,直接采购就行。”

正解峰值只是“纸面手速”,真实性能受 Roofline 模型约束:计算强度低的负载被内存带宽锁死,算力再高也发挥不出来。必须实测利用率和带宽占用,再谈性能对比。纸面参数就像快递员的体检报告,和实际搬件速度是两码事。

为何常见:厂商宣传页和招标书都强调峰值,信息不对称使峰值成为最容易拿到的对比维度,也最容易误导决策。

误区“内存段差距最大,那就全力优化内存段,整体性能肯定能大幅提升。”

正解Amdahl 定律告诉我们,整体提升取决于可优化占比 f 和局部加速比 s 的配合。如果某环节占比高但技术上只能优化 1.2 倍,可能远不如优化一个占比 20% 却能加速 5 倍的环节。排优先级必须用“贡献占比 × 预期加速 ÷ 实现成本”来计算,而不是只看单一维度。

为何常见:直觉的“木桶原理”让人只盯最短板,但工程上还要掂量“补这块板子的代价”和“补完后水位能涨多少”。

误区“我们已经做完一轮 gap 分析,报告也提交了,这件事可以关闭了。”

正解驱动版本、算子库、编译器、模型结构都在持续迭代。上季度的大瓶颈,这季度可能已被厂商修复,同时暴露出新的瓶颈。正确做法是把基准测试回归机制嵌入 CI 流程,每次发版自动跑一轮 gap 分析,用趋势图追踪差距是收窄还是反弹。

为何常见:项目制思维让团队把分析当成“一次性交付物”,忽略了性能优化本质上是长期工程,需要持续投入与观测。

面试题

Q1. 性能 gap 分析的第一步应该是什么?

单选题 · easy

  • A.直接调优算子实现
  • B.设计公平的基准测试← 正确答案
  • C.更换更高效的芯片
  • D.增加训练卡的数量

答案:B。没有公平的基准,后续所有对比和归因就都失去意义。就像两家快递比速度,必须先定同样的包裹和路线,否则结论站不住脚。基准设计是 gap 分析的地基,其他选项都是地基打好之后才谈得上动作。

Q2. 下列哪项属于基准设计中的“环境控制”?

单选题 · mid

  • A.选用最新的公开模型
  • B.随意调整批量大小
  • C.锁定驱动和算子库版本← 正确答案
  • D.变更请求的并发数量

答案:C。环境控制要求除被测芯片外的一切条件一致,锁定驱动、算子库、编译器版本正是其核心动作。更换模型、批大小和并发数属于负载本身的改动,会引入额外变量,破坏“控制变量”原则。

Q3. 性能剖析(profiling)可以获取以下哪些信息?

多选题 · mid

  • A.各算子的耗时占比← 正确答案
  • B.缓存命中率统计数据← 正确答案
  • C.软件营收的增长曲线
  • D.计算与访存的占比关系← 正确答案

答案:ABD。profiling 依赖硬件计数器和时间分解,能拿到算子耗时、缓存命中率、计算/访存占比等运行期数据。营收曲线属于业务指标,与芯片内部的运行状态无关,是典型干扰项。

Q4. 某工作负载在 NVIDIA 上耗时 10s,国产芯片耗时 25s,其中内存段贡献了 8s 的耗时差,则内存段对总差距的贡献占比约为?

单选题 · mid

  • A.约 32%
  • B.约 53%← 正确答案
  • C.约 80%
  • D.约 20%

答案:B。总差距 = 25 − 10 = 15s,内存段贡献 8s,8 ÷ 15 ≈ 53%。贡献占比衡量的是“这个环节解释了多少总差距”,而不是它在各自耗时中的占比,这是归因分析最容易算错的地方。

Q5. 下列哪些情况会导致国产平台出现通信瓶颈?

多选题 · hard

  • A.集合通信库尚未优化← 正确答案
  • B.多卡互连的网络拓扑差异← 正确答案
  • C.梯度同步的全局屏障开销← 正确答案
  • D.峰值算力相比 NVIDIA 偏低

答案:ABC。通信瓶颈来自集合通信实现质量、拓扑带宽差异和同步屏障机制。峰值算力偏低影响的是计算段耗时,与通信段没有直接关系,属于跨维度干扰项。

Q6. 根据 Amdahl 定律,某环节占比 f=0.6,优化后局部加速 s=3,整体加速比约为?

单选题 · mid

  • A.1.67← 正确答案
  • B.2.00
  • C.3.00
  • D.1.25

答案:A。S = 1 / [(1 − 0.6) + 0.6/3] = 1 / (0.4 + 0.2) = 1.67。即使局部加速 3 倍,整体也只能提升 1.67 倍,因为不可优化的 40% 永远存在,这就是“木桶效应”的数学表达。

Q7. Roofline 模型中,计算强度 I 的正确含义是?

单选题 · mid

  • A.每字节数据被计算的次数← 正确答案
  • B.芯片的峰值功耗水平
  • C.神经网络层数的多少
  • D.每次训练迭代的耗时

答案:A。计算强度 I = FLOPs/Bytes,即搬运一个字节数据能做多少次运算。I 低说明负载访存密集,性能上限被内存带宽约束,此时堆算力没有意义——这解释了为什么 bandwidth 是国产芯片最常出现的瓶颈。

Q8. 差距归因框架中,确定优化优先级应综合考虑哪些因素?

多选题 · hard

  • A.该环节对总差距的贡献占比← 正确答案
  • B.优化实现的技术成本← 正确答案
  • C.优化后的预期加速收益← 正确答案
  • D.芯片厂商的品牌知名度

答案:ABC。优先级排序的核心公式是“贡献占比 × 预期收益 ÷ 实现成本”。品牌知名度不影响工程优化决策,是典型的无关干扰项,考察对归因框架本质的理解。

Q9. 时间分解公式 T_total = T_compute + T_memory + T_comm + T_other 中,T_other 主要包含什么?

单选题 · easy

  • A.算子执行指令的时间
  • B.等待数据搬运的时间
  • C.内核启动与调度开销← 正确答案
  • D.多机通信的传输时间

答案:C。内核启动、内存分配、任务调度等无法归入前三大类的开销都算在 T_other 里。算子执行属于计算段,数据搬运等待属于内存段,机器间传输属于通信段,三者的边界要拎清楚。

Q10. 关于国产芯片性能 gap 分析的常态化机制,最佳做法是?

单选题 · hard

  • A.厂商发版后定期回归基准← 正确答案
  • B.等到线上事故才做分析
  • C.只分析性能最好的模型
  • D.把基准测试当作一次性项目

答案:A。驱动、算子库、编译器持续迭代,gap 是动态变化的。把基准测试嵌入发版流程并定期回归,才能用趋势数据指导国产替代的持续优化。事故驱动或一次性分析都会错过生态演进带来的变化,也无法提前预警性能回退。