修正 StreamK 进入条件:P<C → P<C/2(grid_K≥2 需 P×2≤C)

This commit is contained in:
2026-08-23 10:20:32 +00:00
parent cf84cf76c8
commit 0d1cc01fcc

View File

@@ -223,14 +223,14 @@ $$</div>
<h2>七、StreamK 分支</h2>
<h3>进入分支条件(汇总)</h3>
<ol class="tight">
<li>$P = \dfrac{B \cdot MN \cdot 4\text{B}}{L0C} < C$</li>
<li>$P = \dfrac{B \cdot MN \cdot 4\text{B}}{L0C} < \dfrac{C}{2}$</li>
<li>$\dfrac{K}{grid_K} \ge \dfrac{256\text{B}}{\text{dtype}}$</li>
<li>$K \ge grid_K^{\,2} \cdot \theta$,其中 $\theta \approx 1.1\times10^{2}$(部分和驻留 L2、AIV 归约的方案;部分和落 GM 时 $\theta \approx 1.7\times10^{3}$</li>
<li>工程约束:确定性等级 ≤ 1核间归约顺序不定ND 格式</li>
</ol>
<h3>逐条解释</h3>
<ol class="tight">
<li><b>并行缺口</b>P 以"L0C 满载的输出基本块"为粒度估计不切 K 的最大并行度——基本块按 L0C 最大利用率取($M^t N^t \cdot 4\text{B} = L0C$),免去预先估计 M/N 具体切分。P &lt; C 意味着即使按最大块切B/M/N 三维也填不满 32 核,唯一剩余的并行维度是 K</li>
<li><b>并行缺口</b>P 以"L0C 满载的输出基本块"为粒度估计不切 K 的最大并行度——基本块按 L0C 最大利用率取($M^t N^t \cdot 4\text{B} = L0C$),免去预先估计 M/N 具体切分。<b>阈值取 C/2 而非 C</b>StreamK 的定义就是 grid_K ≥ 2至少 2 路切 K且同一 batch 内所有输出块共享同一个 grid_Kgrid_K=2 时每块需要 2 个核,总核数需求 = P × 2 ≤ C即 P ≤ C/2。若 C/2 ≤ P &lt; C切 2 路就超核数2P &gt; C不切又浪费一半核——这个区间由降核 ASW_Basic 承接更合适。P &lt; C/2 才意味着不切 K 时连一半核都填不满K 是唯一剩余的并行维度。</li>
<li><b>单核 K 段下限</b>:每核 K 段内轴连续长度不小于 dValue 推荐值 256BBF16 为 128 元素),保证段内搬移效率不崩。</li>
<li><b>归约代价可接受</b>。先按实现流程看清 $T_{Reduce}$ 的构成。StreamK 每个输出块的执行分三步:</li>
</ol>
@@ -370,11 +370,11 @@ $$</div>
<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&lt;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>降核 ASW_Basic</td><td>3190</td><td>15.4%</td><td>2 ~ 128</td><td>P&lt;C 且 K 不满足 StreamK 阈值 → 只用 ⌈P⌉ 核(定义与实现见 §八.6</td></tr>
<tr><td>降核 ASW_Basic</td><td>3288</td><td>15.9%</td><td>2 ~ 128</td><td>P&lt;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>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>StreamK</td><td>726</td><td>3.5%</td><td>2 ~ 128</td><td>P&lt;C 且 K≥8192</td></tr></table>
<tr><td>StreamK</td><td>628</td><td>3.0%</td><td>2 ~ 128</td><td>P&lt;C/2 且 K≥8192</td></tr></table>
<h3>IterBatch 四形态命中分布</h3>
<table><tr><th>形态</th><th>命中数</th><th>说明</th></tr>
<tr><td>b) 双 batch 乒乓</td><td>1787</td><td>最多B 大且单 batch 较小</td></tr>
@@ -399,7 +399,7 @@ $$</div>
<li><b>六个分支全部有真实 case 命中</b>无空分支覆盖矩阵无空洞P&lt;C 且 K 小的残余由降核 ASW_Basic 兜底——此时时延绝对值小,调度开销主导,分支选择不敏感);</li>
<li>**MergeBatch 的区域由条件 2$MN \le 8192$)与条件 3min_DatamountPerCore夹出**:小 M×N 且单核搬移量足够的大 batch case两个条件缺一不可。典型分界对照B=128/M=N=64 时 K=256 → 单核搬移 256KB 不达标落 IterBatchK=512 → 512KB 达标进 MergeBatch</li>
<li><b>IterBatch 与 ASW_Basic 的分界就是 L1 四形态是否满足</b>:单 batch 输入 $(MK+KN)\cdot\text{dtype}$ 相对 L1 的比例决定归属——这正是"核内零重复读"原则的定量体现;</li>
<li><b>StreamK 的区域为 P&lt;C 且 K≥8192</b>B 小、M/N 小、K 大的"细长" case,与理论预期一致</li>
<li><b>StreamK 的区域为 P&lt;C/2 且 K≥8192</b>B 小、M/N 小、K 大的"细长" caseC/2 ≤ P &lt; C 且 K 大的 98 个 case 由降核 ASW_Basic 承接(切 2 路 K 会超核数,不切又不满核,不如直接用 ⌈P⌉ 核)</li>
<li><b>降核 ASW_Basic 是 P&lt;C 且 K 小区域的理性归宿</b>B∈[2,128],占 15.4%):并行度凑不满、切 K 又不划算时,只用 ⌈P⌉ 个核、每核一个 L0C 满载输出块比强行碎切tile 跌破搬移效率下限)更快。</li>
</ol>
</div>