33. ASW_Basic tile 选择僵化恒为176: BaseM/N 应用 L0C 单缓冲方形256, SingleCoreM/N 应用 v1.91 §5.2 有界枚举最小搬入 #33

Closed
opened 2026-09-07 07:11:16 +00:00 by admin · 1 comment
Owner

现象 (examples/plans.csv)

cases_demo 所有 ASW_Basic 行的 SingleCoreM/SingleCoreN/BaseM/BaseN 恒为 176(=sqrt(L0C/(2*4B)) 对齐16), 不随 case 形状变化。

根因 (对照 ASW_Basic分支分析_v1.91 §5.1/§5.2 + BMM尾轮处理策略对比分析_v1.5)

  1. BaseM/BaseN 误用双缓冲上限: Step0 用 sqrt(L0C/(2*4B))=181->176 (L0C 双缓冲两份 32768 元素); v1.91 §5.1 明确: 950PR 的 Fixpipe UnitFlag 提供 tile 内 16x16x16 细粒度流水, 取代 tile 间粗粒度双缓冲 -> 默认 UnitFlag 单缓冲, BaseM*BaseN = L0C/4B = 65536 元素, 方形 256x256 (L0A/L0B 同时装满, baseK 加倍); 仅当 M/N < 方形边长时被迫跟随 M/N (BaseM=min(⌊M⌋16...), 另一维 = min(65536/BaseM, N) 向下16对齐)。
  2. SingleCoreM/N 选择引擎错误: _pick_single_core 只枚举 mCnt∈[1, sqrt(P)+2] 的极小范围、按面积取最大, 且 L1 约束项按 k_L1>=256B 过滤后全部落空 -> 恒退回 Base 兜底 (176x176); v1.91 §5.2 要求完整有界枚举: 空间 mCnt<=⌈M/BaseM⌉、nCnt<=⌈N/BaseN⌉ 且 BmCntnCnt>=C, 每个候选 sM=align16(⌈M/mCnt⌉) 且须为 BaseM 整数倍, 约束2 由 L1 容量反推 k_L1, 约束3 (dValue 256B + min_TileSize 16KB, 转置感知) 过滤, 目标为每 batch 总搬入 Kdt(nCntM + mCntN) 最小 (v1.5 修正: 稳态流水下 k_L1 与搬入总量无关, k_L1 只进约束), 并列取 r = BmCntnCnt mod C 最大; P=1 (B>=C) 先试不切分 (tile 跟随 M/N), 失败才强制切分。
  3. L0C 约束校验也要从双缓冲口径改为 ASW 单缓冲 (UnitFlag) 口径。

影响

tile 过度切分 -> mCnt/nCnt 成倍放大 -> L2 共享块重复读流量被放大约 2-3x (如 b128_m8192_n8192_k7168 重复读 1.38TB -> 应显著降低), 搬移时延与瓶颈判定偏离理论最优。

修复

  • asw_basic Step0/Step1/Step6 按 v1.91 §5.1/§5.2 重写 (含 P=1 不切分情形、方形例外、dValue/minTile 转置感知约束、r 并列仲裁);
  • constraints.py: ASW_Basic 的 L0C 口径改单缓冲 (UnitFlag), 降核保持单份, IterBatch/MergeBatch 保持双缓冲;
  • docs/02_分支理论/06_ASW_Basic分支.md 的 Step0/Step1/Step6 与 05 文档同步更新为 v1.91 口径;
  • 回归: v1.91 §5.2 完整实例 (B=8, M=N=2048, K=1024 -> (4,4) 512x512, k_L1=128, r=0); 方形例外 (M=128 -> BaseM=128, BaseN=512); 单缓冲 L0C 256x256 通过约束; 全用例 GM/L2/时延重算 + 压力回归。
## 现象 (examples/plans.csv) cases_demo 所有 ASW_Basic 行的 SingleCoreM/SingleCoreN/BaseM/BaseN 恒为 176(=sqrt(L0C/(2*4B)) 对齐16), 不随 case 形状变化。 ## 根因 (对照 ASW_Basic分支分析_v1.91 §5.1/§5.2 + BMM尾轮处理策略对比分析_v1.5) 1. **BaseM/BaseN 误用双缓冲上限**: Step0 用 `sqrt(L0C/(2*4B))=181->176` (L0C 双缓冲两份 32768 元素); v1.91 §5.1 明确: 950PR 的 Fixpipe UnitFlag 提供 tile 内 16x16x16 细粒度流水, 取代 tile 间粗粒度双缓冲 -> **默认 UnitFlag 单缓冲, BaseM*BaseN = L0C/4B = 65536 元素, 方形 256x256** (L0A/L0B 同时装满, baseK 加倍); 仅当 M/N < 方形边长时被迫跟随 M/N (BaseM=min(⌊M⌋16...), 另一维 = min(65536/BaseM, N) 向下16对齐)。 2. **SingleCoreM/N 选择引擎错误**: _pick_single_core 只枚举 mCnt∈[1, sqrt(P)+2] 的极小范围、按面积取最大, 且 L1 约束项按 k_L1>=256B 过滤后全部落空 -> 恒退回 Base 兜底 (176x176); v1.91 §5.2 要求**完整有界枚举**: 空间 mCnt<=⌈M/BaseM⌉、nCnt<=⌈N/BaseN⌉ 且 B*mCnt*nCnt>=C, 每个候选 sM=align16(⌈M/mCnt⌉) 且须为 BaseM 整数倍, 约束2 由 L1 容量反推 k_L1, 约束3 (dValue 256B + min_TileSize 16KB, 转置感知) 过滤, 目标为**每 batch 总搬入 K*dt*(nCnt*M + mCnt*N) 最小** (v1.5 修正: 稳态流水下 k_L1 与搬入总量无关, k_L1 只进约束), 并列取 r = B*mCnt*nCnt mod C 最大; P=1 (B>=C) 先试不切分 (tile 跟随 M/N), 失败才强制切分。 3. L0C 约束校验也要从双缓冲口径改为 ASW 单缓冲 (UnitFlag) 口径。 ## 影响 tile 过度切分 -> mCnt/nCnt 成倍放大 -> L2 共享块重复读流量被放大约 2-3x (如 b128_m8192_n8192_k7168 重复读 1.38TB -> 应显著降低), 搬移时延与瓶颈判定偏离理论最优。 ## 修复 - asw_basic Step0/Step1/Step6 按 v1.91 §5.1/§5.2 重写 (含 P=1 不切分情形、方形例外、dValue/minTile 转置感知约束、r 并列仲裁); - constraints.py: ASW_Basic 的 L0C 口径改单缓冲 (UnitFlag), 降核保持单份, IterBatch/MergeBatch 保持双缓冲; - docs/02_分支理论/06_ASW_Basic分支.md 的 Step0/Step1/Step6 与 05 文档同步更新为 v1.91 口径; - 回归: v1.91 §5.2 完整实例 (B=8, M=N=2048, K=1024 -> (4,4) 512x512, k_L1=128, r=0); 方形例外 (M=128 -> BaseM=128, BaseN=512); 单缓冲 L0C 256x256 通过约束; 全用例 GM/L2/时延重算 + 压力回归。
admin closed this issue 2026-09-07 07:49:27 +00:00
Author
Owner

修复 commit: 05ca91e

落地 (对照《ASW_Basic分支分析 v1.91》§5.1/§5.2 + 《BMM尾轮处理策略对比分析 v1.5》§2.1):

  1. BaseM/BaseN: UnitFlag 单缓冲方形 256x256 (L0C/4B=65536 元素用满, 替代旧双缓冲 176x176);
    方形优先 (L0A/L0B 同时装满、baseK=64 比跟随 M/N 加倍); M/N < 256 被迫跟随 M/N,
    另一侧按 L0C 余量放大且收敛 L0A/L0B (baseK>=16) 单边上限 (修掉 M=16 时 BaseN=4096 超 L0B 的缺口);
  2. SingleCoreM/N 有界枚举 (替代旧"仅 sqrt(P)+2 范围按面积取最大" —— 其 L1 约束过滤后恒
    退回 Base 兜底, 即用户看到的恒 176 根因): P=1 (B>=C) 先试不切分 (tile 跟随 M/N),
    否则枚举 mCnt<=ceil(M/BaseM) x nCnt<=ceil(N/BaseN) 且 BmCntnCnt>=C; sM/sN 为 Base
    整数倍 (约束4); 约束2 由 L1 双缓冲反推 k_L1; 约束3 dValue>=256B 转置感知 + minTile 16KB;
    目标 = 每 batch 总搬入 Kdt(nCntM + mCntN) 最小 (v1.5 修正口径: 稳态下 k_L1 与搬入总量
    无关, k_L1 只进约束); 并列取 r = BmCntnCnt mod C 最大;
  3. 兜底: 约束4 下无解时放开到 16 对齐网格按硬下限 (dValue>=128B) 再搜; 极端形状
    (如 N=8 int8 大K, B 侧 dValue = sN*dt 物理不可满足) 仍无解时退回 Base tile 并自检标注
    违规 (不再像旧模型那样静默产出伪可行方案);
  4. constraints: ASW 双分支 L0C 口径改 UnitFlag 单缓冲 (factor 1); IterBatch/MergeBatch
    保持双缓冲 (其文档口径本就如此);
  5. docs/02_分支理论/06_ASW_Basic分支.md: Step0/Step1/Step6 重写为 v1.91 口径并标注
    issue#33 更新; docs/05 无涉 (tile 选择不影响 GM/L2 场景口径, 仅 tile 尺寸作为输入)。

验证 (61/61 全过):

  • v1.91 §5.2 完整实例复现: B=8, M=N=2048, K=1024 bf16 -> 512x512 (mCnt=nCnt=4), k_L1=128,
    r=0 (与文档表格逐项一致);
  • 方形例外: M=128 -> BaseM=128, BaseN=512, baseK=32; 默认方形 256x256 且 L0C 恰用满;
  • 压力回归 seed7/6000 + seed2024/4000: 0 崩溃 / 0 NaN / 0 GM<V_in; 违规仅剩极端形状
    (M/N 极小 + 大 K + fp8/fp4) 的如实标注 (自检违规列), 不再静默;
  • examples 44 例重生成可复现 0 diff; demo 集全部可行。

数值影响 (demo 节选): tile 从恒 176x176 变为自适应 (512x512 / 512x128 / 16x1024 等),
mCnt/nCnt 相应收缩; 共享块重复读流量大幅下降 (如 b128_m8192_n8192_k7168 L2 重复读
1.38TB -> 451GB, b16_m32768_n8192_k7168 695GB -> 231GB), 时延随之下移或瓶颈回归 MMAD
(如 b128_m8192_n8192_k7168: 253.4ms MMAD-bound, b32_m8192_n8192_k7168 63.3ms)。

修复 commit: 05ca91e 落地 (对照《ASW_Basic分支分析 v1.91》§5.1/§5.2 + 《BMM尾轮处理策略对比分析 v1.5》§2.1): 1. **BaseM/BaseN**: UnitFlag 单缓冲方形 256x256 (L0C/4B=65536 元素用满, 替代旧双缓冲 176x176); 方形优先 (L0A/L0B 同时装满、baseK=64 比跟随 M/N 加倍); M/N < 256 被迫跟随 M/N, 另一侧按 L0C 余量放大且收敛 L0A/L0B (baseK>=16) 单边上限 (修掉 M=16 时 BaseN=4096 超 L0B 的缺口); 2. **SingleCoreM/N 有界枚举** (替代旧"仅 sqrt(P)+2 范围按面积取最大" —— 其 L1 约束过滤后恒 退回 Base 兜底, 即用户看到的恒 176 根因): P=1 (B>=C) 先试不切分 (tile 跟随 M/N), 否则枚举 mCnt<=ceil(M/BaseM) x nCnt<=ceil(N/BaseN) 且 B*mCnt*nCnt>=C; sM/sN 为 Base 整数倍 (约束4); 约束2 由 L1 双缓冲反推 k_L1; 约束3 dValue>=256B 转置感知 + minTile 16KB; 目标 = 每 batch 总搬入 K*dt*(nCnt*M + mCnt*N) 最小 (v1.5 修正口径: 稳态下 k_L1 与搬入总量 无关, k_L1 只进约束); 并列取 r = B*mCnt*nCnt mod C 最大; 3. **兜底**: 约束4 下无解时放开到 16 对齐网格按硬下限 (dValue>=128B) 再搜; 极端形状 (如 N=8 int8 大K, B 侧 dValue = sN*dt 物理不可满足) 仍无解时退回 Base tile 并自检标注 违规 (不再像旧模型那样静默产出伪可行方案); 4. **constraints**: ASW 双分支 L0C 口径改 UnitFlag 单缓冲 (factor 1); IterBatch/MergeBatch 保持双缓冲 (其文档口径本就如此); 5. **docs/02_分支理论/06_ASW_Basic分支.md**: Step0/Step1/Step6 重写为 v1.91 口径并标注 issue#33 更新; docs/05 无涉 (tile 选择不影响 GM/L2 场景口径, 仅 tile 尺寸作为输入)。 验证 (61/61 全过): - v1.91 §5.2 完整实例复现: B=8, M=N=2048, K=1024 bf16 -> 512x512 (mCnt=nCnt=4), k_L1=128, r=0 (与文档表格逐项一致); - 方形例外: M=128 -> BaseM=128, BaseN=512, baseK=32; 默认方形 256x256 且 L0C 恰用满; - 压力回归 seed7/6000 + seed2024/4000: 0 崩溃 / 0 NaN / 0 GM<V_in; 违规仅剩极端形状 (M/N 极小 + 大 K + fp8/fp4) 的如实标注 (自检违规列), 不再静默; - examples 44 例重生成可复现 0 diff; demo 集全部可行。 **数值影响 (demo 节选)**: tile 从恒 176x176 变为自适应 (512x512 / 512x128 / 16x1024 等), mCnt/nCnt 相应收缩; 共享块重复读流量大幅下降 (如 b128_m8192_n8192_k7168 L2 重复读 1.38TB -> 451GB, b16_m32768_n8192_k7168 695GB -> 231GB), 时延随之下移或瓶颈回归 MMAD (如 b128_m8192_n8192_k7168: 253.4ms MMAD-bound, b32_m8192_n8192_k7168 63.3ms)。
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: admin/matmul-analysis#33
No description provided.