v0.6 修订:ASW swizzle 与 L2 切分补充原理推导与实例

This commit is contained in:
2026-08-22 09:45:39 +00:00
parent 46c5fd47b0
commit 7a670e193d

View File

@@ -312,15 +312,53 @@ mCnt、nCnt 收拢为 blocksPerBatch 的因子(避免碎核尾块);由条
**1、核间切分维度选择按共享代价从低到高** B零共享先试)→ M右矩阵 $KN\cdot\text{dtype} \le L2$ 则驻留 L2)→ N对称)→ 混合切 swizzle + L2 切分管理)→ 降核见第 6 )。 **1、核间切分维度选择按共享代价从低到高** B零共享先试)→ M右矩阵 $KN\cdot\text{dtype} \le L2$ 则驻留 L2)→ N对称)→ 混合切 swizzle + L2 切分管理)→ 降核见第 6 )。
**2、swizzleASW 滑窗蛇形**M 向按窗口 W 分组窗内 N 向蛇形遍历 **2、swizzleASW 滑窗蛇形**
**问题**核间切 M/N 同一时刻 C 个核各算一个输出块它们所需的 A 行块与 B 列块集合就是当前"活跃工作集"。若按行优先顺序朴素分配一波 C 个块横跨的 A B 列很宽活跃工作集超过 L2 就回 GM 1.6TB/s重复读代价真实发生。**swizzle 要做的就是编排输出块的执行顺序把每一波核的活跃工作集压到最小。**
**做法** M 向每 W 个基本块划为一个"窗口"遍历顺序为"窗口内先扫 M扫满 W 行再进下一列 N一个窗口扫完再进下一个窗口"且奇数窗口行 N 向反向蛇形)。效果有二
* 同一波 C 个核的块集中在同一个窗口内 活跃 A 行块只有 W 活跃 B 列块只有 C/W 条带
* 蛇形反向使相邻窗口行首尾相接——上一窗口末尾的 B 列带与下一窗口开头的 B 列带是同一条跨窗口切换时工作集增量最小
**W 怎么取**一波 C 个块的 L2 足迹约为
$$ $$
W = \max\{\,d \mid d \mid C,\; d \le \lfloor\sqrt{C}\rfloor\,\} \quad (C{=}32 \Rightarrow W{=}4) footprint \approx \big(W \cdot M^t K + \tfrac{C}{W} \cdot K N^t\big) \cdot \text{dtype}
$$ $$
同一时刻 C 个核的活跃工作集被压缩到"W A 行块 + 一条 B 列块带"L2 足迹最小 $\lfloor\sqrt C\rfloor$ 的最大因子窗越接近方形两侧足迹之和越小且因子性保证整窗被核数均分边界不碎 由均值不等式$W + C/W$ $W = \sqrt{C}$ 处取最小——口越接近"方形"W × C/W 足迹越小同时 W 须整除 C保证每个窗口恰好被整数波核覆盖窗口边界不把波次切合起来即
**3、L2 切分**工作集超 128MB 时按 mL2TileNum×nL2TileNum 切块块内错位分核对角线分配避免多核同时抢同一地址的读读冲突优先选拖尾小的方案 $$
W = \max\{\,d \mid d \mid C,\; d \le \lfloor\sqrt{C}\rfloor\,\}
$$
C=32 $\sqrt{32} \approx 5.66$因子 {1,2,4,8,…} 中不超过它的最大者是 4 W=4。
**实例**C=32W=4M̃=8Ñ=8数字为块的全局执行顺序一波 32
```
窗口0N 正向) 窗口1N 蛇形反向)
ν0 ν1 ν2 … ν7 ν0 ν1 … ν7
μ0 0 4 8 … 28 μ4 60 56 … 32
μ1 1 5 9 … 29 μ5 61 57 … 33
μ2 2 6 10 … 30 μ6 62 58 … 34
μ3 3 7 11 … 31 μ7 63 59 … 35
```
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、L2 切分(工作集超 L2 时)**
**问题**滑窗压缩的是"同一波"的足迹若整个工作集全部 A + 全部 B 跨所有窗口超过 128MB L2跨波次的复用仍会落空——上一波窗口的 A 行早被挤出 L2下一波又得回 GM
**做法** M×N 平面按 mL2TileNum × nL2TileNum 切成若干"L2 "每块的工作集控制在 L2 容量内逐块计算——块内滑窗复用充分块间才发生一次性换入块内分配用**错位分核**对角线分配线性块号先取 mn 方向再叠加一个随块号递增的相位偏移使同一时刻各核落在 M×N 平面的不同对角线上——避免多核同一拍并发读同一行 A / 同一列 B 的同一地址同地址并发读会串行化等效带宽打折)。冲突度量取
$$
transConflict = \max\big(\lceil C / mCnt \rceil,\; \lceil C / nCnt \rceil\big)
$$
即同一时刻并发核访问同一 A/B 块的最大冲突数要求不超过阈值经验值 6切分方案中优先选尾波不满载占比小拖尾 < 一半遍历大方向由 calOrder 决定0=M 优先1=N 优先按形状选共享矩阵更能驻留 L2 的方向
**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 **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