v0.6 修订:窗内不蛇形的原理说明 + L2切分与写出策略分场景分析

This commit is contained in:
2026-08-23 03:09:08 +00:00
parent 51a9e06bec
commit 77db4f4388

View File

@@ -348,17 +348,49 @@ C=32 时 $\sqrt{32} \approx 5.66$,因子 {1,2,4,8,…} 中不超过它的最
31 = (μ3, ν7) 32 = (μ4, ν7)——相邻两个块共用同一条 B 列带ν7窗口切换几乎零增量对比朴素行优先Ñ=16 一波横跨 2 A 行块 + 16 B 列带足迹 (2·M^t + 16·N^tK·dtype滑窗为 (4·M^t + 8·N^tK·dtype——M^tN^t 时足迹缩小 1/3
**窗内为什么不蛇形**对上例中" 3=(μ3,ν0) 4=(μ0,ν1) 而非 (μ3,ν1)"的说明蛇形的收益来自"相邻遍历段共享边界数据"要分两种边界看
* **窗内列间边界**ν0ν1相邻两段共享的是同一组 A 行块W 它们在整个窗口期间**全程驻留 L2**无论按什么顺序扫工作集不变——窗内蛇形零收益
* **窗口行边界**窗口0窗口1A 行整体换血μ0..3 μ4..7此时 B 列带的连续性决定换血成本——不蛇形则下一窗口从 ν0 开始LRU 上最久未用早已被挤出 L2 的冷带蛇形则延续上一窗口末尾的 ν7最热线带)。**蛇形只标在窗口行号上**源码 `BatchMatMulAswBlock::UpdateBasicIndex` `rowIdx` 为奇时 n 反向窗内 m 最快序不反向正是这个收益结构的直接实现
**3、L2 切分(工作集超 L2 时)**
**问题**滑窗压缩的是"同一波"的足迹若整个工作集全部 A + 全部 B 跨所有窗口超过 128MB L2跨波次的复用仍会落空——上一波窗口的 A 行早被挤出 L2下一波又得回 GM
**问题**滑窗压缩的"同一波"的足迹若整个工作集 128MB L2跨波次复用落空——上一波窗口的 A 行早被挤出下一波又得回 GM L2 **读写共用**输出经 fixpipe 写出时若驻留 L2dirty会压缩读入可用空间若直写 GM则占用与读共享的 1.6TB/s 总线所以 L2 切分必须与写出策略联合决策记输入总量 $S_{in} = B(MK+KN)\cdot\text{dtype}$输出总量 $S_{out} = B \cdot MN \cdot outB$
**做法** M×N 平面按 mL2TileNum × nL2TileNum 切成若干"L2 "每块的工作集控制在 L2 容量内逐块计算——块内滑窗复用充分块间才发生一次性换入块内分配用**错位分核**对角线分配线性块号先取 mn 方向再叠加一个随块号递增的相位偏移使同一时刻各核落在 M×N 平面的不同对角线上——避免多核同一拍并发读同一行 A / 同一列 B 的同一地址同地址并发读会串行化等效带宽打折)。冲突度量取
**两个不变量**一切分析的起点
* GM 流量下界 $= S_{in} + S_{out}$输入至少读一遍输出最终至少要写一遍到 GM L2 策略无关
* L2 读入可用空间$L2_{read} = L2 - S_{out}^{resident}$$S_{out}^{resident}$ 为驻留 L2 的输出量)——写出驻留 L2 会压缩读入空间这是写出策略影响读入复用的通道
**先判定写出会不会 Bound**平均写出带宽需求
$$
transConflict = \max\big(\lceil C / mCnt \rceil,\; \lceil C / nCnt \rceil\big)
BW_{out} = \frac{S_{out}}{T_{MMAD}} = \frac{B \cdot MN \cdot outB}{2BMNK\,/\,(C \cdot Q_{16})} = \frac{C \cdot Q_{16} \cdot outB}{2K}
$$
即同一时刻并发核访问同一 A/B 块的最大冲突数要求不超过阈值经验值 6切分方案中优先选尾波不满载占比小拖尾 < 一半遍历大方向由 calOrder 决定0=M 优先1=N 优先按形状选共享矩阵更能驻留 L2 的方向
只与 KoutB 有关K 越小单位时间输出越密)。BF16 输出C·Q₁₆=432 TFLOPSK=512 844 GB/sK=256 1.69 TB/s已超 GM 总线——此时**任何策略都写出 Bound**L2 缓冲只能削峰fixpipe 5.2TB/s L2 吸收突发平均速率仍受总线限制应预期 Fixpipe 成为 $T_{total}$ max
**分场景决策**
**场景 A$S_{in} + S_{out} \le L2$(全驻留)**输入读一遍$r_{in}=1$输出驻留 L2dirty异步回写 GM——写出走 5.2TB/s L2 写口不与读争也削平了 GM 写突发无需切分
**场景 B$S_{in} \le L2$ 但 $S_{in} + S_{out} > L2$(输入能驻留,加上输出超了)**。**输入驻留输出直写 GM**fixpipe L0CGM不占 L2保住 $r_{in}=1$校验总线$(S_{in} + S_{out})/T_{MMAD} \le W_{GM}$。B=8、M=N=4096、K=512、BF16——$S_{in}$=64MB L2$S_{out}$=256MB 直写 GMT_MMAD318µs总流量速率 (64+256)MB/318µs 1.06TB/s < 1.6TB/s ✓。
**场景 C$S_{in} > L2$(输入本身超)**必须 L2 切分输出直写 GM 以最大化 $L2_{read}$切分数满足
$$
mL2TileNum \times nL2TileNum \;\ge\; \frac{S_{in}}{L2_{read}}
$$
每块输入工作集 $L2_{read}$逐块计算——块内滑窗复用充分块间只发生一次性换入块内分配用**错位分核**对角线分配线性块号先取 mn 方向叠加随块号递增的相位偏移使同一时刻各核落在 M×N 平面的不同对角线上——避免多核同一拍并发读同一行 A / 同一列 B 的同一地址同地址并发读会串行化等效带宽打折)。冲突度量与优选规则
$$
transConflict = \max\big(\lceil C / mCnt \rceil,\; \lceil C / nCnt \rceil\big) \le 6
$$
即同一时刻并发核访问同一 A/B 块的最大冲突数不超过阈值经验值 6切分方案中优先选尾波不满载占比小拖尾 < 一半遍历大方向由 calOrder 决定0=M 优先1=N 优先按形状选共享矩阵更能驻留 L2 的方向B=64、M=N=2048、K=1024、BF16——$S_{in}$=512MB > L2输出直写$L2_{read}$=128MB切 3×2=6 块(每块输入约 89MB ≤ 128MB总流量 1GBT_MMAD≈1.27ms,速率 844GB/s < 1.6TB/s ✓。
补充若输出会被后续算子立即消费融合场景输出驻留 L2 让下游读命中场景 B/C 的策略反过来本文按单算子边界分析
**4、核内 tiling**$M^t N^t \cdot 4\text{B} \cdot DB \le L0C$$M^t K^t \cdot \text{dtype} \cdot 2 \le L0A$、$K^t N^t \cdot \text{dtype} \cdot 2 \le L0B$内轴按 dValue 256B/512B 对齐L1 按容量开双缓冲余量充足开 4 buffer