跳到主要内容
TileLang 系统教程

tilelang-tutorial.huandu.me

第 14 章 算子实战 II:GEMM 全家族

/code/14-operators-gemm/

06-bench-methodology/README.md1835 字节
# 示例 06:性能对比口径换算器

## 目的

第 14 章第 7 节说:**不写清口径的对比数字不可信。** 这个小工具把其中两件
可以机械化的事做出来:

1. 「目标毫秒数 → 迭代次数」的换算(warmup / repeat);
2. 「统一用 2MNK → TFLOP/s」的换算,以及一份必须逐条填写的口径表。

它不测量任何真实性能;所有输出都是换算结果。

## 运行前提

* Python 3.9+,仅标准库(`argparse`、`math`)。
* **不需要 GPU / NPU,也不需要 TileLang 与 PyTorch。**

## 运行命令

```bash
python3 bench_methodology.py
python3 bench_methodology.py --per-iter 0.35 --m 4096 --n 4096 --k 4096
```

## 期望输出

默认参数下的实际输出(在 macOS Apple Silicon、Python 3.11 上运行得到):

```
========================================================================
目标口径:warmup=25.0 ms, rep=100.0 ms
========================================================================

    单次耗时(ms)       预热次数       重复次数      总耗时(ms)
------------------------------------------------
       0.005       5000      20000        125.0
        0.01       2500      10000        125.0
        0.05        500       2000        125.0
         0.1        250       1000        125.0
         0.5         50        200        125.0
           1         25        100        125.0
           5          5         20        125.0

换算示例:shape 4096x4096x4096,若单次耗时 1.0 ms → 137.44 TFLOP/s

对比前必须固定的口径(缺一条,数字就不可比):
  ... (十条清单,见脚本输出)
```

## 性能口径

**本示例不测量任何性能。** 其中:

* `warmup=25 ms`、`rep=100 ms` 来自 TileLang `do_bench` 的默认值
  (`_vendor/tilelang-v0.1.15/tilelang/profiler/bench.py:31`);
* 「重复次数至少 5 次」「按 `minimal_repeat_ms=100` 换算」来自
  corpus 里 cuBLAS 对比脚本的实测口径
  (`../references.md` 的 R8);
* TFLOP/s 的换算永远是 `2MNK / t`,与 epilogue 无关——epilogue 的有无
  要写在口径表里,不能靠改分母来「补偿」。

## 作者实际做到的验证级别

**CPU 逻辑验证。** 在 macOS (Apple Silicon)、Python 3.11 上运行过默认参数与
`--per-iter` 两种调用,输出与本文件一致。没有在 GPU/NPU 上运行过任何内容。

## 已知局限

* 换算表假设每次迭代耗时稳定;真实 kernel 有抖动,`do_bench` 因此会在每次
  采样前 flush L2,并支持 `mean` / `median` / `min` 等多种取数方式。
* 工具不判断你的对比是否公平;它只是把「应该写下来的东西」列出来。第 7.1
  节的表格是人工 checklist,本工具不替你做决定。

← 浏览本章全部代码