v0.94: ASW_Basic Step0修正——SingleCoreM/N不受L0约束,由GM→L1效率+L2复用决定

This commit is contained in:
2026-08-26 06:50:57 +00:00
parent 95861e026c
commit 66e50d2e7e

View File

@@ -405,37 +405,42 @@ max 取更严格的 8192。修正后的归约阈值θ_c≈12grid_K=32 时
### 实现方案
**Step 0singleCoreM / singleCoreN 的确定**(每核输出基本块尺寸)
**Step 0SingleCoreM / SingleCoreN 的确定**(每核输出 tile 尺寸)
singleCoreM × singleCoreN 是 ASW_Basic 的基石参数——它决定了每核每次计算的输出 tile 大小,进而决定 mCnt/nCnt、swizzle 窗口、L2 执行组等所有后续参数。确定逻辑按约束链推导
SingleCoreM × SingleCoreN 是每核每次处理的输出区域。**它不受 L0 容量直接约束**——L0 容量约束的是 BaseM/BaseN/BaseKL0 级 tile见 Step 5SingleCoreM/N 在 BaseM/N 之上,一个 [SingleCoreM, SingleCoreN] tile 内部由多个 [BaseM, BaseN] L0 tile 组成。SingleCoreM/N 的核心影响是 **GM→L1 搬移效率和 L2 重复读率**
*约束 1——L0C 容量*(输出 tile 必须放得下 L0C 双缓冲):
- SingleCoreM/N 越大 → 每次 GM→L1 搬移的数据量越大dValue 越有保障,搬移效率越高;同时 L2 中同一份 A 行带/B 列带被更多核复用,重复读率越低
- SingleCoreM/N 越小 → 总块数 mCnt×nCnt 越多核间并行度越高但单次搬移效率降低L2 重复读率升高
*约束链*
**约束 1——并行度下限**:总块数须填满 C 核。
$$
\text{singleCoreM} \times \text{singleCoreN} \times 4\text{B} \times 2 \le L0C \Rightarrow \text{singleCoreM} \times \text{singleCoreN} \le 32768 \text{ 元素}
mCnt \times nCnt \ge \Big\lceil \frac{C}{B} \Big\rceil \Rightarrow \frac{M}{\text{singleCoreM}} \times \frac{N}{\text{singleCoreN}} \ge \Big\lceil \frac{C}{B} \Big\rceil
$$
*约束 2——L0A/L0B 容量*输入 tile 决定 baseK 上限
$$
baseK \le \min\Big(\frac{L0A}{2 \cdot \text{singleCoreM} \cdot \text{dtype}},\; \frac{L0B}{2 \cdot \text{singleCoreN} \cdot \text{dtype}}\Big)
$$
*约束 3——dValue*$baseK \cdot \text{dtype} \ge 256\text{B}$BF16 为 128 元素)。
*约束 4——L1 容量*(双缓冲下驻留输入):
**约束 2——L1 容量**双缓冲下驻留当前 tile 的输入
$$
2 \cdot (\text{singleCoreM} + \text{singleCoreN}) \cdot k_{L1} \cdot \text{dtype} \le L1
$$
*约束 5——搬移效率*$\text{singleCoreM} \cdot K \cdot \text{dtype} \ge min\_TileSize$ 且 $K \cdot \text{singleCoreN} \cdot \text{dtype} \ge min\_TileSize$。
其中 $k_{L1}$ 是 GM→L1 的 K 向粒度,须满足 dValue$k_{L1} \cdot \text{dtype} \ge 256\text{B}$。
*选取策略*:在约束 1 的上界32768 元素singleCoreM/singleCoreN 的长宽比应**跟随 M/N 的长宽比**——$\text{singleCoreM}/\text{singleCoreN} \approx M/N$,使 GM 访问的空间局部性最优(减少跨行/跨列的 strided 访问)。同时对齐到 16 的倍数Cube 基本块粒度)。
**约束 3——搬移效率**:单次 GM→L1 搬移量须达到 min_TileSize
*例*M=N=2048方形 → singleCoreM=singleCoreN=$\lfloor\sqrt{32768}\rfloor_{16}$=176。约束 2$baseK \le 16384/176 = 93$ → 取 8016 对齐)。约束 3$80 \times 2 = 160\text{B} \ge 128\text{B}$ ✓。
$$
\text{singleCoreM} \cdot k_{L1} \cdot \text{dtype} \ge min\_TileSize,\qquad k_{L1} \cdot \text{singleCoreN} \cdot \text{dtype} \ge min\_TileSize
$$
*例*M=4096、N=512长条 → singleCoreM=256、singleCoreN=128$256 \times 128 = 32768$ 恰好满载 L0C/2。约束 2$baseK \le \min(16384/256, 16384/128) = \min(64, 128) = 64$。
**选取策略**
在约束 1并行度下限和约束 2/3搬移效率之间取平衡。SingleCoreM/N 的长宽比应**跟随 M/N 的长宽比**$\text{singleCoreM}/\text{singleCoreN} \approx M/N$),使 GM 访问的空间局部性最优。对齐到 16 的倍数Cube 基本块粒度)。
*例*B=8、M=N=2048、K=1024、BF16$\lceil C/B \rceil = 4$,需 $mCnt \times nCnt \ge 4$。取 $mCnt = nCnt = 2$ → singleCoreM = singleCoreN = 1024。约束 2$k_{L1} \le 512\text{KB}/(2 \times 2048 \times 2\text{B}) = 64$ 元素 = 128B恰好满足 dValue 下限。约束 3$1024 \times 64 \times 2 = 128\text{KB} \ge 16\text{KB}$ ✓。
*例*B=2、M=N=4096、K=512、BF16$\lceil C/B \rceil = 16$,需 $mCnt \times nCnt \ge 16$。取 $mCnt = nCnt = 4$ → singleCoreM = singleCoreN = 1024。$k_{L1}$ 同上 = 64 元素。
**Step 1mCnt / nCnt 与核间分配**
@@ -445,42 +450,6 @@ $$
总输出块数 = $B \times mCnt \times nCnt$,按 B→M→N 优先级分配到 C 核。
**核间组织**:先按 B/M/N 切出输出块,剩余核预算折成 K 向份数:
$$
blocksPerBatch = \Big\lfloor \frac{C}{B} \Big\rfloor,\qquad
grid_K = \frac{blocksPerBatch}{mCnt \cdot nCnt}
$$
mCnt、nCnt 收拢为 blocksPerBatch 的因子(避免碎核尾块);由条件 1 知 $mCnt \cdot nCnt \le blocksPerBatch/2$,故 $grid_K \ge 2$。归约组内核 c 负责 K 段 $[cK/grid_K,\; (c{+}1)K/grid_K)$。
**核内流水**:对自己的 K 段做标准分块流水MTE2→L1→L0→mmad段内多轮在 L0C 原地累加;段完部分和经 Fixpipe 写出。
**归约**
* **workspace + AIV 归约(确定性)**:部分和写 workspace每核 256×256×4B另加 20MB 核间通信区),**workspace 优先驻留 L2**——归约读写走 5.2TB/s 的 L2 口而非 GMAIV 从 L2 读回各段部分和、在 UB 内求和后写回(数据流 GM/L2→UB→AIV→UB→L2/GMAIC:AIV=1:2
* **AtomicAdd非确定性**:部分和直接原子累加到输出 GM省一遍读回确定性等级 >1 禁用。
**参数搜索**$grid_K$ 从 2 起按 2 的幂递增,取同时满足条件 2/3 的最小值;都不满足则退为降核 ASW_Basic。
---
## 八、ASW_Basic 分支
### 进入分支条件(汇总)
1. $P = \dfrac{B \cdot MN \cdot 4\text{B}}{L0C} \ge C$
2. 无 batch 结构限制BatchA=BatchB、交叉广播均可典型进入路径$B < C$ B 买不满核 $B \ge C$ IterBatch/MergeBatch 条件不满足时的兜底
3. **降核模式**$P < C$ 且不满足 StreamK 进入条件 只用 $\lceil P \rceil$ 个核其余核闲置
### 逐条解释
1. **并行度补齐** L0C 满载为基本块粒度B×M×N 能切出至少 C 个独立输出块则切 M/N或混合切并行度够用 M/N 的固有代价是共享矩阵被多核重复读但共享部分驻留 128MB L2 时重复读以 5.2TB/s 命中 L2 而非 1.6TB/s GM代价大部分被吸收
2. **兜底性质**ASW_Basic 是实践中最常命中的分支——B 可大可小可等 1交叉广播也由此承接对广播侧做 L1/L2 驻留共享关系与切 M/N 同构)。
3. **降核模式**P < C K 也不够格走 StreamK 并行度凑不满核此时与其强行把 M/N 切得更碎tile 跌破 min_TileSizedValue 跌破 128B搬移效率崩塌反而更慢不如**只用 P 个核**、每核承担一个完整输出块L0C 满载粒度其余核闲置这类 case 的时延绝对值小继续切分引入的调度与搬移效率损失大于并行收益——降核是理性选择而非偷懒
### 实现方案
**Step 2核间切分维度选择按共享代价从低到高**:切 B零共享先试→ 切 M右矩阵 $KN\cdot\text{dtype} \le L2$ 则驻留 L2→ 切 N对称→ 混合切(靠 swizzle + L2 切分管理)→ 降核(见 Step 7
**Step 3swizzle——ASW 滑窗蛇形**
@@ -617,11 +586,11 @@ $$
补充若输出会被后续算子立即消费融合场景输出驻留 L2 让下游读命中场景 B/C 的策略反过来本文按单算子边界分析
**Step 5核内 tiling**$\text{singleCoreM} \times \text{singleCoreN} \times 4\text{B} \times DB \le L0C$$\text{singleCoreM} \times k_{L0} \times \text{dtype} \times 2 \le L0A$、$k_{L0} \times \text{singleCoreN} \times \text{dtype} \times 2 \le L0B$内轴按 dValue 256B/512B 对齐L1 按容量开双缓冲余量充足开 4 buffer
**Step 5核内 tiling**BaseM/BaseN/BaseK——L0 tile L0 容量直接约束$\text{BaseM} \times \text{BaseN} \times 4\text{B} \times DB \le L0C$$\text{BaseM} \times k_{L0} \times \text{dtype} \times 2 \le L0A$、$k_{L0} \times \text{BaseN} \times \text{dtype} \times 2 \le L0B$内轴按 dValue 256B/512B 对齐SingleCoreM/N 内部按 BaseM/BaseN 进一步切分为 L0 tile 逐个计算L1 按容量开双缓冲余量充足开 4 buffer
**Step 6内部特化参数极限不是独立分支**单边无 batch 且该侧矩阵小$M \le 256$、$MK\cdot\text{dtype}\cdot 2 \le L1$、对侧每核循环 4 时小侧整个常驻 L1只搬一次L1 全载)。
**Step 7降核模式实现**tiling `usedCoreNum = ⌈P⌉`不强制 C基本块 L0C 容量内取最大$M^t N^t \cdot 4\text{B} \le L0C$每核按标准核内流水L1L0CubeL0CFixpipe处理自己的输出块核间无共享无依赖无需 swizzle L2 切分降核后 GM 并发搬移核数若 < minCoreNum带宽利用率上限被压低——这正是降核区 case 时延的瓶颈所在也是"时延绝对值小不再继续优化"的定量注脚
**Step 7降核模式实现**tiling `usedCoreNum = ⌈P⌉`不强制 CSingleCoreM/N L0C 容量内取最大$\text{singleCoreM} \times \text{singleCoreN} \times 4\text{B} \le L0C$每核按标准核内流水L1L0CubeL0CFixpipe处理自己的输出块核间无共享无依赖无需 swizzle L2 切分降核后 GM 并发搬移核数若 < minCoreNum带宽利用率上限被压低——这正是降核区 case 时延的瓶颈所在也是"时延绝对值小不再继续优化"的定量注脚
---