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 启动开销、不考虑尾部效应。