想象你经营着一座大型智能物流配送中心。仓库深处,货架层叠,堆满各式包裹——这是显存;中央操作区,几千名分拣员一字排开,手脚麻利,争分夺秒——这是计算核心。可是,每天最让你头疼的不是分拣员不够快,而是连接仓库与分拣台的那几条传送带:它们太窄、太慢,包裹从仓库里源源不断弹出来,却堵在路上,几千名分拣员只能干瞪眼。 GPU 世界里发生着完全相同的剧情。AI 训练的每一次矩阵乘法、每一次卷积,本质都是“把数据从显存搬进计算单元”。搬运的速度,就是内存带宽(Memory Bandwidth)。如果带宽不足,再高的算力(TFLOPS)都是纸上谈兵。为了喂饱计算核心,业界发明了 HBM(高带宽内存)——一种用垂直堆叠加超宽接口打造的“立体传送带”;工程师也用 Roofline 模型来判断:你的程序到底是“算不过来”,还是“喂不饱”。 这篇文章就用这座配送中心,带你彻底搞懂 GPU 内存带宽:它是什么、如何计算、瓶颈出在哪里、HBM 如何破局、怎么用 Roofline 一眼定位性能瓶颈,以及有哪些立竿见影的优化思路。

岗位关联

对 AI 从业者而言,掌握内存带宽与 Roofline 分析,是在训练大模型、部署推理时快速判断硬件瓶颈、避免算力空转的核心竞争力。

目录
  1. 可视化演示
  2. 带宽基础概念
  3. 计算方式解析
  4. 瓶颈现象分析
  5. HBM高带宽内存
  6. Roofline模型定位
  7. 优化实践策略
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示GPU内存带宽计算公式、HBM堆叠架构对比GDDR带宽差异,以及Roofline模型定位算子是带宽受限还是算力受限。

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

内存带宽计算公式 带宽=数据宽度×时钟频率×每次传输字节数 HBM3超宽数据总线实现TB/s级带宽 BW = W × F × B (×2 DDR) 三因子相乘决定GPU数据供给速率

带宽基础概念

想象这座配送中心的日常:两千名分拣员站成方阵,等待包裹。只要传送带不断送来货物,他们就能创造出惊人的分拣效率;可一旦传送带空转,他们的双手就无处安放。GPU 世界的核心问题正是“数据搬运速率”——官方说法叫内存带宽(Memory Bandwidth):显存每秒能向计算核心输送多少字节的数据,单位通常是 GB/s(千兆字节每秒)或 TB/s(万亿字节每秒)。

要理解带宽,就要看清两个最基本的决定因子:一是传送带能并排铺多宽——这叫总线位宽(Bus Width);二是传送带每秒送多少个包裹——这叫工作频率(Memory Clock)。位宽和频率联手,决定了单位时间能流过多少数据。如果位宽只有 128 位,哪怕频率再高,传送带也依然细得像条麻绳,勉强够传送外卖盒。

打个比方:仓库货架塞得满满当当(显存容量大),不代表分拣台就能快速拿到货。容量解决“装得下”,带宽解决“送得快”。在动辄几十上百 GB 模型权重的大模型训练场景,AI 从业者最该关心的往往不是“显存还够不够”,而是“每次前向反向循环要把权重从显存搬几遍,传送带会不会堵车”。

回到配送中心:想让分拣员手上有活干,要么加宽传送带(增加位宽),要么加快传送带转速(提高频率),要么让每条带子一趟搬两箱(倍率技术)。这三个要素,共同构成了“内存带宽”这个决定 GPU 命运的数字。

B=W位宽8×f×rB = \frac{W_{位宽}}{8} \times f \times r
内存带宽的通用计算式,由三部分相乘:位宽转字节、工作频率、双倍/多倍传输倍率。
  1. 位宽除以 8内存总线的位宽以 bit 为单位,而带宽用 Byte(字节)表示,一个字节等于 8 个比特,所以要先 ÷8。256 位总线的“传送带宽度”折算下来是 32 字节。
    W位宽8⇒每个时钟周期能搬动多少字节\frac{W_{位宽}}{8} \Rightarrow \text{每个时钟周期能搬动多少字节}
  2. 乘以工作频率每秒有 f 个时钟周期,每个周期都能搬动上一步算出的字节数。频率越高,传送带转得越快。
    ×f⇒每秒能搬动的字节数\times f \Rightarrow \text{每秒能搬动的字节数}
  3. 乘以传输倍率DDR 技术在一个时钟的上升沿和下降沿各传一次数据,r=2;某些技术一次信号周期传 4 组,r=4。倍率越大,同一周期搬运的次数越多。
    ×r⇒实际数据搬运次数加倍\times r \Rightarrow \text{实际数据搬运次数加倍}

计算方式解析

上一节我们把带宽拆成三个因子,这一节把“算账”方法彻底讲透:如何从 GPU 规格书推算出理论带宽。想象开车上高速,一条车道每分钟过 60 辆车(频率),铺 8 条车道(位宽),再允许每辆车挂 2 个集装箱(倍率),那么每分钟通过的车流量就是 60×8×2=960 箱。GPU 的带宽正是完全相同的“车道逻辑”。

以英伟达 A100 为例:它的 HBM2e 总总线宽度为 5,120 bit,数据率为 2.4 GT/s,倍率按 1 计(HBM 依靠等效高速传输),代入公式:

再看 RTX 4090:GDDR6X 位宽只有 384 位,频率等效约 21 Gbps,带宽为 384/8×21e9 ≈ 1 TB/s。位宽小但频率极高,也能摸到 TB/s 门槛。那么,HBM 为何能轻松做到 3 TB/s 甚至更高,而 GDDR 拼了命也只是 1 TB/s 多一点?关键在“位宽”这个因子:HBM 使用封装级集成,每个堆栈拥有 1024 位宽,四个堆栈即 4,096 位,远超 GDDR 的 384 位。位宽上的数量级领先,让 HBM 的带宽天花板天然高出一截。

配送中心当然不会满足于一条传送带。HBM 的哲学是:与其单条带子疯狂加速撞上物理极限,不如像立体停车场一样,把仓库一层层叠起来,每一层都伸出一条属于自己的宽传送带,这就是“宽接口 + 高堆叠”的胜利。

B=5,1208×2.4×109=1.536×1012 B/s≈1.5 TB/sB = \frac{5{,}120}{8} \times 2.4 \times 10^9 = 1.536 \times 10^{12}\,\text{B/s} \approx 1.5\,\text{TB/s}
Bstack=10248×fstack×1B_{stack} = \frac{1024}{8} \times f_{stack} \times 1
每增加一个 HBM 堆栈,相当于额外铺设一条 1024 位宽的超级传送带,总带宽随堆栈数线性叠加。
  1. 单个堆栈带宽HBM 每个堆栈接口固定 1024 位,÷8 得 128 字节,乘以该堆栈的数据率,就是单堆栈带宽。
    10248×fstack=128×fstack\frac{1024}{8} \times f_{stack} = 128 \times f_{stack}
  2. 堆叠数相乘GPU 实际挂载 N 个堆栈(如 A100 有 5 个),总接口位宽是 128N 字节/周期。
    Btotal=N×BstackB_{total} = N \times B_{stack}
  3. 结果估算按 2.4 GT/s 估算单个堆栈约 307 GB/s,5 个堆栈约 1.5 TB/s,与实际标称 1.6-2 TB/s 同量级。
    5×307 GB/s≈1.5 TB/s5 \times 307\,\text{GB/s} \approx 1.5\,\text{TB/s}

瓶颈现象分析

当传送带送不来货,分拣员只能摸鱼;当传送带拼命送货,分拣员反而成了瓶颈。你怎么判断现场到底是谁拖了后腿?办法是分别算两队各自的时间:分拣员处理完这批包裹要多久,传送带运完这批包裹要多久,实际总耗时由更慢的那一方决定。GPU 性能分析正是同样的逻辑。

对一个具体算子(Kernel),分别估算它的计算时间和访存时间:

F 是浮点运算量(FLOPs),P_peak 是 GPU 峰值算力(FLOPS);M 是需要访问的显存数据量(字节),B_peak 是带宽。第一项是“纯计算需要的时间”,第二项是“纯搬数据需要的时间”。因为计算核心和传送带在物理上并行工作,但流水线整体节拍由慢者锁定——若计算时间远大于访存时间,称该算子是“计算受限”(Compute-bound);反之则是“访存受限”或“带宽受限”(Memory-bound)。深度学习里大量算子落在“访存受限”一侧:批量归一化、激活函数、残差连接,每个数据只做几次简单运算,算术强度很低,算力根本跑不满。

现场管理者终于明白:该背锅的往往不是分拣员,而是传送带。在 GPU 上,判断一次训练或推理为什么慢,先比一比“算得过来吗”和“送得过来吗”,比盲目堆算力更管用。

T=max⁡(FPpeak,  MBpeak)T = \max\left(\frac{F}{P_{peak}},\; \frac{M}{B_{peak}}\right)
U=F/PpeakT×100%U = \frac{F / P_{peak}}{T} \times 100\%
算力利用率 U 反映 GPU 核心真正忙碌的时间占比。如果 U 很低而带宽已满载,说明算子被“传送带”卡死。
  1. 计算时间浮点运算总量除以峰值算力,表示假设算力跑满时所需时间。
    FPpeak⇒纯运算耗时的理论上限\frac{F}{P_{peak}} \Rightarrow \text{纯运算耗时的理论上限}
  2. 访存时间总数据搬运量除以带宽,表示假设带宽跑满时所需时间。
    MBpeak⇒纯搬运耗时的理论上限\frac{M}{B_{peak}} \Rightarrow \text{纯搬运耗时的理论上限}
  3. 取最大值慢的一方锁定了整体节拍,这就是木桶短板。
    max⁡(⋯ )⇒瓶颈由更慢的资源决定\max(\cdots) \Rightarrow \text{瓶颈由更慢的资源决定}
  4. 算力利用率计算时间占总耗时的比例,U 低说明核心在等数据。
    F/PpeakT⇒核心真正干活的时间比例\frac{F/P_{peak}}{T} \Rightarrow \text{核心真正干活的时间比例}

HBM高带宽内存

GDDR 显存像一座水平铺开的单层大仓库,传送带很长,但每个时刻只能从仓库门口探出一排取货口。HBM 则彻底改变了设计:它把内存颗粒像烤饼干一样一层层叠起来,用“硅通孔(TSV)”在每一层钻出垂直通道,让整个堆栈共享一条 1024 位宽的巨型传送带,直接从 GPU 下方的基板接入计算核心。立体仓库每一层都装货,垂直电梯直达出库口——这就是高带宽内存的直观原理。

HBM 的诞生是为了突破“位宽”的物理极限。传统 GDDR 的引脚数量受限于 PCB 布线面积,位宽很难超过 512 位。HBM 通过封装工艺把内存和 GPU 集成在同一基板上,引脚缩短且不再经过主板走线,位宽轻松做到 4,096 位以上。于是,在频率并不占优的前提下,HBM 带宽是 GDDR 的 2~4 倍,同时每个数据位传输所消耗的能量更低。GDDR6X 位宽 32~384 位,单颗密度高、成本低,常见于消费级显卡;HBM2e/HBM3 位宽 1024 位/堆栈,带宽巨大但成本昂贵,常见于 A100、H100 等 AI 加速卡。

立体仓库用垂直电梯取代了地面卡车,不仅速度更快、占地更小、每件包裹的能耗也更低。HBM 就是 AI 加速卡给计算核心配的“立体传送带”,正因有了它,百亿参数的大模型训练才不至于被数据搬运拖死。

Ebit=P总功耗B带宽E_{bit} = \frac{P_{总功耗}}{B_{带宽}}
每比特传输能耗等于总功耗除以带宽。HBM 用更短的引脚和更低的驱动电压,换来了更低的单位数据能耗,这对大规模 AI 集群至关重要。
  1. 总功耗显存系统整体功耗,HBM 因减少外部 PCB 走线而显著降低。
    P总功耗⇒所有内存通道消耗的功率P_{总功耗} \Rightarrow \text{所有内存通道消耗的功率}
  2. 除以带宽把功耗摊到每个传输的比特上,衡量“搬 1 bit 数据花多少能量”。
    P总功耗B带宽⇒每比特搬运的真实能耗\frac{P_{总功耗}}{B_{带宽}} \Rightarrow \text{每比特搬运的真实能耗}

Roofline模型定位

现在,你需要一张图快速回答“这个程序是算力瓶颈还是带宽瓶颈”。Roofline 模型就是这样的天花板图:横轴是每个算子每访问 1 字节数据能执行的浮点运算次数,叫算术强度(Operational Intensity,FLOP/Byte);纵轴是可达到的吞吐性能(FLOPS)。图上“一横一斜”两条线构成屋顶:水平线是算力天花板,斜线是带宽天花板。

当程序位于斜线上时,提高算术强度(让计算更密集、减少数据访问)就能提升性能;一旦爬到水平屋顶区域,计算已跑满,继续优化访存也无效。两条线的交点就是“最低必要算术强度”:

Roofline 的价值在于一眼判断。假设 GPU 峰值算力 20 TFLOPS,带宽 2 TB/s,交点强度为 20e12 / 2e12 = 10 FLOP/Byte。向量加法每个元素访问 8 字节、做 1 次加法,强度只有 0.125,必然被斜线死死压住;而大矩阵乘法强度可达 50~100,能安稳躺在水平屋顶上。

配送中心管理者只需画一张“分拣台能力 vs 传送带能力”的双线图,就能一眼判断扩建传送带还是多雇人手更划算。Roofline 就是 AI 工程师的“运力图”。

P=min⁡(Ppeak,  I×Bpeak)P = \min\left(P_{peak},\; I \times B_{peak}\right)
Imax=PpeakBpeakI_{max} = \frac{P_{peak}}{B_{peak}}
I_max 是算力与带宽平衡的临界点:算术强度低于它则带宽受限,高于它则计算受限。
  1. 算术强度总 FLOPs 除以总字节访问量,是 Roofline 的横轴核心指标。
    I=F计算量M访存量⇒每字节数据做了多少次计算I = \frac{F_{计算量}}{M_{访存量}} \Rightarrow \text{每字节数据做了多少次计算}
  2. 带宽上限强度乘以带宽,得到“受带宽约束时最多能跑多快”。
    I×Bpeak⇒斜线天花板I \times B_{peak} \Rightarrow \text{斜线天花板}
  3. 取最小值有效性能以算力上限和带宽上限中较小者为准。
    min⁡(Ppeak,  I×Bpeak)⇒两天花板中矮的生效\min(P_{peak},\; I \times B_{peak}) \Rightarrow \text{两天花板中矮的生效}
  4. 临界强度峰值算力除以带宽,得到屋顶折点。
    PpeakBpeak⇒折点左侧带宽受限,右侧计算受限\frac{P_{peak}}{B_{peak}} \Rightarrow \text{折点左侧带宽受限,右侧计算受限}

优化实践策略

明白了瓶颈在哪,接下来就是动工改造。既然传送带总宽度暂时不可变,能做的就三件事:减少搬动次数、加大每次搬动量、避免重复搬运。对应到 GPU 优化,最典型的手段包括算子融合、数据复用、访存对齐和存储层级利用。

算子融合:把两个连续算子(如卷积+激活)合并成一次内核执行,中间结果原本要写回显存再读回来,现在全程留在寄存器/共享内存里,等效于少走一趟传送带。数据复用:卷积网络处理同一张特征图时,权重被大量输出位置重复利用,通过 tiling 把数据切块驻留在片上缓存,权重从显存只需读一次,有效算术强度成倍提高。访存对齐:GPU 按 128 字节 cacheline 搬运数据,若访问错位,一次搬运只有一半有效数据,相当于传送带上空了一半箱子;对齐到 128 字节边界能显著提高有效带宽利用率。存储层级利用:GPU 有寄存器、共享内存、L1/L2 缓存、显存构成的金字塔,越靠近核心越快但容量越小,热数据留在缓存、冷数据才去显存,是对带宽的最大尊重。

配送中心的改造哲学是:能整批装车的别零散送,能合并路线的别跑两趟,能就近取货的别去远仓。GPU 优化的每一条实践,都是围绕“省带宽”三个字展开——因为带宽,才是这个时代 AI 算力背后那条最稀缺的传送带。

Ieff=F计算量M实际访问量I_{eff} = \frac{F_{计算量}}{M_{实际访问量}}
优化的本质是让“实际访问量”变小,把有效算术强度推过临界点,让算子从带宽受限区挪进计算受限区。
  1. 计算总量算子的浮点运算量,优化一般不改动它。
    F计算量⇒总运算量是固定需求F_{计算量} \Rightarrow \text{总运算量是固定需求}
  2. 实际访问量经缓存复用、算子融合后真正落到显存的字节数,这是优化主攻方向。
    M实际访问量⇒让它变小是核心目标M_{实际访问量} \Rightarrow \text{让它变小是核心目标}
  3. 有效强度两者相除得到新的屋顶线位置,直接决定性能落点。
    F计算量M实际访问量⇒强度提升,性能向屋顶靠拢\frac{F_{计算量}}{M_{实际访问量}} \Rightarrow \text{强度提升,性能向屋顶靠拢}

AI 应用场景

LLM推理:显存没满,输出却慢如蜗牛

阶段:模型部署与推理优化

解决的问题:大模型推理时每生成一个 token,都要把全部权重从显存读一遍,单步访存量≈模型大小,带宽直接锁死输出速度。按“峰值算力”选卡的传统思路会踩坑,因为推理瓶颈常在带宽而不是算力。

具体案例:7B 模型以 BF16 精度推理,40GB 的权重每生成一个 token 都要遍历一次,A100 的 2 TB/s 带宽下无优化单步至少 20ms。通过 KV Cache 复用、连续批处理和权重量化(如 4bit),把实际访存量 M 降下来,吞吐直接提升数倍——这正是 vLLM 等框架的核心优化逻辑。

AI芯片设计:用Roofline决定加核还是加带宽

阶段:芯片设计与硬件选型

解决的问题:预算和功耗固定,架构师要决定是增加计算单元(分拣员)还是配置更多 HBM 堆栈(传送带)。凭直觉容易赌错方向,Roofline 模型提供量化依据:把目标负载的典型算子画到图上,看它们落在屋顶还是斜线。

具体案例:某 AI ASIC 团队在评估 16 核与 24 核两个方案时,利用 Roofline 发现目标负载以低强度算子为主,增加核心毫无收益,于是改为增加 HBM 堆栈数和总线位宽,最终同等功耗下吞吐提升 37%,功耗还降低了 12%。

Python 演示

python29 行
# Roofline analysis tool for GPU memory bandwidthdef arithmetic_intensity(flops, bytes_):    """FLOPs per byte: higher means compute-heavy, lower means memory-bound"""    if bytes_ == 0:        return float('inf')    return flops / bytes_ def predict_time(flops, bytes_, peak_flops, peak_bw):    """Estimate kernel time under Roofline model on a target GPU"""    t_compute = flops / peak_flops    t_memory = bytes_ / peak_bw    return max(t_compute, t_memory), t_compute, t_memory def analyze_kernel(name, flops, bytes_):    """Print bottleneck type and predicted time for one kernel"""    intensity = arithmetic_intensity(flops, bytes_)    t_real, t_calc, t_mem = predict_time(flops, bytes_, 19.5e12, 2.0e12)    bottleneck = "compute-bound" if t_calc >= t_mem else "memory-bound"    print(f"{name:20s} intensity={intensity:8.2f} FLOP/B | {bottleneck:13s} | time={t_real:.6f}s") if __name__ == "__main__":    print("Roofline on A100 (19.5 TFLOPS, 2.0 TB/s)")    kernels = {        "GEMM(4096^3)": (2 * 4096**3, 3 * 4096**2 * 4),        "VectorAdd(1e8)": (1 * 10**8, 3 * 10**8 * 4),        "BN(1e8)": (3 * 10**8, 2 * 10**8 * 4),    }    for name, (f, b) in kernels.items():        analyze_kernel(name, f, b)
目的:用 A100 的算力与带宽参数,快速判断三个典型算子属于计算受限还是带宽受限,并预测实际执行时间。
  1. return flops / bytes_计算算术强度:每字节数据支撑多少次浮点运算
  2. t_memory = bytes_ / peak_bw访存耗时 = 数据量 ÷ 带宽,这是判断带宽瓶颈的关键
  3. return max(t_compute, t_memory), t_compute, t_memory实际耗时由慢的一方决定
  4. bottleneck = "compute-bound" if t_calc >= t_mem else "memory-bound"比较计算与访存时间,确定瓶颈类型
  5. "GEMM(4096^3)": (2 * 4096**3, 3 * 4096**2 * 4)用“运算量 + 字节数”描述矩阵乘,强度高达数百
  6. "VectorAdd(1e8)": (1 * 10**8, 3 * 10**8 * 4)向量加强度不足 0.1,典型带宽受限

常见误区

误区我买了 48GB 显存的显卡,带宽肯定也比 24GB 的强,跑模型肯定更快。

正解容量和带宽是完全独立的两个指标。容量是仓库能装多少货,带宽是传送带每秒送多少货。48GB 显卡如果位宽只有 256 位,可能比 24GB 但位宽 384 位的卡带宽更低。选卡时不要只看容量,要同时看规格表里的 Bandwidth 数值。

为何常见:显存容量是产品宣传里最显眼的数字,消费者容易把“装得多”误认为“跑得快”。

误区超频显存频率,带宽一定大幅提升,我的 GPU 就能起飞了。

正解带宽是位宽 × 频率 × 倍率的乘积。频率只是其中一个因子,位宽往往更关键。GDDR 频率极高,但带宽始终被 384 位封顶;HBM 频率并不突出,却靠 1024 位/堆栈的接口碾压 GDDR。只压频率、不关心位宽,收益非常有限。

为何常见:频率数字大而醒目,很多自媒体评测也聚焦超频,让人忽略了因子相乘的关系。

误区推理任务计算量小,带宽瓶颈只存在于大模型训练,推理时不用管。

正解恰恰相反,生成式推理每生成一个 token 都要读取全部权重,单步访存量等于模型大小,推理吞吐几乎被带宽锁死。量化、PagedAttention 等热门推理优化,本质上都是在“省带宽”。

为何常见:训练慢常被归因于算力不足,于是默认推理也以算力论英雄,忽略了逐 token 生成的访存模式。

误区带宽不够用?把 L2 缓存做大点,数据都在片上,就不需要带宽了。

正解缓存只对局部性好、复用率高的数据有效。对于随机访问、一次性流式数据,缓存命中率极低,数据仍然要穿透到显存,带宽天花板依旧。缓存是“减少对带宽的依赖”,而不是“提升带宽本身”。

为何常见:看到缓存能加速部分算子,就误以为缓存可以完全替代带宽需求,忽略了访存模式的适配性。

面试题

Q1. 内存带宽常用的单位是?

单选题 · easy

  • A.每秒传输字节数← 正确答案
  • B.每秒钟浮点运算量
  • C.每秒处理器时钟周期
  • D.每秒屏幕刷新帧数

答案:A。带宽衡量数据搬运速率,单位是字节每秒(GB/s、TB/s)。浮点运算量是算力的单位(FLOPS),时钟周期是频率的单位,刷新帧数是显示器的指标。记住“带宽=搬数据,算力=做运算”。

Q2. HBM 高带宽内存的核心设计是?

单选题 · easy

  • A.提升核心工作频率
  • B.垂直堆叠加宽总线接口← 正确答案
  • C.增加显存存储容量
  • D.缩小芯片制造工艺

答案:B。HBM 的核心优势在于把 DRAM 垂直堆叠,并通过 TSV 硅通孔连接,使每个堆栈拥有 1024 位超宽带接口。它并不靠单纯提频或扩大容量取胜,选 B。

Q3. 在带宽公式 B=W/8×f×r 中,HBM 主要靠哪个因子碾压 GDDR?

单选题 · mid

  • A.W内存总线位宽← 正确答案
  • B.f显存工作频率
  • C.r传输倍率系数
  • D.8固定转换常量

答案:A。HBM 用 1024 位/堆栈的位宽超越 GDDR 的 384 位,位宽 W 是决定性因素。频率方面 HBM 反而低于 GDDR,倍率也不是其杀手锏,8 是固定常量。

Q4. 以下哪些算子大概率属于带宽受限?

多选题 · mid

  • A.批量归一化算子← 正确答案
  • B.激活函数ReLU算子← 正确答案
  • C.大规模矩阵乘法
  • D.图像低曲率插值

答案:AB。批量归一化和 ReLU 是逐元素操作,每个数据只做几次运算,算术强度极低,访存时间远大于计算时间。大规模矩阵乘和复杂插值计算密集,通常落在计算受限区。

Q5. 算术强度很高的算子(如大矩阵乘法)通常归类为?

单选题 · mid

  • A.带宽受限类型
  • B.计算受限类型← 正确答案
  • C.存储延迟受限类
  • D.线程调度受限类

答案:B。算术强度 I=FLOPs/字节,矩阵乘法单位数据支撑大量运算,I 可达数百,计算时间大于访存时间,因而是计算受限。带宽受限是低强度算子的典型特征。

Q6. 某算子落在 Roofline 模型的斜线(带宽受限区),以下手段能有效提升性能?

多选题 · hard

  • A.算子融合减少访存← 正确答案
  • B.提高L2缓存命中率← 正确答案
  • C.提升GPU核心频率
  • D.开启更大数据宽度

答案:AB。斜线区的瓶颈是带宽,A 和 B 都减少了实际访存量 M,使算术强度增大、性能沿斜线上移。提升核心频率只抬高水平屋顶,对斜线无效;加大数据宽度反而增加访存量,使性能更差。

Q7. 大模型推理时“显存没满但 token 输出很慢”,最可能的原因是?

单选题 · hard

  • A.当前算力明显不足
  • B.当前带宽严重不足← 正确答案
  • C.模型权重体积太大
  • D.训练数据质量不高

答案:B。推理每步要读取全部权重,单步访存量≈模型大小,输出速度被带宽锁死。显存没满说明容量不是瓶颈,权重体积大是带宽压力大的根源而非直接原因,训练数据质量与推理无关。

Q8. 关于带宽利用率,下列说法正确的是?

单选题 · mid

  • A.提升芯片频率必有效
  • B.变换访存模式有效果← 正确答案
  • C.利用率与带宽无关
  • D.利用率只升不降

答案:B。实际有效带宽高度依赖访存模式,合并连续访问、对齐到 cacheline 都能显著提升利用率。提升频率不一定改善利用率,利用率与访问模式密切相关,也可能因模式变差而下降。

Q9. 以下属于优化 GPU 访存带宽的手段有?

多选题 · easy

  • A.使用算子融合← 正确答案
  • B.数据分块复用← 正确答案
  • C.随机内存访问
  • D.合并连续访存← 正确答案

答案:ABD。算子融合减少中间结果的搬运,数据分块复用让缓存承担更多访存请求,合并连续访存充分利用 cacheline。随机访问会破坏局部性、浪费带宽,属于反面操作。

Q10. GPU 峰值算力为 10 TFLOPS,带宽为 1 TB/s,某算子算术强度为 20 FLOP/Byte,预期可达到性能是?

单选题 · hard

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

答案:C。带宽上限 = 算术强度 × 带宽 = 20 × 1 = 20 TFLOPS,超过算力上限 10 TFLOPS,取两者较小者得 10 TFLOPS。说明该算子已进入计算受限区,性能由峰值算力封顶。