v0.6 修订:补 MergeBatch 边界 case、降核模式定义与实现
This commit is contained in:
@@ -267,14 +267,16 @@ $$</div>
|
|||||||
<ol class="tight">
|
<ol class="tight">
|
||||||
<li>$P = \dfrac{B \cdot MN \cdot 4\text{B}}{L0C} \ge C$</li>
|
<li>$P = \dfrac{B \cdot MN \cdot 4\text{B}}{L0C} \ge C$</li>
|
||||||
<li>无 batch 结构限制(BatchA=BatchB、交叉广播均可);典型进入路径:$B < C$(切 B 买不满核),或 $B \ge C$ 但 IterBatch/MergeBatch 条件不满足时的兜底</li>
|
<li>无 batch 结构限制(BatchA=BatchB、交叉广播均可);典型进入路径:$B < C$(切 B 买不满核),或 $B \ge C$ 但 IterBatch/MergeBatch 条件不满足时的兜底</li>
|
||||||
|
<li><b>降核模式</b>:$P < C$ 且不满足 StreamK 进入条件 → 只用 $\lceil P \rceil$ 个核,其余核闲置</li>
|
||||||
</ol>
|
</ol>
|
||||||
<h3>逐条解释</h3>
|
<h3>逐条解释</h3>
|
||||||
<ol class="tight">
|
<ol class="tight">
|
||||||
<li><b>并行度补齐</b>:以 L0C 满载为基本块粒度,B×M×N 能切出至少 C 个独立输出块,则切 M/N(或混合切)并行度够用。切 M/N 的固有代价是共享矩阵被多核重复读,但共享部分驻留 128MB L2 时重复读以 5.2TB/s 命中 L2 而非 1.6TB/s 的 GM,代价大部分被吸收。</li>
|
<li><b>并行度补齐</b>:以 L0C 满载为基本块粒度,B×M×N 能切出至少 C 个独立输出块,则切 M/N(或混合切)并行度够用。切 M/N 的固有代价是共享矩阵被多核重复读,但共享部分驻留 128MB L2 时重复读以 5.2TB/s 命中 L2 而非 1.6TB/s 的 GM,代价大部分被吸收。</li>
|
||||||
<li><b>兜底性质</b>:ASW_Basic 是实践中最常命中的分支——B 可大可小可等 1,交叉广播也由此承接(对广播侧做 L1/L2 驻留,共享关系与切 M/N 同构)。</li>
|
<li><b>兜底性质</b>:ASW_Basic 是实践中最常命中的分支——B 可大可小可等 1,交叉广播也由此承接(对广播侧做 L1/L2 驻留,共享关系与切 M/N 同构)。</li>
|
||||||
|
<li><b>降核模式</b>:P < C 且 K 也不够格走 StreamK 时,并行度凑不满核。此时与其强行把 M/N 切得更碎(tile 跌破 min_TileSize、dValue 跌破 128B,搬移效率崩塌,反而更慢),不如<b>只用 ⌈P⌉ 个核</b>、每核承担一个完整输出块(L0C 满载粒度),其余核闲置。这类 case 的时延绝对值小,继续切分引入的调度与搬移效率损失大于并行收益——降核是理性选择而非偷懒。</li>
|
||||||
</ol>
|
</ol>
|
||||||
<h3>实现方案</h3>
|
<h3>实现方案</h3>
|
||||||
<p><b>1、核间切分维度选择(按共享代价从低到高)</b>:切 B(零共享,先试)→ 切 M(右矩阵 $KN\cdot\text{dtype} \le L2$ 则驻留 L2)→ 切 N(对称)→ 混合切(靠 swizzle + L2 切分管理)→ 降核(P 远小于 C 且 StreamK 也不满足时,宁可部分核闲置)。</p>
|
<p><b>1、核间切分维度选择(按共享代价从低到高)</b>:切 B(零共享,先试)→ 切 M(右矩阵 $KN\cdot\text{dtype} \le L2$ 则驻留 L2)→ 切 N(对称)→ 混合切(靠 swizzle + L2 切分管理)→ 降核(见第 6 条)。</p>
|
||||||
<p><b>2、swizzle:ASW 滑窗蛇形</b>。M 向按窗口 W 分组,窗内 N 向蛇形遍历:</p>
|
<p><b>2、swizzle:ASW 滑窗蛇形</b>。M 向按窗口 W 分组,窗内 N 向蛇形遍历:</p>
|
||||||
<div class="math">$$
|
<div class="math">$$
|
||||||
W = \max\{\,d \mid d \mid C,\; d \le \lfloor\sqrt{C}\rfloor\,\} \quad (C{=}32 \Rightarrow W{=}4)
|
W = \max\{\,d \mid d \mid C,\; d \le \lfloor\sqrt{C}\rfloor\,\} \quad (C{=}32 \Rightarrow W{=}4)
|
||||||
@@ -283,6 +285,7 @@ $$</div>
|
|||||||
<p><b>3、L2 切分</b>:工作集超 128MB 时按 mL2TileNum×nL2TileNum 切块,块内错位分核(对角线分配),避免多核同时抢同一地址的读读冲突,优先选拖尾小的方案。</p>
|
<p><b>3、L2 切分</b>:工作集超 128MB 时按 mL2TileNum×nL2TileNum 切块,块内错位分核(对角线分配),避免多核同时抢同一地址的读读冲突,优先选拖尾小的方案。</p>
|
||||||
<p><b>4、核内 tiling</b>:$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。</p>
|
<p><b>4、核内 tiling</b>:$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。</p>
|
||||||
<p><b>5、内部特化(参数极限,不是独立分支)</b>:单边无 batch 且该侧矩阵小($M \le 256$、$MK\cdot\text{dtype}\cdot 2 \le L1$、对侧每核循环 ≥4 轮)时小侧整个常驻 L1、只搬一次(L1 全载)。</p>
|
<p><b>5、内部特化(参数极限,不是独立分支)</b>:单边无 batch 且该侧矩阵小($M \le 256$、$MK\cdot\text{dtype}\cdot 2 \le L1$、对侧每核循环 ≥4 轮)时小侧整个常驻 L1、只搬一次(L1 全载)。</p>
|
||||||
|
<p><b>6、降核模式实现</b>:tiling 时 <code>usedCoreNum = ⌈P⌉</code>(不强制 C),基本块在 L0C 容量内取最大($M^t N^t \cdot 4\text{B} \le L0C$),每核按标准核内流水(L1→L0→Cube→L0C→Fixpipe)处理自己的输出块;核间无共享无依赖,无需 swizzle 与 L2 切分。降核后 GM 并发搬移核数若 < minCoreNum,带宽利用率上限被压低——这正是降核区 case 时延的瓶颈所在,也是"时延绝对值小、不再继续优化"的定量注脚。</p>
|
||||||
<hr>
|
<hr>
|
||||||
<h2>九、特殊分支</h2>
|
<h2>九、特殊分支</h2>
|
||||||
<ul class="tight">
|
<ul class="tight">
|
||||||
@@ -296,7 +299,7 @@ $$</div>
|
|||||||
<table><tr><th>分支</th><th>case 数</th><th>占比</th><th>B 范围</th><th>区域特征</th></tr>
|
<table><tr><th>分支</th><th>case 数</th><th>占比</th><th>B 范围</th><th>区域特征</th></tr>
|
||||||
<tr><td>ASW_Basic</td><td>7290</td><td>35.2%</td><td>2 ~ 2048</td><td>通用:B<C 且 P≥C;或 B≥C 但 L1 五形态不满足(M/N 大)</td></tr>
|
<tr><td>ASW_Basic</td><td>7290</td><td>35.2%</td><td>2 ~ 2048</td><td>通用:B<C 且 P≥C;或 B≥C 但 L1 五形态不满足(M/N 大)</td></tr>
|
||||||
<tr><td>IterBatch</td><td>4544</td><td>21.9%</td><td>32 ~ 2048</td><td>B≥C、负载均衡、L1 五形态之一满足</td></tr>
|
<tr><td>IterBatch</td><td>4544</td><td>21.9%</td><td>32 ~ 2048</td><td>B≥C、负载均衡、L1 五形态之一满足</td></tr>
|
||||||
<tr><td>降核 ASW_Basic</td><td>3190</td><td>15.4%</td><td>2 ~ 128</td><td>P<C 且 K 不满足 StreamK 阈值(小 case,时延绝对值小)</td></tr>
|
<tr><td>降核 ASW_Basic</td><td>3190</td><td>15.4%</td><td>2 ~ 128</td><td>P<C 且 K 不满足 StreamK 阈值 → 只用 ⌈P⌉ 核(定义与实现见 §八.6)</td></tr>
|
||||||
<tr><td>特殊分支</td><td>1728</td><td>8.3%</td><td>任意</td><td>K=0 / K=1</td></tr>
|
<tr><td>特殊分支</td><td>1728</td><td>8.3%</td><td>任意</td><td>K=0 / K=1</td></tr>
|
||||||
<tr><td>MergeBatch</td><td>1674</td><td>8.1%</td><td>128 ~ 2048</td><td>$b_{core}\ge 4$ 且 $MN \le L0C/(2b_0^2\cdot4\text{B})=8192$ 等五条全过</td></tr>
|
<tr><td>MergeBatch</td><td>1674</td><td>8.1%</td><td>128 ~ 2048</td><td>$b_{core}\ge 4$ 且 $MN \le L0C/(2b_0^2\cdot4\text{B})=8192$ 等五条全过</td></tr>
|
||||||
<tr><td>转Matmul</td><td>1584</td><td>7.6%</td><td>B=1</td><td>单边 batch=1</td></tr>
|
<tr><td>转Matmul</td><td>1584</td><td>7.6%</td><td>B=1</td><td>单边 batch=1</td></tr>
|
||||||
@@ -311,20 +314,23 @@ $$</div>
|
|||||||
<h3>典型边界 case</h3>
|
<h3>典型边界 case</h3>
|
||||||
<table><tr><th>B</th><th>M</th><th>N</th><th>K</th><th>分支</th><th>说明</th></tr>
|
<table><tr><th>B</th><th>M</th><th>N</th><th>K</th><th>分支</th><th>说明</th></tr>
|
||||||
<tr><td>1</td><td>2048</td><td>2048</td><td>2048</td><td>转Matmul</td><td>单 batch 纯 Matmul</td></tr>
|
<tr><td>1</td><td>2048</td><td>2048</td><td>2048</td><td>转Matmul</td><td>单 batch 纯 Matmul</td></tr>
|
||||||
<tr><td>128</td><td>32</td><td>128</td><td>64</td><td>IterBatch</td><td>MergeBatch 条件 3 不满足(单核搬移仅 80KB < 480KB)</td></tr>
|
<tr><td>128</td><td>64</td><td>64</td><td>512</td><td><b>MergeBatch</b></td><td>五条全过:$b_{core}$=4,MN=4096≤8192,单核搬移 512KB≥480KB,AI=64<304</td></tr>
|
||||||
|
<tr><td>128</td><td>64</td><td>64</td><td>256</td><td>IterBatch</td><td>与上行仅 K 不同:单核搬移 256KB < 480KB,条件 3 不满足 → 落 IterBatch(形态 b)</td></tr>
|
||||||
|
<tr><td>512</td><td>128</td><td>128</td><td>128</td><td>IterBatch</td><td>MN=16384 > 8192,MergeBatch 条件 2 不满足 → 落 IterBatch</td></tr>
|
||||||
<tr><td>32</td><td>4096</td><td>4096</td><td>4096</td><td>ASW_Basic</td><td>L1 五形态均不满足(M/N 太大),切 M/N</td></tr>
|
<tr><td>32</td><td>4096</td><td>4096</td><td>4096</td><td>ASW_Basic</td><td>L1 五形态均不满足(M/N 太大),切 M/N</td></tr>
|
||||||
<tr><td>2</td><td>8192</td><td>8192</td><td>1024</td><td>ASW_Basic</td><td>B<C,P=2048≥32</td></tr>
|
<tr><td>2</td><td>8192</td><td>8192</td><td>1024</td><td>ASW_Basic</td><td>B<C,P=2048 ≥ 32</td></tr>
|
||||||
<tr><td>16</td><td>256</td><td>256</td><td>128</td><td>降核 ASW</td><td>P=4<32,K=128 不满足 StreamK</td></tr>
|
<tr><td>16</td><td>256</td><td>256</td><td>128</td><td>降核 ASW</td><td>P=4 < 32 且 K=128 不满足 StreamK → 用 4 核,其余闲置</td></tr>
|
||||||
<tr><td>4</td><td>128</td><td>128</td><td>10240</td><td>StreamK</td><td>P=0.25<32,K≥8192</td></tr>
|
<tr><td>4</td><td>128</td><td>128</td><td>10240</td><td>StreamK</td><td>P=0.25 < 32,K≥8192</td></tr>
|
||||||
<tr><td>2048</td><td>1024</td><td>1024</td><td>512</td><td>IterBatch</td><td>大 batch,形态 b</td></tr>
|
<tr><td>2048</td><td>1024</td><td>1024</td><td>512</td><td>IterBatch</td><td>大 batch,形态 b</td></tr>
|
||||||
<tr><td>8</td><td>512</td><td>512</td><td>512</td><td>ASW_Basic</td><td>B<C,P=32 恰好满核</td></tr>
|
<tr><td>8</td><td>512</td><td>512</td><td>512</td><td>ASW_Basic</td><td>B<C,P=32 恰好满核</td></tr>
|
||||||
<tr><td>64</td><td>64</td><td>64</td><td>8192</td><td>IterBatch</td><td>小 M×N 但 K 大,形态 e</td></tr></table>
|
<tr><td>64</td><td>64</td><td>64</td><td>8192</td><td>IterBatch</td><td>小 M×N 但 K 大,形态 e</td></tr></table>
|
||||||
<h3>遍历结论</h3>
|
<h3>遍历结论</h3>
|
||||||
<ol class="tight">
|
<ol class="tight">
|
||||||
<li><b>六个分支全部有真实 case 命中</b>,无空分支;覆盖矩阵无空洞(P<C 且 K 小的残余由降核 ASW_Basic 兜底——此时时延绝对值小,调度开销主导,分支选择不敏感);</li>
|
<li><b>六个分支全部有真实 case 命中</b>,无空分支;覆盖矩阵无空洞(P<C 且 K 小的残余由降核 ASW_Basic 兜底——此时时延绝对值小,调度开销主导,分支选择不敏感);</li>
|
||||||
<li>**MergeBatch 的区域由条件 2($MN \le 8192$)与条件 3(480KB)夹出**:小 M×N 且单核搬移量足够的大 batch case,两个条件缺一不可(如 B=128/M=32/N=128/K=64 恰因条件 3 落入 IterBatch);</li>
|
<li>**MergeBatch 的区域由条件 2($MN \le 8192$)与条件 3(min_DatamountPerCore)夹出**:小 M×N 且单核搬移量足够的大 batch case,两个条件缺一不可。典型分界对照:B=128/M=N=64 时 K=256 → 单核搬移 256KB 不达标落 IterBatch,K=512 → 512KB 达标进 MergeBatch;</li>
|
||||||
<li><b>IterBatch 与 ASW_Basic 的分界就是 L1 五形态是否满足</b>:单 batch 输入 $(MK+KN)\cdot\text{dtype}$ 相对 L1 的比例决定归属——这正是"核内零重复读"原则的定量体现;</li>
|
<li><b>IterBatch 与 ASW_Basic 的分界就是 L1 五形态是否满足</b>:单 batch 输入 $(MK+KN)\cdot\text{dtype}$ 相对 L1 的比例决定归属——这正是"核内零重复读"原则的定量体现;</li>
|
||||||
<li><b>StreamK 的区域为 P<C 且 K≥8192</b>:B 小、M/N 小、K 大的"细长" case,与理论预期一致。</li>
|
<li><b>StreamK 的区域为 P<C 且 K≥8192</b>:B 小、M/N 小、K 大的"细长" case,与理论预期一致;</li>
|
||||||
|
<li><b>降核 ASW_Basic 是 P<C 且 K 小区域的理性归宿</b>(B∈[2,128],占 15.4%):并行度凑不满、切 K 又不划算时,只用 ⌈P⌉ 个核、每核一个 L0C 满载输出块,比强行碎切(tile 跌破搬移效率下限)更快。</li>
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
Reference in New Issue
Block a user