用户澄清: MergeBatch vs IterBatch 的本质区别不只是 DMA 命令数 —— 合并 b0 个 batch 的左/右矩阵一起搬入 L1, 使单块 tile = nValue*dValue*dt 放大 b0 倍 (堆叠 方向视转置: A ND 非转置沿 M(nValue), B ND 非转置沿 N(dValue)), 搬移效率更高, 即便 T_cmd=0 也有效益。 - models.move_eff: 单命令搬移效率 eff = min(1, tile/min_TileSize) (16KB 饱和, 与进入条件4效率下限语义同源); gm_move_time 按 A/B 两侧字节加权 t = (V_A/eff_A + V_B/eff_B)/BW_gm; 只影响时间列, GM 字节量仍 = V_in - IterBatch: l1_form 补驻留侧返回; move_tiles 分侧口径 (a/b 双侧整K, c 驻留侧 整K+对侧k_l1, d 双侧k_l1), evaluate 接入效率加权 - MergeBatch: 合并 tile 放大 b0 倍接入效率加权; beats_iterbatch 净收益 = 命令节省(cmds差×T_cmd) + 效率节省(t_data差) − drain惩罚, K截断且效率打平且 T_cmd>0 时严格退化为 v1.1 §4.5 闭式; 退役 T_cmd<=0 策略特判 - router: 退役 "T_cmd<=0 策略优先 MergeBatch" 覆盖, 时延模型统一终审 - hardware: t_cmd_ns 50 -> 0 (未标定按 0; 合并收益不再依赖 T_cmd 估计值) - 作用域: 仅切B 两分支接入 (逐命令 tile 小、效率差显著); ASW/StreamK 单命令 tile 通常已饱和, 极端小 tile 走 issue#34 效率降级标注通道 - 用户 case 家族 B=128,M=1~16,N=128,K=512: m=1~8 -> MergeBatch (效率节省 ~0.61us > drain), m=16 -> IterBatch (iter A tile 恰达 16KB 饱和, 效率打平, drain 决定); 分界与时延全家族一致 - demo: merge_demo_k_trunc 形状 (2048,32,32,256)->(2048,16,64,128) (原形状 两侧 tile 均已 16KB 饱和, t_cmd=0 下无收益转 IterBatch; 新形状 iter A tile 4KB eff=0.25 vs 合并 16KB eff=1.0, 保持 MergeBatch 胜出演示且仍 K截断) - 测试: 74/74 (新增 TestIssue36 5 例: 效率曲线/字节不变/效率差胜出/家族; TestArbitration/TestZeroCmdHandling 按 t_cmd=0+效率语义重写; TestIssue35 家族期望更新) - 文档: 01_MergeBatch §4/§5 效率模型+泛化净收益; 02_IterBatch 口径注; 00_总纲胜出条件; 01_软件架构 T_cmd 标定说明; 05 时间列效率口径注; README 要点 - 验证: examples 重生成可复现 0 diff; 压力 10000 例 0 崩溃/0 NaN/0 违规/ 0 GM<V_in, 七分支覆盖 (MergeBatch 386 例)
22 KiB
22 KiB
| 1 | case_id | branch | npu | op | used_core_num | split_b | m_cnt | n_cnt | grid_k | core_map | b_core | merge_b0 | single_core_m | single_core_n | single_core_k | k_l1 | b_l1 | l1_form | base_m | base_n | base_k | l2_policy_in | l2_policy_out | swizzle_w | workspace_bytes | tail_strategy | tail_m_cnt | tail_n_cnt | tail_k_cnt | tail_m_main | tail_n_main | tail_block_cnt | tail_wave_num | fixpipe_unitflag | out_dtype_bytes | note |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | to_matmul_demo | 转Matmul | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 0 | 0 | 1 | 折叠为 Matmul [2048,2048]x[2048,2048], 复用 Matmul 切分体系 | 0 | 1 | 0 | 0 | 2048 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 转Matmul后由 Matmul 体系决定 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | True | 2 | BatchB=1免费折叠: 左矩阵 [1,2048,2048] 视图折叠为 [2048,2048], 零重排零 split | |||
| 3 | special_k0_demo | 特殊分支 | Ascend950PR | batch_mat_mul_v3 | 64 | 1 | 1 | 1 | 1 | AIV 核间按行均分 (无 Cube tile 概念) | 0 | 1 | 0 | 0 | 0 | 0 | 1 | UB驻留(AIV) | 0 | 0 | 0 | allocate | direct_gm | 0 | 0 | 不涉及(AIV逐元素) | 1 | 1 | 1 | 0 | 0 | 0 | 0 | False | 2 | K=0纯写值: 无任何计算, C=bias 或 0, 纯 AIV 写值; 按行均分到 AIV 核 |
| 4 | special_k1_demo | 特殊分支 | Ascend950PR | batch_mat_mul_v3 | 64 | 1 | 1 | 1 | 1 | AIV 核间按行均分 (无 Cube tile 概念) | 0 | 1 | 0 | 0 | 1 | 0 | 1 | UB驻留(AIV) UB乒乓 | 0 | 0 | 0 | allocate | direct_gm | 0 | 0 | 不涉及(AIV逐元素) | 1 | 1 | 1 | 0 | 0 | 0 | 0 | False | 2 | K=1逐元素乘: 退化为 C=A⊙B 无累加深度, Cube 16x16x16 粒度浪费 15/16; 走 AIV 通路 GM->UB->Mul->GM, UB乒乓 (B>=2*AIV 双batch乒乓流水) |
| 5 | merge_demo_k_trunc | MergeBatch | Ascend950PR | batch_mat_mul_v3 | 32 | 32 | 1 | 1 | 1 | 切B均分(核间零重复读零依赖) | 64 | 4 | 64 | 256 | 128 | 128 | 12 | 合并驻留 | 64 | 256 | 64 | allocate(GM->L1随路驻留L2) | resident(整case输入+输出<=L2: 输出驻留L2异步回写, GM写=0) | 0 | 0 | 不涉及(核内不切M/N) | 1 | 1 | 1 | 0 | 0 | 0 | 0 | True | 2 | b0=4 (L0C上限5.7/算存比上限23.7/b_core=64); K截断; 合并后单次DMA搬入 A'[64,128]+B'[128,256]; 输出落点: L2驻留 (整case V_in+V_out=40.0MB vs L2=128MB) |
| 6 | merge_iter_arbitrate | IterBatch | Ascend950PR | batch_mat_mul_v3 | 32 | 32 | 1 | 1 | 1 | 切B轮转分配(核间零重复读零依赖) | 4 | 1 | 64 | 64 | 512 | 512 | 2 | b_双batch乒乓 | 64 | 64 | 256 | allocate(GM->L1随路驻留L2) | resident(整case输入+输出<=L2: 输出驻留L2异步回写, GM写=0) | 0 | 0 | 不涉及(核内不切M/N) | 1 | 1 | 1 | 0 | 0 | 0 | 0 | True | 2 | 双batch乒乓: 2*(MK+KN)*dtype=256KB <= L1; 输出落点: L2驻留 |
| 7 | iter_demo_form_b | IterBatch | Ascend950PR | batch_mat_mul_v3 | 32 | 32 | 1 | 1 | 1 | 切B轮转分配(核间零重复读零依赖) | 4 | 1 | 64 | 64 | 256 | 256 | 2 | b_双batch乒乓 | 64 | 64 | 256 | allocate(GM->L1随路驻留L2) | resident(整case输入+输出<=L2: 输出驻留L2异步回写, GM写=0) | 0 | 0 | 不涉及(核内不切M/N) | 1 | 1 | 1 | 0 | 0 | 0 | 0 | True | 2 | 双batch乒乓: 2*(MK+KN)*dtype=128KB <= L1; 输出落点: L2驻留 |
| 8 | iter_demo_form_d | IterBatch | Ascend950PR | batch_mat_mul_v3 | 32 | 32 | 1 | 1 | 1 | 切B轮转分配(核间零重复读零依赖) | 2 | 1 | 64 | 64 | 8192 | 1024 | 1 | d_两侧都切K | 64 | 64 | 256 | allocate(GM->L1随路驻留L2) | direct_gm(整case超L2: 输入优先驻留L2, 输出直写GM不占L2) | 0 | 0 | 不涉及(核内不切M/N) | 1 | 1 | 1 | 0 | 0 | 0 | 0 | True | 2 | 两侧都切K: k_L1=1024, K段成对流水, batch边界天然无缝; dValueA=2048B/dValueB=128B; 输出落点: 直写GM |
| 9 | streamk_demo | StreamK | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 1 | 1 | 32 | B/M/N切出4块, 每块32核切K归约 (归约组内核c负责K段[c*K/32,(c+1)*K/32)) | 1 | 1 | 128 | 128 | 320 | 256 | 1 | K段标准分块流水 | 128 | 128 | 64 | allocate(部分和驻留L2) | resident(部分和4B驻留L2, 防精度丢失不随C的fp16/fp8转换) | 0 | 8388608 | grid_K=32路切K+归约 | 1 | 1 | 32 | 0 | 0 | 0 | 0 | True | 4 | P=1.00, grid_K=32, 部分和驻留L2按4B写出, AIV归约后按C dtype=2B写最终 |
| 10 | asw_demo_full | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 16 | 16 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 512 | 1024 | 128 | 1 | 双缓冲驻留当前tile输入 | 256 | 256 | 64 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 16 | True | 2 | tile枚举: P=16, 有界枚举最优 mCnt=16 x nCnt=16 (tile 512x512, 每batch搬入512.0MB, r=0); Base tile 256x256 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=64.0MB, V_out=256.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 11 | asw_demo_reduce_core | ASW_Basic_降核 | Ascend950PR | batch_mat_mul_v3 | 16 | 1 | 1 | 1 | 1 | 降核: 只用16核, 每核一个L0C满载输出块, 其余核闲置 | 0 | 1 | 256 | 256 | 128 | 128 | 1 | 标准核内流水 | 256 | 256 | 64 | allocate | resident(整case全驻留S_A) | 0 | 0 | 不涉及(每核一块无尾轮) | 1 | 1 | 1 | 0 | 0 | 0 | 0 | True | 2 | P=16.00<C, 降核是理性选择 (强切则 tile 跌破搬移效率下限反而更慢) |
| 12 | b4_m1_n128_k256 | ASW_Basic_降核 | Ascend950PR | batch_mat_mul_v3 | 1 | 1 | 1 | 1 | 1 | 降核: 只用1核, 每核一个L0C满载输出块, 其余核闲置 | 0 | 1 | 1 | 128 | 256 | 256 | 1 | 标准核内流水 | 1 | 128 | 128 | allocate | resident(整case全驻留S_A) | 0 | 0 | 不涉及(每核一块无尾轮) | 1 | 1 | 1 | 0 | 0 | 0 | 0 | True | 2 | P=0.01<C, 降核是理性选择 (强切则 tile 跌破搬移效率下限反而更慢) |
| 13 | b8_m2_n192_k128 | ASW_Basic_降核 | Ascend950PR | batch_mat_mul_v3 | 1 | 1 | 1 | 1 | 1 | 降核: 只用1核, 每核一个L0C满载输出块, 其余核闲置 | 0 | 1 | 2 | 192 | 128 | 128 | 1 | 标准核内流水 | 2 | 192 | 80 | allocate | resident(整case全驻留S_A) | 0 | 0 | 不涉及(每核一块无尾轮) | 1 | 1 | 1 | 0 | 0 | 0 | 0 | True | 2 | P=0.05<C, 降核是理性选择 (强切则 tile 跌破搬移效率下限反而更慢) |
| 14 | b16_m4_n256_k192 | ASW_Basic_降核 | Ascend950PR | batch_mat_mul_v3 | 1 | 1 | 1 | 1 | 1 | 降核: 只用1核, 每核一个L0C满载输出块, 其余核闲置 | 0 | 1 | 4 | 256 | 192 | 192 | 1 | 标准核内流水 | 4 | 256 | 64 | allocate | resident(整case全驻留S_A) | 0 | 0 | 不涉及(每核一块无尾轮) | 1 | 1 | 1 | 0 | 0 | 0 | 0 | True | 2 | P=0.25<C, 降核是理性选择 (强切则 tile 跌破搬移效率下限反而更慢) |
| 15 | b32_m8_n128_k256 | IterBatch | Ascend950PR | batch_mat_mul_v3 | 32 | 32 | 1 | 1 | 1 | 切B轮转分配(核间零重复读零依赖) | 1 | 1 | 8 | 128 | 256 | 256 | 1 | a_单batch全驻留 | 8 | 128 | 128 | allocate(GM->L1随路驻留L2) | resident(整case输入+输出<=L2: 输出驻留L2异步回写, GM写=0) | 0 | 0 | 不涉及(核内不切M/N) | 1 | 1 | 1 | 0 | 0 | 0 | 0 | True | 2 | 单batch全驻留: (MK+KN)*dtype=68KB <= L1; 输出落点: L2驻留 |
| 16 | b64_m16_n256_k512 | IterBatch | Ascend950PR | batch_mat_mul_v3 | 32 | 32 | 1 | 1 | 1 | 切B轮转分配(核间零重复读零依赖) | 2 | 1 | 16 | 256 | 512 | 240 | 1 | c_一侧驻留+对侧切K | 16 | 256 | 64 | allocate(GM->L1随路驻留L2) | resident(整case输入+输出<=L2: 输出驻留L2异步回写, GM写=0) | 0 | 0 | 不涉及(核内不切M/N) | 1 | 1 | 1 | 0 | 0 | 0 | 0 | True | 2 | 一侧驻留(A)+对侧切K: A驻留16KB, 预算L1/2, k_L1=240, dValueA=480B/dValueB=512B; 输出落点: L2驻留 |
| 17 | b128_m8_n192_k256 | IterBatch | Ascend950PR | batch_mat_mul_v3 | 32 | 32 | 1 | 1 | 1 | 切B轮转分配(核间零重复读零依赖) | 4 | 1 | 8 | 192 | 256 | 256 | 2 | b_双batch乒乓 | 8 | 192 | 80 | allocate(GM->L1随路驻留L2) | resident(整case输入+输出<=L2: 输出驻留L2异步回写, GM写=0) | 0 | 0 | 不涉及(核内不切M/N) | 1 | 1 | 1 | 0 | 0 | 0 | 0 | True | 2 | 双batch乒乓: 2*(MK+KN)*dtype=200KB <= L1; 输出落点: L2驻留 |
| 18 | b32_m16_n8192_k7168 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 1 | 8 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 16 | 1024 | 7168 | 112 | 1 | 双缓冲驻留当前tile输入 | 16 | 1024 | 16 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 8 | True | 2 | tile枚举: 效率降级(放开约束4, dValue 按 128B 硬下限, 搬移效率低于模型假设, 时延可能低估): P=1, mCnt=1 x nCnt=8 (tile 16x1024, 每batch搬入113.8MB, r=0); Base tile 16x1024 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=3591.0MB, V_out=8.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 19 | b4_m1_n8192_k8192 | StreamK | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 1 | 1 | 32 | B/M/N切出4块, 每块32核切K归约 (归约组内核c负责K段[c*K/32,(c+1)*K/32)) | 1 | 1 | 1 | 8192 | 256 | 256 | 1 | K段标准分块流水 | 1 | 128 | 64 | allocate(部分和驻留L2) | resident(部分和4B驻留L2, 防精度丢失不随C的fp16/fp8转换) | 0 | 4194304 | grid_K=32路切K+归约 | 1 | 1 | 32 | 0 | 0 | 0 | 0 | True | 4 | P=0.50, grid_K=32, 部分和驻留L2按4B写出, AIV归约后按C dtype=2B写最终 |
| 20 | b16_m2_n4096_k7168 | StreamK | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 1 | 1 | 16 | B/M/N切出16块, 每块16核切K归约 (归约组内核c负责K段[c*K/16,(c+1)*K/16)) | 1 | 1 | 2 | 4096 | 448 | 256 | 1 | K段标准分块流水 | 2 | 128 | 64 | allocate(部分和驻留L2) | resident(部分和4B驻留L2, 防精度丢失不随C的fp16/fp8转换) | 0 | 8388608 | grid_K=16路切K+归约 | 1 | 1 | 16 | 0 | 0 | 0 | 0 | True | 4 | P=2.00, grid_K=16, 部分和驻留L2按4B写出, AIV归约后按C dtype=2B写最终 |
| 21 | b32_m64_n64_k7168 | IterBatch | Ascend950PR | batch_mat_mul_v3 | 32 | 32 | 1 | 1 | 1 | 切B轮转分配(核间零重复读零依赖) | 1 | 1 | 64 | 64 | 7168 | 1024 | 1 | d_两侧都切K | 64 | 64 | 256 | allocate(GM->L1随路驻留L2) | resident(整case输入+输出<=L2: 输出驻留L2异步回写, GM写=0) | 0 | 0 | 不涉及(核内不切M/N) | 1 | 1 | 1 | 0 | 0 | 0 | 0 | True | 2 | 两侧都切K: k_L1=1024, K段成对流水, batch边界天然无缝; dValueA=2048B/dValueB=128B; 输出落点: L2驻留 |
| 22 | b64_m1024_n1024_k7168 | IterBatch | Ascend950PR | batch_mat_mul_v3 | 32 | 32 | 1 | 1 | 1 | 切B轮转分配(核间零重复读零依赖) | 2 | 1 | 1024 | 1024 | 7168 | 64 | 1 | d_两侧都切K | 176 | 176 | 64 | allocate(GM->L1随路驻留L2) | direct_gm(整case超L2: 输入优先驻留L2, 输出直写GM不占L2) | 0 | 0 | 不涉及(核内不切M/N) | 1 | 1 | 1 | 0 | 0 | 0 | 0 | True | 2 | 两侧都切K: k_L1=64, K段成对流水, batch边界天然无缝; dValueA=128B/dValueB=2048B; 输出落点: 直写GM |
| 23 | b128_m2048_n2048_k1536 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 4 | 4 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 512 | 1536 | 128 | 1 | 双缓冲驻留当前tile输入 | 256 | 256 | 64 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 64 | True | 2 | tile枚举: P=1, 有界枚举最优 mCnt=4 x nCnt=4 (tile 512x512, 每batch搬入48.0MB, r=0); Base tile 256x256 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=1536.0MB, V_out=1024.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 24 | b64_m1024_n8192_k2048 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 2 | 16 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 512 | 2048 | 128 | 1 | 双缓冲驻留当前tile输入 | 256 | 256 | 64 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 64 | True | 2 | tile枚举: P=1, 有界枚举最优 mCnt=2 x nCnt=16 (tile 512x512, 每batch搬入128.0MB, r=0); Base tile 256x256 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=2304.0MB, V_out=1024.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 25 | b32_m1024_n1024_k512 | IterBatch | Ascend950PR | batch_mat_mul_v3 | 32 | 32 | 1 | 1 | 1 | 切B轮转分配(核间零重复读零依赖) | 1 | 1 | 1024 | 1024 | 512 | 64 | 1 | d_两侧都切K | 176 | 176 | 64 | allocate(GM->L1随路驻留L2) | resident(整case输入+输出<=L2: 输出驻留L2异步回写, GM写=0) | 0 | 0 | 不涉及(核内不切M/N) | 1 | 1 | 1 | 0 | 0 | 0 | 0 | True | 2 | 两侧都切K: k_L1=64, K段成对流水, batch边界天然无缝; dValueA=128B/dValueB=2048B; 输出落点: L2驻留 |
| 26 | b128_m4096_n4096_k8192 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 8 | 8 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 512 | 8192 | 128 | 1 | 双缓冲驻留当前tile输入 | 256 | 256 | 64 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 256 | True | 2 | tile枚举: P=1, 有界枚举最优 mCnt=8 x nCnt=8 (tile 512x512, 每batch搬入1024.0MB, r=0); Base tile 256x256 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=16384.0MB, V_out=4096.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 27 | b32_m8192_n4096_k7168 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 16 | 8 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 512 | 7168 | 128 | 1 | 双缓冲驻留当前tile输入 | 256 | 256 | 64 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 128 | True | 2 | tile枚举: P=1, 有界枚举最优 mCnt=16 x nCnt=8 (tile 512x512, 每batch搬入1792.0MB, r=0); Base tile 256x256 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=5376.0MB, V_out=2048.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 28 | b32_m2048_n2048_k8192 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 4 | 4 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 512 | 8192 | 128 | 1 | 双缓冲驻留当前tile输入 | 256 | 256 | 64 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 16 | True | 2 | tile枚举: P=1, 有界枚举最优 mCnt=4 x nCnt=4 (tile 512x512, 每batch搬入256.0MB, r=0); Base tile 256x256 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=2048.0MB, V_out=256.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 29 | b64_m4096_n2048_k128 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 8 | 4 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 512 | 128 | 128 | 1 | 双缓冲驻留当前tile输入 | 256 | 256 | 64 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 64 | True | 2 | tile枚举: P=1, 有界枚举最优 mCnt=8 x nCnt=4 (tile 512x512, 每batch搬入8.0MB, r=0); Base tile 256x256 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=96.0MB, V_out=1024.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 30 | b16_m1024_n1024_k8192 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 2 | 2 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 512 | 8192 | 128 | 1 | 双缓冲驻留当前tile输入 | 256 | 256 | 64 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 2 | True | 2 | tile枚举: P=2, 有界枚举最优 mCnt=2 x nCnt=2 (tile 512x512, 每batch搬入64.0MB, r=0); Base tile 256x256 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=512.0MB, V_out=32.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 31 | b4_m32768_n128_k128 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 64 | 1 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 128 | 128 | 128 | 1 | 双缓冲驻留当前tile输入 | 512 | 128 | 32 | allocate(输入驻留L2吸收重复读) | resident(整case全驻留S_A: 输出驻留L2异步回写, GM写=0) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 8 | True | 2 | tile枚举: P=8, 有界枚举最优 mCnt=64 x nCnt=1 (tile 512x128, 每batch搬入10.0MB, r=0); Base tile 512x128 (L0C 单缓冲方形用满); L2场景: A_整case全驻留(输入+输出<=L2) (V_in=32.1MB, V_out=32.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 32 | b8_m32768_n2048_k512 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 64 | 4 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 512 | 512 | 128 | 1 | 双缓冲驻留当前tile输入 | 256 | 256 | 64 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 64 | True | 2 | tile枚举: P=4, 有界枚举最优 mCnt=64 x nCnt=4 (tile 512x512, 每batch搬入256.0MB, r=0); Base tile 256x256 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=272.0MB, V_out=1024.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 33 | b4_m131072_n128_k128 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 256 | 1 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 128 | 128 | 128 | 1 | 双缓冲驻留当前tile输入 | 512 | 128 | 32 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 32 | True | 2 | tile枚举: P=8, 有界枚举最优 mCnt=256 x nCnt=1 (tile 512x128, 每batch搬入40.0MB, r=0); Base tile 512x128 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=128.1MB, V_out=128.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 34 | b8_m131072_n1024_k256 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 256 | 2 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 512 | 256 | 128 | 1 | 双缓冲驻留当前tile输入 | 256 | 256 | 64 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 128 | True | 2 | tile枚举: P=4, 有界枚举最优 mCnt=256 x nCnt=2 (tile 512x512, 每batch搬入256.0MB, r=0); Base tile 256x256 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=516.0MB, V_out=2048.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 35 | b16_m32768_n8192_k7168 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 64 | 16 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 512 | 7168 | 128 | 1 | 双缓冲驻留当前tile输入 | 256 | 256 | 64 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 512 | True | 2 | tile枚举: P=2, 有界枚举最优 mCnt=64 x nCnt=16 (tile 512x512, 每batch搬入14336.0MB, r=0); Base tile 256x256 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=8960.0MB, V_out=8192.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 36 | b4_m32768_n128_k8192 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 64 | 1 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 128 | 8192 | 192 | 1 | 双缓冲驻留当前tile输入 | 512 | 128 | 32 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 8 | True | 2 | tile枚举: P=8, 有界枚举最优 mCnt=64 x nCnt=1 (tile 512x128, 每batch搬入640.0MB, r=0); Base tile 512x128 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=2056.0MB, V_out=32.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 37 | b32_m131072_n8192_k128 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 256 | 16 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 512 | 128 | 128 | 1 | 双缓冲驻留当前tile输入 | 256 | 256 | 64 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 4096 | True | 2 | tile枚举: P=1, 有界枚举最优 mCnt=256 x nCnt=16 (tile 512x512, 每batch搬入1024.0MB, r=0); Base tile 256x256 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=1088.0MB, V_out=65536.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 38 | b64_m32768_n8192_k1536 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 64 | 16 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 512 | 1536 | 128 | 1 | 双缓冲驻留当前tile输入 | 256 | 256 | 64 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 2048 | True | 2 | tile枚举: P=1, 有界枚举最优 mCnt=64 x nCnt=16 (tile 512x512, 每batch搬入3072.0MB, r=0); Base tile 256x256 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=7680.0MB, V_out=32768.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 39 | b8_m131072_n8192_k8192 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 256 | 16 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 512 | 8192 | 128 | 1 | 双缓冲驻留当前tile输入 | 256 | 256 | 64 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 1024 | True | 2 | tile枚举: P=4, 有界枚举最优 mCnt=256 x nCnt=16 (tile 512x512, 每batch搬入65536.0MB, r=0); Base tile 256x256 (L0C 单缓冲方形用满); L2场景: C_双侧超L2: 最小替换2D分组(组间落空GM, 窗口L2) (V_in=17408.0MB, V_out=16384.0MB, L2=128MB); 最小替换分组 m_grp=8x n_grp=8 (GM倍率3.76, 窗口L2/batch=57344.0MB); 尾轮: r=0 无尾轮 |
| 40 | b8_m16_n7168_k1536 | StreamK | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 1 | 2 | 2 | B/M/N切出16块, 每块2核切K归约 (归约组内核c负责K段[c*K/2,(c+1)*K/2)) | 1 | 1 | 16 | 3584 | 768 | 256 | 1 | K段标准分块流水 | 16 | 128 | 64 | allocate(部分和驻留L2) | resident(部分和4B驻留L2, 防精度丢失不随C的fp16/fp8转换) | 0 | 3670016 | grid_K=2路切K+归约 | 1 | 1 | 2 | 0 | 0 | 0 | 0 | True | 4 | P=14.00, grid_K=2, 部分和驻留L2按4B写出, AIV归约后按C dtype=2B写最终 |
| 41 | b64_m1024_n7168_k7168 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 2 | 14 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 512 | 7168 | 128 | 1 | 双缓冲驻留当前tile输入 | 256 | 256 | 64 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 56 | True | 2 | tile枚举: P=1, 有界枚举最优 mCnt=2 x nCnt=14 (tile 512x512, 每batch搬入392.0MB, r=0); Base tile 256x256 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=7168.0MB, V_out=896.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 42 | b32_m8192_n8192_k7168 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 16 | 16 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 512 | 7168 | 128 | 1 | 双缓冲驻留当前tile输入 | 256 | 256 | 64 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 256 | True | 2 | tile枚举: P=1, 有界枚举最优 mCnt=16 x nCnt=16 (tile 512x512, 每batch搬入3584.0MB, r=0); Base tile 256x256 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=7168.0MB, V_out=4096.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 43 | b8_m4096_n4096_k128 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 8 | 8 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 512 | 128 | 128 | 1 | 双缓冲驻留当前tile输入 | 256 | 256 | 64 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 16 | True | 2 | tile枚举: P=4, 有界枚举最优 mCnt=8 x nCnt=8 (tile 512x512, 每batch搬入16.0MB, r=0); Base tile 256x256 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=16.0MB, V_out=256.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 44 | b128_m8192_n8192_k7168 | ASW_Basic | Ascend950PR | batch_mat_mul_v3 | 32 | 1 | 16 | 16 | 1 | B->M->N线性映射+ASW滑窗蛇形(W=4) | 0 | 1 | 512 | 512 | 7168 | 128 | 1 | 双缓冲驻留当前tile输入 | 256 | 256 | 64 | allocate(输入驻留L2吸收重复读) | direct_gm(输出直写GM, 输入优先驻留L2) | 4 | 0 | A0 | 1 | 1 | 1 | 0 | 0 | 0 | 1024 | True | 2 | tile枚举: P=1, 有界枚举最优 mCnt=16 x nCnt=16 (tile 512x512, 每batch搬入3584.0MB, r=0); Base tile 256x256 (L0C 单缓冲方形用满); L2场景: B_单batch可驻留(全驻留或单侧驻留+对侧滑窗) (V_in=28672.0MB, V_out=16384.0MB, L2=128MB); 尾轮: r=0 无尾轮 |
| 45 | special_k1_b64 | 特殊分支 | Ascend950PR | batch_mat_mul_v3 | 64 | 1 | 1 | 1 | 1 | AIV 核间按行均分 (无 Cube tile 概念) | 0 | 1 | 0 | 0 | 1 | 0 | 1 | UB驻留(AIV) AIV单缓冲 | 0 | 0 | 0 | allocate | direct_gm | 0 | 0 | 不涉及(AIV逐元素) | 1 | 1 | 1 | 0 | 0 | 0 | 0 | False | 2 | K=1逐元素乘: 退化为 C=A⊙B 无累加深度, Cube 16x16x16 粒度浪费 15/16; 走 AIV 通路 GM->UB->Mul->GM, AIV单缓冲 (B<2*AIV 逐batch单缓冲串行) |