在 C=A×BC = A \times BC=A×B 的 Tiling 优化中,关于"A 和 B 是否都被复用"的结论如下:
1. 核心结论
- 理论层面:A 和 B 的总复用次数是对称的(A 复用 N 次,B 复用 M 次)。
- 工程实现层面 :在单级 Tiling 的最内层计算循环中,通常只有一个切块被真正"驻留复用",另一个是"流式加载"。你的直觉是正确的。
2. 为什么只复用一个?
受限于片上存储(Register/L1/Shared Memory)容量,无法同时容纳所有数据。必须做出选择:
- 驻留数据 (Resident):被加载一次后,在内层循环中被反复使用(通常是 A)。
- 流式数据 (Streaming):每次迭代加载新块,用完即弃(通常是 B)。
- 决定因素:取决于循环嵌套顺序(Loop Ordering)和 MNK 的形状,而非矩阵本身。
3. 例外情况
只有在 2D Tiling 或 多级存储层次 设计中,为了追求极致算术强度,才会让 A 和 B 同时在片上驻留并交叉复用。但这属于高阶优化,非常规默认行为。
💡 实践建议
编写 Kernel 时,始终明确区分哪个是 Resident Tile、哪个是 Streaming Tile。不要试图在最小存储层级让两者同时完美复用,这往往导致性能下降。复用策略应服务于存储层次的设计,而非数学上的对称性。