跳到主要内容
TileLang 系统教程

tilelang-tutorial.huandu.me

第 01 章 为什么需要 Tile DSL

/code/01-why-tile-dsl/

01-op-cost-model/README.md2403 字节
# 示例 1:算术强度 / 机器平衡点估算器

## 目的

把第 01 章 1.3 节的两个公式写成可运行的脚本:

```
算术强度 AI        = 浮点运算次数 / 访问的字节数        (FLOP/Byte)
机器平衡点 balance = 峰值算力 / 峰值带宽                (FLOP/Byte)
```

并对几个常见算子(MatMul / Softmax / RMSNorm)按**理论最小访存量**估算算术强度、判断
它们是 memory-bound 还是 compute-bound。

这不是性能预测器。它只回答一个问题:**这台机器会先撞带宽,还是先撞算力。**

## 运行前提

* Python 3.9 或更高(脚本只用标准库:`argparse`、`dataclasses`)。
* **不需要 GPU、不需要 NPU、不需要安装 TileLang、不需要 PyTorch。**

## 运行命令

```bash
# 默认参数:4096x4096x4096,H100 SXM5 的公开规格
python3 op_cost_model.py

# 改矩阵规模(用于习题 E9 第 2 问)
python3 op_cost_model.py --m 512 --n 512 --k 512

# 改机器参数(用于习题 E9 第 3 问)
python3 op_cost_model.py --peak-tflops 100 --bandwidth-tbps 1.5
```

## 期望输出

正确性判据:脚本正常退出(退出码 0),并打印三张表。默认参数下的实际输出(在 macOS
Apple Silicon、Python 3.11 上运行得到)是:

```
==============================================================================
机器模型
------------------------------------------------------------------------------
  峰值算力        : 1000 TFLOPS
  峰值带宽        : 3 TB/s
  机器平衡点      : 333.333 FLOP/Byte
==============================================================================
算子成本模型(理论最小访存量,fp16 输入输出)
------------------------------------------------------------------------------
算子                                   运算量          最小访存            算术强度                判定
MatMul(4096x4096x4096)         137 GFLOP        96 MiB       1365.33 F/B     compute-bound
Softmax(4096x4096)            50.3 MFLOP        64 MiB          0.75 F/B      memory-bound
RMSNorm(4096x4096)            67.1 MFLOP        64 MiB             1 F/B      memory-bound
==============================================================================
```

把规模改成 `--m 512 --n 512 --k 512` 后,`MatMul` 的算术强度降到约 **171**(低于 333),
判类翻转为 **memory-bound**。原因是本模型里立方 GEMM 的算术强度约为 `2M/(3*b)`,随边长
线性增长。这一点是习题 E9 第 2 问的考点。

## 性能口径

**本示例不测量任何性能。** 它输出的数字全部是公式推导:

* 机器参数(1000 TFLOPS、3 TB/s)来自
  `../../../tilelang-corpus/05-nvidia-backend/raw/nvidia-blog-hopper-architecture-in-depth.md`
  (H100 SXM5,厂商公开资料,preliminary specs,未实测);
* 机器平衡点是本书用上面两个数算出来的比值,不是厂商给出的数字;
* 算子成本按「理论最小访存量」计算,真实 kernel 会高于这个下界。

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

**CPU 逻辑验证。** 在 macOS (Apple Silicon)、Python 3.11 上运行过默认参数、`512³` 参数
与自定义机器参数三种调用,输出与本文档一致。没有在 GPU/NPU 上运行过任何内容。

## 已知局限

* 只统计「读入 + 写出」一行,不考虑中间量回写显存;这给了 memory-bound 算子一个**乐观**
  的下界(真实实现往往更差)。
* 运算量用的是粗估常数(softmax 每元素 3 FLOP、RMSNorm 每元素 4 FLOP),目的在于判断
  数量级,不在于精确。
* 不考虑 cache 命中、不考虑 kernel 启动开销、不考虑尾部效应。

← 浏览本章全部代码