复制为
report.md后填写。保留失败或反常结果;不要把参考解的实验当作自己的实现。
1. 问题、环境与复现方式
- 我想验证的问题 / 可被否证的预测:
- 使用的实现(自己的 / 参考对照)、Git commit 或 CSV 中 source_sha256:
- Python、操作系统、CPU(计时来自此环境):
- 完整命令、seed、warmups、repeats、原始 CSV 路径:
- 命令的当前目录(课程根目录,能看到course;源码仓库的_courses/deepinfer):
- 计时区间包括什么、排除什么;当时电源/后台负载情况:
- Roofline 对象(默认虚构加速器 / 真实 GPU):
- 模型带宽(GB/s)、峰值(TFLOP/s)、dtype、SIMT/Tensor Core、稠密/稀疏:
- 规格来源链接和查询日期(使用虚构参数时注明无需查规格):
2. 正确性与复用
- 复用的本人 Lab 函数、为本项目做的修改:
- 完整测试命令与结果;浮点比较的容差和理由:
- Q2 长度 5 的每轮结果;一个浮点加法改变顺序的反例:
- Q9 一个矩形例子中的局部 accumulator 在每轮 k0 后是什么:
- 该例每轮实际搬了哪些A/B值、何时写回C;与L4逐块图的对应关系:
- 为什么输入不会被修改、输出行不会共享:
3. 请求量推导
说明 naive 与 tiled 的读/写次数,推导 ceil 的来源,再手算一个尾块案例。区分请求字节、最小存储容量、真实设备流量。
| n | tile | naive bytes | tiled bytes | ratio | 计数器是否符合(只跑小 n) |
|---|---|---|---|---|---|
| 3 | 2 | ||||
| 3 | 16 | ||||
| 17 | 8 |
以下仅算模型,不运行 Python 大矩阵;MB = 1e6 bytes。
| n | tile | naive MB | tiled MB | ratio |
|---|---|---|---|---|
| 1024 | 16 | |||
| 4096 | 32 | |||
| 8192 | 64 |
4. 实验与 Roofline
引用 CSV 的具体行,至少比较 tile=1、存在尾块的 tile 和 tile>n。保留原始 CSV,不只截取最快结果。
| n | tile | 最大绝对误差 | 请求字节 | 请求量比 | Python 中位数 ms | Python p90 ms |
|---|---|---|---|---|---|---|
先写明每种算法读写几遍、是否缓存/融合及 FLOPs 约定。softmax 单列 exp 次数,说明等价 FLOPs 模型的局限。
| Kernel | shape / dtype | 模型 bytes | FLOPs(及额外操作) | AI(FLOP/byte) | 模型 bound | 时间下界 µs |
|---|---|---|---|---|---|---|
| vector_add | ||||||
| softmax | ||||||
| matmul |
- 哪条数据支持最初预测?哪条不支持?
- 请求量减少与 Python 时间的关系是什么?有哪些混杂因素?
- 为什么 Python 时间和虚构加速器下界不能相除得出 GPU 效率?
- 这一模型未包含哪些硬件因素?下一步用什么实验区分解释?
5. Debugging notebook 与 Checkoff
最小失败输入 → 期望值 → 实际值/异常 → 根因 → 修复 → 回归命令。
至少记录一个能区分下列问题的证据:尾块越界、accumulator过早清零、绕过Memory读数据、过多写回。不要只填“测试全通过”;写出哪个中间状态让你确认原因。
逐条回答 README 的 5 个 checkoff 问题,每条至少引用一个自己的例子或实验数据。没有真实 GPU 数据时写清楚还需要测什么。
6. 自评与可选 GPU 结果
按 README 内部 100 分 rubric 自评,逐项指向证据。没有完成的部分留空并写清原因。
若做 GPU 延伸:列设备、dtype、shape、比较 baseline、数值容差、编译/传输/同步/计时边界、warmup/repeats、中位数/p90、误差;最后说明模型与实测差距。未做则填写“未做,不影响核心成绩”。