修正 StreamK 进入条件:P<C → P<C/2(grid_K≥2 需 P×2≤C)
This commit is contained in:
@@ -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 < 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_K;grid_K=2 时每块需要 2 个核,总核数需求 = P × 2 ≤ C,即 P ≤ C/2。若 C/2 ≤ P < C,切 2 路就超核数(2P > C),不切又浪费一半核——这个区间由降核 ASW_Basic 承接更合适。P < C/2 才意味着不切 K 时连一半核都填不满,K 是唯一剩余的并行维度。</li>
|
||||
<li><b>单核 K 段下限</b>:每核 K 段内轴连续长度不小于 dValue 推荐值 256B(BF16 为 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<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<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<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<C 且 K≥8192</td></tr></table>
|
||||
<tr><td>StreamK</td><td>628</td><td>3.0%</td><td>2 ~ 128</td><td>P<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<C 且 K 小的残余由降核 ASW_Basic 兜底——此时时延绝对值小,调度开销主导,分支选择不敏感);</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>StreamK 的区域为 P<C 且 K≥8192</b>:B 小、M/N 小、K 大的"细长" case,与理论预期一致;</li>
|
||||
<li><b>StreamK 的区域为 P<C/2 且 K≥8192</b>:B 小、M/N 小、K 大的"细长" case;C/2 ≤ P < C 且 K 大的 98 个 case 由降核 ASW_Basic 承接(切 2 路 K 会超核数,不切又不满核,不如直接用 ⌈P⌉ 核);</li>
|
||||
<li><b>降核 ASW_Basic 是 P<C 且 K 小区域的理性归宿</b>(B∈[2,128],占 15.4%):并行度凑不满、切 K 又不划算时,只用 ⌈P⌉ 个核、每核一个 L0C 满载输出块,比强行碎切(tile 跌破搬移效率下限)更快。</li>
|
||||
</ol>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user