想象你是一位田径队教练,队里有几名状态低迷的运动员。你手里只有一块秒表,能知道的只是“他这次跑了 40 秒”。可他到底是因为起跑慢了、步频低了,还是冲刺时缺氧?秒表永远无法回答。你需要一台设备齐全的体检中心:心电图、血压计、肺活量仪、血氧检测仪,把每个运动员从头到脚量化一遍。 AMD 的 ROCm 生态里,就藏着这样一台“综合体检仪”——rocprof。它不用你修改一行代码,就能测出每个 kernel(GPU 上执行的并行计算单元,相当于一个个小运动员)的执行时间、硬件计数器、内存吞吐量等多项指标。而 Roofline 模型,则像医生手里的“生理极限曲线”:任何成绩都不能超过人类极限,曲线帮你一眼看出某个 kernel 是“体力不够”还是“供血不足”。拿到体检报告后,医生开出处方,你照着训练,再复查对比。 这篇文章,就带你认识这台体检仪、读懂体检报告、学会用 Roofline 极限图做诊断,最后针对瓶颈开优化处方。

岗位关联

学会用 rocprof 做性能分析,你就能像医生一样“对症下药”优化 GPU 算子。这是 AI 算力工程师做算子开发、推理部署与训练调优的核心技能,也是从“程序能跑”走向“程序跑得快”的分水岭。

目录
  1. 可视化演示
  2. 认识体检仪:rocprof 工具本质
  3. 体检项目:性能指标采集
  4. 标准体检流程:四步分析工作流
  5. 生理极限图:Roofline 模型
  6. 医生会诊:瓶颈诊断
  7. 开训练处方:优化实践
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

双模式展示rocprof分析流程:热点定位(kernel执行时间柱状图+热点高亮)与Roofline模型(计算/内存边界+内核定位点诊断瓶颈)。

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

热点定位 HOT:耗时最高的内核(高亮标记) 各kernel执行时间对比 rocprof --stats → identify hot kernels 先用--stats模式快速定位热点内核。

认识体检仪:rocprof 工具本质

想象你是一名田径队教练,面对几名状态低迷的运动员。你手里只有一块秒表,能知道的只是“他这次跑了 40 秒”。但他到底是因为起跑慢、步频低还是冲刺缺氧?秒表永远无法回答。你需要的不只是计时器,而是一套能测心率、血压、肺活量、血氧的全套体检设备——它能告诉你“为什么慢”,而不只是“慢了多久”。

在 AMD 的 ROCm 生态中,rocprof 就是这套体检设备。它和 NVIDIA 的 Nsight Compute 属于同一档次的对标工具:专业队用测速枪和高速摄影,业余爱好者只知道掐秒表。rocprof 最大的特点是无侵入:你不需要修改任何一行源码,它通过 GPU 驱动层的接口“隔空把脉”,采集每个 kernel 的运行数据,并整理成 CSV(逗号分隔的表格)报告输出。

rocprof 的能力分三个层次。最基础的是 kernel 执行时间统计:每个 kernel 被调用几次、单次耗时多少纳秒、总耗时多少。进阶是硬件计数器:GPU 内部有大量硬件事件计数器,能记录 wavefront(GPU 上并行执行的线程小组,相当于运动员的小分队)的调度情况、缓存命中率等深层数据。最高级的是内存吞吐量分析,直接度量数据搬运速度。而程序整体耗时,可以按 kernel 逐个拆解:

拿到 rocprof 生成的 CSV 报告,就像拿到一张包含身高体重、心电图、血压的全项体检单。但光有单子不会看,等于白检。接下来,我们要学会读懂体检单上的每一栏指标。

Ttotal=∑k=1nTkT_{\text{total}} = \sum_{k=1}^{n} T_k
  1. 总耗时 T_total整个程序从启动到结束的执行时间,相当于整场比赛的总时长。
    TtotalT_{\text{total}}
  2. 求和符号 Σ把从第 1 个到第 n 个 kernel 的耗时逐一累加,意思是“总时长由所有 kernel 拼成”。
    ∑k=1n\sum_{k=1}^{n}
  3. 单个 kernel 耗时 T_k第 k 个 kernel 自己花掉的时间,是体检单上每个运动员的单人成绩。
    TkT_k

体检项目:性能指标采集

体检单上每一栏都有自己的意义:心率反映心脏负荷,血压反映血管压力,肺活量反映呼吸能力。GPU 的体检单同样一栏一栏,从不同侧面描述 kernel 的“身体状况”,任何单一指标都无法给出完整结论。

其中,kernel 执行时间是最直观的指标,相当于运动员的比赛成绩,也是判断“谁拖了后腿”的第一依据。但只有成绩远远不够,还要看硬件计数器:比如 L2 缓存命中率,相当于运动员的肌肉利用效率——如果每次用力都要从几公里外的“仓库”(显存)取补给,当然跑不快。再看内存吞吐量,它衡量 GPU 每秒能从显存搬运多少字节,相当于血液向肌肉输送氧气的速度。最后是指令效率:GPU 的计算单元到底在干正事,还是大量时间在空等数据。

这四个指标——kernel 计时、硬件计数器、内存吞吐量、指令效率——组合起来,才是完整的“身体状况”。其中内存吞吐量的计算很简单:

体检时,护士会同时测量多项指标而不是只测一项。rocprof 也支持在同一次运行中同时采集这些数据,输出到一张 CSV 表。拿到这张多栏报告单,下一步就是学会有条理地分析它。

B=DTB = \dfrac{D}{T}
  1. 数据量 Dkernel 执行期间从显存读写的数据总字节数,相当于运动员训练中消耗的氧气总量。
    DD
  2. 时间 T完成这些读写所花的时间,也就是 kernel 的执行时长。
    TT
  3. 吞吐量 B两者相除,得到每秒搬运的字节数,是衡量“供氧速度”的核心指标。
    DT\dfrac{D}{T}

标准体检流程:四步分析工作流

有经验的体检中心从不乱序检查:先做基础测量,发现异常再安排专项检查,最后医生综合诊断。GPU 性能分析也遵循固定工作流,乱来只会得到一堆无法对照的数据。

第一步建立基准:先跑一次未经优化的版本,得到 baseline 数据,这是后续所有对比的“健康基线”。第二步热点定位:用 rocprof 的 kernel 耗时数据,找出耗时占比最高的 kernel——它就是最需要关注的对象。第三步指标解读:针对热点 kernel,深入查看它的硬件计数器、内存吞吐量等指标。第四步对比分析:优化后重跑,与基线逐项对比,确认效果。

热点定位有量化标准:某个 kernel 的耗时占总耗时的比例,称为热点占比。占比越高,优化它的收益上限就越大,这就是 GPU 编程中的“二八定律”——少数 kernel 消耗了大部分时间。

就像体检医生先看“哪些指标超出参考范围”,热点占比告诉你该把注意力放在哪个 kernel 身上。但注意:占比高只代表“病得重”,不代表“容易治好”。下一节,我们要引入那张更深刻的“生理极限曲线”——Roofline 模型。

Phot=TkernelTtotal×100%P_{\text{hot}} = \dfrac{T_{\text{kernel}}}{T_{\text{total}}} \times 100\%
  1. 热点 kernel 耗时 T_kernel当前关注的 kernel 的总耗时,它是分子,代表“这个运动员花了多少时间”。
    TkernelT_{\text{kernel}}
  2. 程序总耗时 T_total所有 kernel 耗时之和,是分母,代表“整场比赛总共花了多少时间”。
    TtotalT_{\text{total}}
  3. 换算百分比两者相除再乘以 100%,得到该 kernel 占整体时间的比例,用于排序定位热点。
    ×100%\times 100\%

生理极限图:Roofline 模型

任何运动员的成绩都有生理极限:百米世界纪录是 9 秒多,不可能有人跑进 5 秒。医生手里有一张“人类生理极限图”,凡是超过极限的必然是测量错误,凡是远低于极限的一定还有提升空间。对 GPU kernel 而言,这张极限图叫 Roofline 模型(屋顶线模型)——屋顶的形状,决定了天花板的高度。

Roofline 模型把 GPU 的能力抽象成两堵墙:算力上界(GPU 每秒最多完成多少次浮点运算)和带宽上界(GPU 每秒最多从显存搬运多少字节)。kernel 的实际性能不可能超过任何一堵墙,就像运动员的配速同时受体力和供氧双重限制。两堵墙的交点叫脊点,它是判断瓶颈类型的分水岭。

决定 kernel 落在哪一堵墙的,是算术强度——单位访存量对应的运算量,通俗说就是“吃一口饭能跑几步”。算术强度高说明计算密集,低则说明访存密集。理论性能上限等于两堵墙中较低的那一堵:

有了这张“极限图”,优化方向立刻清晰:落在屋顶左侧的 kernel 是“吃饱了没力气”——访存瓶颈;落在右侧的 kernel 是“有力气没饭可吃”——计算瓶颈。下一步,我们来当一回医生,做精确诊断。

I=WQI = \dfrac{W}{Q}
Pmax⁡=min⁡(π, β×I)P_{\max} = \min\left(\pi,\ \beta \times I\right)
  1. 运算量 Wkernel 需要完成的总浮点运算次数,单位 FLOP,相当于运动员的总做功量。
    WW
  2. 访存量 Qkernel 从显存读写的数据总字节数,单位 Byte,相当于运动中的总氧气消耗。
    QQ
  3. 算术强度 I每搬运一个字节平均做多少次运算,I 越大表示越偏计算密集型。
    I=WQI = \dfrac{W}{Q}
  4. 双重上限取小带宽墙 β×I 与算力墙 π 谁低就听谁的,得到理论性能上限 P_max。
    Pmax⁡=min⁡(π, β×I)P_{\max} = \min\left(\pi,\ \beta \times I\right)

医生会诊:瓶颈诊断

医生拿到体检单后不会急着开药,而是先判断:病人的问题到底出在哪个系统?是呼吸系统(访存)还是肌肉系统(计算)?GPU 性能诊断做的是完全类似的事:先判定瓶颈类型,才能对症下药。

判据很简单:把 kernel 的算术强度与脊点比较。算术强度小于脊点,落在带宽段,属于访存瓶颈——GPU 的“搬运工”太忙,计算单元饿着肚子等数据;算术强度大于脊点,落在算力段,属于计算瓶颈——计算单元已经满负荷,数据搬得再快也没用。除了瓶颈类型,还要看两个深层指标:延迟隐藏能力和占用率。

占用率指 GPU 上同时活跃的 wavefront 数量占理论最大值的比例。占用率高,意味着 GPU 有足够多的“候补运动员”,当一队队员等待显存数据时,另一队立刻顶上,从而把访存延迟隐藏起来。但占用率并非越高越好,过高会挤占缓存空间。综合判断时,常用性能效率量化优化空间:

效率低于 50%,说明 kernel 离屋顶线很远,像明明潜力很大的运动员却跑得很慢,优化空间充足;效率接近 100%,说明已紧贴极限,再头痛医头只会白费力气。诊断完毕,终于可以开处方了。

E=PactualPmax⁡×100%E = \dfrac{P_{\text{actual}}}{P_{\max}} \times 100\%
  1. 实际性能 P_actual用运算量除以实测时间得到的真实吞吐,是运动员当下的真实配速。
    PactualP_{\text{actual}}
  2. 理论上限 P_max来自 Roofline 模型,是当前算术强度下不可能超越的天花板。
    Pmax⁡P_{\max}
  3. 效率百分比实际值占上限的比例,越接近 100% 说明硬件吃得越满,优化空间越小。
    ×100%\times 100\%

开训练处方:优化实践

体检报告指明问题后,医生会开出针对性处方:肺活量差的练间歇跑,腿部力量弱的练深蹲。GPU 优化也一样,处方必须对准瓶颈类型,否则就是南辕北辙。

四种常见处方。第一,指令优化:面向计算瓶颈,通过算子融合减少 kernel 启动次数、用更高效的指令替换昂贵操作,相当于改进跑步姿势。第二,访存优化:面向访存瓶颈,通过向量化加载(一次搬更多数据)、合并访问(让相邻线程读相邻地址)提高搬运效率。第三,占用率调参:调整 workgroup(工作组)大小,在延迟隐藏和缓存占用之间找平衡。第四,迭代验证:改完立刻用 rocprof 重测,与基线对比,确认是变好还是变差。

验证优化效果的核心量化指标是加速比,即优化前耗时与优化后耗时之比。加速比 2 意味着原来 10 小时的任务现在 5 小时完成。需要提醒的是,优化是迭代过程:每轮只改一个变量,用 rocprof 的数据说话,避免“玄学调优”。

从掐秒表到全套体检,从读体检单到极限图诊断,再到开处方与复查,你已经掌握了完整的 GPU 性能分析工作流。下次再遇到“程序跑得慢”,别再只盯秒表:带上 rocprof 体检仪,对准 Roofline 极限图,当一名合格的“算子医生”。

S=TbeforeTafterS = \dfrac{T_{\text{before}}}{T_{\text{after}}}
  1. 优化前耗时 T_before未改动的基线版本的 kernel 耗时,是“旧处方”下的成绩。
    TbeforeT_{\text{before}}
  2. 优化后耗时 T_after采用新方案的 kernel 耗时,是复查后的新成绩。
    TafterT_{\text{after}}
  3. 两者相除比值就是加速的倍数,大于 1 说明优化有效,越大越好。
    TbeforeTafter\dfrac{T_{\text{before}}}{T_{\text{after}}}

AI 应用场景

深度学习算子的性能回归测试

阶段:模型推理优化

解决的问题:算子库迭代频繁,每次修改都可能引入性能退化。传统做法是人工跑 benchmark 对比耗时,既慢又容易漏掉细微劣化,就像只靠教练肉眼观察运动员状态,很难发现隐患。

具体案例:某推理引擎团队把 rocprof 接入 CI(持续集成)流水线,每次代码提交自动采集关键算子的 kernel 耗时和硬件计数器并对比基线。一次 LayerNorm 融合修改后,L2 缓存命中率骤降 20%,rocprof 的计数器数据立刻定位到访存顺序被意外改变,问题在合入前就被拦截。

大模型训练中的访存瓶颈定位

阶段:分布式训练调优

解决的问题:大模型训练变慢时,难以判断是算力不足还是数据搬运拖后腿。沿用上面的比喻,就是说不清运动员是“没力气”还是“供氧不够”。

具体案例:训练团队用 rocprof 对 Attention kernel 做 Roofline 分析,发现其算术强度仅 3,远低于脊点 14,属于典型访存瓶颈。改用融合式 Attention 思路减少中间结果落显存后,算术强度提升到 15,kernel 落入算力段,端到端训练提速约 30%。

推理服务的 GPU 选型对比

阶段:推理部署

解决的问题:厂商纸面参数(如峰值算力、显存带宽)无法反映真实算子表现,选卡像只看简历不看试训。

具体案例:推理平台工程师带着同一批算子,在候选 AMD GPU 上用 rocprof 采集数据并绘制 Roofline 落点。结果发现某款卡带宽数字很高但 L2 缓存偏小,访存密集型算子落点明显偏低,最终团队选择了访存表现更稳的型号,线上推理延迟降低 22%。

Python 演示

python64 行
"""roofline_analyzer.py -- 解析 rocprof CSV 输出并执行 Roofline 瓶颈分析"""import csvfrom dataclasses import dataclass # 模拟 rocprof 导出的 CSV 数据; 实际使用时改为读取 rocprof_*.csv 文件SAMPLE_ROCPROF = """Name,Count,TotalTimeNs,AverageTimeNsvector_add,8,3200000,400000mat_mul,2,1300000,650000layer_norm,6,500000,83333softmax,4,800000,200000""" # GPU 理论峰值(MI210 示例): 22.6 TFLOP/s, 1.6 TB/sPEAK_FLOPS = 22.6e12PEAK_BW = 1.6e12 # 每个 kernel 的 (运算量FLOP, 访存量Byte), 来自 rocprof 计数器或估算KERNEL_WORK = {    "vector_add": (1.0e9, 8.0e8),    "mat_mul": (2.6e10, 6.0e8),    "layer_norm": (1.8e9, 2.4e8),    "softmax": (4.0e9, 6.4e8),}  @dataclassclass KernelStat:    name: str    count: int    total_time_ns: int  def parse_rocprof(text: str) -> list:    """把 rocprof 的 CSV 文本解析成 KernelStat 列表"""    stats = []    for row in csv.DictReader(text.splitlines()):        stats.append(KernelStat(row["Name"], int(row["Count"]), int(row["TotalTimeNs"])))    return stats  def roofline(ai: float) -> float:    """Roofline 模型: 返回算术强度 ai 对应的理论性能上限(FLOP/s)"""    return min(PEAK_FLOPS, PEAK_BW * ai)  def analyze(stats: list) -> None:    """热点排序 + 瓶颈判定 + 效率评估"""    ridge = PEAK_FLOPS / PEAK_BW    total = sum(s.total_time_ns for s in stats)    print("=== rocprof hotspot analysis ===")    for s in sorted(stats, key=lambda x: -x.total_time_ns):        flop, byte = KERNEL_WORK[s.name]        ai = flop / byte        t_sec = s.total_time_ns / 1e9        achieved = flop / t_sec        ratio = achieved / roofline(ai) * 100        bound = "MEM-BOUND" if ai < ridge else "COMPUTE-BOUND"        mark = "WARN" if ratio < 50 else "OK"        print(f"{s.name:11s} hot={100*s.total_time_ns/total:5.1f}% "              f"AI={ai:9.1f} eff={ratio:5.1f}% [{bound}] [{mark}]")  if __name__ == "__main__":    analyze(parse_rocprof(SAMPLE_ROCPROF))
目的:读取 rocprof 导出的 CSV 耗时数据,结合 GPU 峰值参数,自动完成热点排序、Roofline 瓶颈判定和效率评估,输出一份“体检结论”。
  1. for row in csv.DictReader(text.splitlines())把多行 CSV 文本按行解析成字典,键是表头列名,读取 rocprof 报告的核心入口
  2. @dataclass自动为 KernelStat 生成构造函数,省去手写 __init__ 的样板代码
  3. return min(PEAK_FLOPS, PEAK_BW * ai)Roofline 的核心逻辑:算力墙和带宽墙取更低者作为天花板
  4. ridge = PEAK_FLOPS / PEAK_BW计算脊点,这是划分访存瓶颈与计算瓶颈的分界线
  5. sorted(stats, key=lambda x: -x.total_time_ns)按总耗时降序排列,天然得到热点 kernel 排名
  6. ai = flop / byte计算算术强度:每搬运 1 字节数据平均做多少次运算
  7. achieved = flop / t_sec用运算量除以实测时间,得到 kernel 的实际性能
  8. bound = "MEM-BOUND" if ai < ridge else "COMPUTE-BOUND"与脊点比较,自动判定瓶颈类型
  9. if __name__ == "__main__":只有作为脚本直接运行时才执行分析,被 import 时不误触发

常见误区

误区觉得 rocprof 和手动在代码里加计时器差不多,只是省了点事。反正最后都是得到“每个 kernel 跑了多久”。

正解计时只是最表面的一层。rocprof 真正强大的是数百个硬件计数器、内存吞吐量、指令流水线等深层指标,能回答“为什么慢”而不是“花了多久”。就像体检仪不仅能测体温,还能做心电图、查血氧——秒表做不到的,它都能做。

为何常见:rocprof 默认输出的表格看起来确实就是一份 kernel 耗时清单,很容易让人误以为功能仅此而已。

误区把“耗时越低越好”的直觉套到所有指标上,看到 L2 缓存命中率、占用率这些数字,也觉得越低越快。

正解不同指标方向完全不同。L2 缓存命中率、占用率通常是越高越好;而某些等待周期计数则是越低越好。指标必须放在具体瓶颈场景里组合解读,就像血压的“高”和心率的“高”含义完全不一样,不能一概而论。

为何常见:新手接触的第一个指标就是 kernel 耗时,很容易把“单方向直觉”泛化到所有指标上。

误区认为 Roofline 图中 kernel 点越贴近曲线就代表优化越好,只要点够到曲线,任务就完成了。

正解Roofline 给出的是“当前算术强度下的性能天花板”,不是优化的终点。更优的思路是提高算术强度本身——比如算子融合、减少中间结果落显存——把整个点向右推,跨过脊点从带宽段进入算力段,绝对性能可能翻倍。

为何常见:屋顶线的“上限”含义容易让人误以为是“目标”,从而忽略了算术强度这个可变量。

误区热点占比最高就差不了,直接埋头优化它。反正二八定律说了,大头搞定就赢了。

正解还要看优化空间,也就是当前效率离 Roofline 天花板有多远。占 80% 但已 95% 效率的 kernel,优化空间很小;占 30% 但只有 10% 效率的 kernel 可能提速数倍。优化收益约等于“占比 × 可提升幅度”,相当于医生既要看病情严重程度,也要看治愈可能性。

为何常见:热点占比是最显眼的数字,二八法则让人形成“只盯最大”的思维惯性,忽略了效率维度。

面试题

Q1. rocprof 是 ROCm 生态中的性能分析工具,它最直接对标的 NVIDIA 工具是?

单选题 · easy

  • A.nvcc 编译工具
  • B.Nsight 分析器← 正确答案
  • C.cuDNN 加速库
  • D.CUDA 驱动程序

答案:B。rocprof 的定位是 GPU kernel 性能分析器,与 NVIDIA Nsight Compute 功能对位,都是“给程序做体检”的工具;nvcc 是编译器、cuDNN 是库、驱动是系统软件,都不做性能剖析。

Q2. 不修改源码运行程序,让 rocprof 采集性能数据,通常把结果输出为哪种格式?

单选题 · easy

  • A.CSV 表格文件← 正确答案
  • B.JSON 对象文件
  • C.PDF 报告文件
  • D.SQL 数据库文件

答案:A。rocprof 默认把每个 kernel 的耗时、计数器数据导出为 CSV(逗号分隔的表格)文件,方便后续用脚本批量分析。JSON 虽常见但并非 rocprof 默认格式,PDF 与 SQL 更与运行期剖析无关。

Q3. 某 kernel 共搬运 2 GB 数据,耗时 1 ms,其内存吞吐量约为?

单选题 · easy

  • A.约 2 TB/s← 正确答案
  • B.约 2 GB/s
  • C.约 512 GB/s
  • D.约 0.5 GB/s

答案:A。吞吐量 = 数据量 ÷ 时间 = 2 GB ÷ 1 ms = 2000 GB/s ≈ 2 TB/s。这是体检单里的“供氧速度”,直接反映访存强度,也是 rocprof 内存吞吐量指标的计算基础。

Q4. Roofline 模型里,脊点(ridge point)指的是?

单选题 · mid

  • A.程序运行最久的位置
  • B.算力墙与带宽墙的交点← 正确答案
  • C.GPU 温度最高的位置
  • D.kernel 启动开销点

答案:B。脊点是“算力墙”与“带宽墙”的交点,对应算术强度 = 峰值算力 ÷ 峰值带宽。脊点左侧为访存瓶颈、右侧为计算瓶颈,是 Roofline 图上的分水岭,与运行时间、温度、启动开销无关。

Q5. 某 GPU 峰值算力 100 TFLOP/s、峰值带宽 4 TB/s,kernel 算术强度 10 FLOP/Byte,其理论性能上限约为?

单选题 · mid

  • A.约 40 TFLOP/s← 正确答案
  • B.约 100 TFLOP/s
  • C.约 4 TFLOP/s
  • D.约 250 TFLOP/s

答案:A。带宽上限 = 4 TB/s × 10 FLOP/Byte = 40 TFLOP/s,小于算力上限 100 TFLOP/s,按 Roofline 的 min 规则取小者得 40。低的那堵墙决定性能,就像运动员的配速受供氧限制。

Q6. 下列哪些性能数据可以通过 rocprof 采集到?

多选题 · mid

  • A.GPU 占用率← 正确答案
  • B.L2 缓存命中率← 正确答案
  • C.内存读写带宽← 正确答案
  • D.编译器警告数

答案:ABC。占用率、缓存命中率、内存带宽都属于 GPU 硬件计数器直接或间接给出的运行期指标;编译器警告是编译阶段的静态输出,与运行期性能剖析无关。

Q7. 关于热点占比与优化收益(Amdahl 定律),下列说法正确的有?

多选题 · mid

  • A.热点占比越高收益上限越大← 正确答案
  • B.占 80% 的 kernel 上限加速 5 倍← 正确答案
  • C.占比高的一定更值得优化
  • D.加速比与优化幅度成正比

答案:AB。加速比上限 = 1/(1−占比),占比 80% 时上限为 5 倍,A、B 对;若高占比 kernel 已接近 Roofline 上限,优化空间反而小,C 错;加速比与优化程度是双曲线关系而非线性,D 错。

Q8. 在 Roofline 图中,kernel 点落入带宽段且远低于曲线,说明?

单选题 · hard

  • A.访存路径存在浪费← 正确答案
  • B.性能已达硬件上限
  • C.计算负载严重超载
  • D.缓存命中率已极高

答案:A。点离曲线越远,实际性能与理论上限差距越大,说明硬件没被吃满;带宽段下方且远离曲线,典型原因是访存路径有浪费,比如未合并访问或缓存命中率低,是重点优化对象。

Q9. 关于 Roofline 模型,下列说法正确的有?

多选题 · hard

  • A.算术强度等于运算量除访存量← 正确答案
  • B.提升算术强度可改变瓶颈段← 正确答案
  • C.算力段上限受带宽约束
  • D.曲线可精确预测实测性能

答案:AB。A 是算术强度的定义;B 正确,算术强度增大可跨过脊点,使瓶颈从带宽段转向算力段;C 错,算力段受算力墙约束而非带宽墙;D 错,Roofline 给出的是理论上限,实测通常在其下方。

Q10. GPU 算力 200 TFLOP/s、带宽 2 TB/s,kernel 运算量 2 GFLOP、访存量 1 GB。若访存量减半且运算量不变,性能约提升?

单选题 · extreme

  • A.约 2 倍← 正确答案
  • B.约 1.5 倍
  • C.约 4 倍
  • D.没有提升

答案:A。脊点 = 200 ÷ 2 = 100 FLOP/Byte。原算术强度 2,远小于脊点,属访存瓶颈,上限 = 2 TB/s × 2 = 4 TFLOP/s;访存减半后算术强度为 4,仍小于脊点,上限 = 8 TFLOP/s,恰好提升 2 倍。