llm-inference-anatomy

← 返回 02 阶段

Results —— 原始数据

一条没删。 报告里的每一个数字都来自这里,没有跨批次拼接。

Round1 · 2026-09-24

一次 run_p0.sh 的全部产物。同一次开机、同一份二进制、同一块卡。

文件 是什么 大小
all_20260924_180114.txt 计时主表:8 kernel × 4 尺寸 × 3 轮,含编译日志、正确性、边界(4097/4100)、racecheck 1555 行
all_20260924_180114_clocks.csv 1 Hz 采样:SM 时钟 / 显存时钟 / 温度 / 功耗 / 利用率 —
shapes_20260924_180619.txt 形状扫描:方阵 / prefill / decode-b32 / decode-b1 —
sass_20260924_180113.txt 按 kernel 分类的静态指令计数 —
sass_20260924_180113_raw.txt cuobjdump -sass 完整反汇编 8981 行
ncu_20260924_180816.log 权限失败的现场(ERR_NVGPUCTRPERM),原样保留 —
fingerprint.txt 环境指纹:驱动、时钟、每个 kernel 的寄存器数、峰值口径 —
csv/bench_*.csv 解析后的表 —

Reduction · 2026-09-21

第 10 章归约(报告 03)的全部产物。不是同一批机器 —— 它比 Round1 早三天、另一台 4090,所以绝对耗时不能和 Round1 混着比。

文件 是什么
reduce_20260921.txt 原样终端输出:设备信息 + 两个实验 + ptxas -v + racecheck

这份没有 CSV。报告 03 的构建脚本直接解析这份纯文本 —— 每个测量块的表头是 === R4 分段 · N = … · block = … ===, 下面几行是耗时 / 下限 / 有效带宽 / 原子加,按行抽就行。 报告里没有一个数字是手抄的。

Fused · 2026-10-01

融合算子(报告 04)的全部产物。又是另一台 4090(driver 595.91.07), 所以绝对耗时同样不能和 Round1、Reduction 混着比 —— 报告 04 只用同一份日志里的比值和 MBU。

文件 是什么 大小
fused_20261001_005225.txt run_fused.sh 一次完整运行的原样日志:编译 + 11 个 kernel 的 spill 检查、正确性与边界、主阶梯 3 轮、形状扫描(decode-b1 / b32 / prefill / 大批)、长行拒绝、racecheck × 3 787 行

这份也没有 CSV。脚本末尾提示的 parse_fused.py 没有写 —— 报告 04 的原始测量值(耗时、GB/s、MBU、寄存器数)都直接取自这份日志,关键处标了行号;比值和反推量由这些数算出。

读日志时注意两处预期内的异常:s3 32 152064 那一条按设计会被拒绝并以返回码 3 退出; racecheck 段的耗时和 MBU 是插桩后的数字,没有意义,只看 RACECHECK SUMMARY 那一行。

两份 CSV 的分工

  内容 用途
bench_<stamp>.csv 每一轮每个 kernel 一行,不做任何聚合 证据。”你这 3 轮抖了多少”的答案只在这里
bench_<stamp>_median.csv 跨轮中位数,多一列 ms_spread_pct 结论。报告里所有表和图都引这一份

逐轮表只做搬运 —— bench_<stamp>.csv 里每个数都能在原文里逐字找到。

中位表有算出来的列,分两类:聚合(ms 的中位数、ms_spread_pct), 以及由中位耗时重算的派生列(gflops / pct_peak / beat / cyc_per_load / roofline_pct)。 后者必须重算而不能照抄第 1 轮 —— 中位数不一定来自第 1 轮,照抄会让 “ms 和由 ms 推出来的数”自相矛盾。 这个坑真踩过:k1 的 ms 取自第 3 轮,节拍却留着第 1 轮的 31.76, 而用中位耗时算出来是 31.83,报告里印出的算式自己和自己不符。

结构性的列(dist / bcast / ldg / ai / regs / occ)各轮完全相同,照抄第 1 轮。

一处提醒

sass_20260924_180113.txt 里的统计表是当天在本地用修正后的脚本重算的 —— 当场跑出来那版因为一个贪婪正则,整张表都是 0(完整反汇编不受影响)。 文件开头有标注。