Update BMM_Theory: examples/plans.csv

This commit is contained in:
2026-09-03 09:25:53 +00:00
parent 2b309bc676
commit d591e56276

View File

@@ -1,10 +1,11 @@
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,fixpipe_unitflag,out_dtype_bytes,note
merge_demo_1,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),"direct_gm(输出仅写一次,直写GM不占L2)",0,0,不涉及(核内不切M/N),True,2,双batch乒乓: 2*(MK+KN)*dtype=256KB <= L1
iter_demo_1,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),"direct_gm(输出仅写一次,直写GM不占L2)",0,0,不涉及(核内不切M/N),True,2,双batch乒乓: 2*(MK+KN)*dtype=128KB <= L1
iter_demo_2,IterBatch,Ascend950PR,batch_mat_mul_v3,32,32,1,1,1,切B轮转分配(核间零重复读零依赖),16,1,128,128,128,128,2,b_双batch乒乓,128,128,128,allocate(GM->L1随路驻留L2),"direct_gm(输出仅写一次,直写GM不占L2)",0,0,不涉及(核内不切M/N),True,2,双batch乒乓: 2*(MK+KN)*dtype=128KB <= L1
iter_demo_3,IterBatch,Ascend950PR,batch_mat_mul_v3,32,32,1,1,1,切B轮转分配(核间零重复读零依赖),64,1,1024,1024,512,64,1,d_两侧都切K,32,1024,16,allocate(GM->L1随路驻留L2),"direct_gm(输出仅写一次,直写GM不占L2)",0,0,不涉及(核内不切M/N),True,2,"两侧都切K: k_L1=64, K段成对流水, batch边界天然无缝"
iter_demo_4,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(输出仅写一次,直写GM不占L2)",0,0,不涉及(核内不切M/N),True,2,"两侧都切K: k_L1=1024, K段成对流水, batch边界天然无缝"
fp16_out_demo,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),"direct_gm(输出仅写一次,直写GM不占L2)",0,0,不涉及(核内不切M/N),True,2,双batch乒乓: 2*(MK+KN)*dtype=256KB <= L1
to_matmul_demo,转Matmul,Ascend950PR,batch_mat_mul_v3,32,1,1,1,1,,0,1,0,0,0,0,1,,0,0,0,,,0,0,,True,2,"BatchA=1或BatchB=1, 折叠转普通Matmul (该分支详实现待后续迭代)"
special_k1,特殊分支,Ascend950PR,batch_mat_mul_v3,32,1,1,1,1,,0,1,0,0,0,0,1,,0,0,0,,,0,0,,True,2,"K=1, Cube 无用, 走 AIV 向量通路 (该分支详实现待后续迭代)"
asw_fallback_demo,ASW_Basic,Ascend950PR,batch_mat_mul_v3,32,1,1,1,1,,0,1,0,0,0,0,1,,0,0,0,,,0,0,,True,2,"IterBatch/MergeBatch 进入条件均不满足 (如负载均衡/搬移效率不达标), 回落 ASW_Basic (该分支详实现待后续迭代); IterBatch未过: 3_L1驻留形态(四选一, 核心要求: 单batch核内零重复读); MergeBatch未过: 1_batch关系与每核份额: BatchA==BatchB 且 b_core=B/C>=2*b0; 2_L0C容量: 2*(b0*M)*(b0*N)*4B <= L0C; 5_访存Bound: 2MN/(M+N) < R16/b0"
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
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"
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 核"
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),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 乒乓"
merge_demo_k_trunc,MergeBatch,Ascend950PR,batch_mat_mul_v3,32,32,1,1,1,切B均分(核间零重复读零依赖),64,4,128,128,256,256,8,合并驻留,128,128,128,allocate(GM->L1随路驻留L2),direct_gm,0,0,不涉及(核内不切M/N),1,1,1,0,0,0,0,True,2,"b0=4 (L0C上限5.7/算存比上限19.0/b_core=64); K截断; 合并后单次DMA搬入 A'[128,256]+B'[256,128]"
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),"direct_gm(输出仅写一次,直写GM不占L2)",0,0,不涉及(核内不切M/N),1,1,1,0,0,0,0,True,2,双batch乒乓: 2*(MK+KN)*dtype=256KB <= L1
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),"direct_gm(输出仅写一次,直写GM不占L2)",0,0,不涉及(核内不切M/N),1,1,1,0,0,0,0,True,2,双batch乒乓: 2*(MK+KN)*dtype=128KB <= L1
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(输出仅写一次,直写GM不占L2)",0,0,不涉及(核内不切M/N),1,1,1,0,0,0,0,True,2,"两侧都切K: k_L1=1024, K段成对流水, batch边界天然无缝"
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写最终"
asw_demo_full,ASW_Basic,Ascend950PR,batch_mat_mul_v3,32,1,47,47,1,B->M->N线性映射+ASW滑窗蛇形(W=4),0,1,176,176,1024,256,1,双缓冲驻留当前tile输入,176,176,80,allocate(输入驻留L2吸收重复读),direct_gm(输出直写GM不占L2),4,0,方案B,52,52,1,52,52,2,139,True,2,"L2场景B_输入驻留输出直写GM, r_in=1.00; 尾轮: 周长型主导, rho=0.06<rho_dv=0.53, A1b被dValue卡死, 方案B反超"
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,direct_gm,0,0,不涉及(每核一块无尾轮),1,1,1,0,0,0,0,True,2,"P=16.00<C, 降核是理性选择 (强切则 tile 跌破搬移效率下限反而更慢)"
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 merge_demo_1 to_matmul_demo IterBatch 转Matmul Ascend950PR batch_mat_mul_v3 32 32 1 1 0 1 0 1 切B轮转分配(核间零重复读零依赖) 折叠为 Matmul [2048,2048]x[2048,2048], 复用 Matmul 切分体系 4 0 1 64 0 64 0 512 2048 512 0 2 1 b_双batch乒乓 64 0 64 0 256 0 allocate(GM->L1随路驻留L2) direct_gm(输出仅写一次,直写GM不占L2) 0 0 不涉及(核内不切M/N) 转Matmul后由 Matmul 体系决定 1 1 1 0 0 0 0 True 2 双batch乒乓: 2*(MK+KN)*dtype=256KB <= L1 BatchB=1免费折叠: 左矩阵 [1,2048,2048] 视图折叠为 [2048,2048], 零重排零 split
3 iter_demo_1 special_k0_demo IterBatch 特殊分支 Ascend950PR batch_mat_mul_v3 32 64 32 1 1 1 1 切B轮转分配(核间零重复读零依赖) AIV 核间按行均分 (无 Cube tile 概念) 4 0 1 64 0 64 0 256 0 256 0 2 1 b_双batch乒乓 UB驻留(AIV) 64 0 64 0 256 0 allocate(GM->L1随路驻留L2) allocate direct_gm(输出仅写一次,直写GM不占L2) direct_gm 0 0 不涉及(核内不切M/N) 不涉及(AIV逐元素) 1 1 1 0 0 0 0 True False 2 双batch乒乓: 2*(MK+KN)*dtype=128KB <= L1 K=0纯写值: 无任何计算, C=bias 或 0, 纯 AIV 写值; 按行均分到 AIV 核
4 iter_demo_2 special_k1_demo IterBatch 特殊分支 Ascend950PR batch_mat_mul_v3 32 64 32 1 1 1 1 切B轮转分配(核间零重复读零依赖) AIV 核间按行均分 (无 Cube tile 概念) 16 0 1 128 0 128 0 128 1 128 0 2 1 b_双batch乒乓 UB驻留(AIV) 128 0 128 0 128 0 allocate(GM->L1随路驻留L2) allocate direct_gm(输出仅写一次,直写GM不占L2) direct_gm 0 0 不涉及(核内不切M/N) 不涉及(AIV逐元素) 1 1 1 0 0 0 0 True False 2 双batch乒乓: 2*(MK+KN)*dtype=128KB <= L1 K=1逐元素乘: 退化为 C=A⊙B 无累加深度, Cube 16x16x16 粒度浪费 15/16; 走 AIV 通路 GM->UB->Mul->GM, UB 乒乓
5 iter_demo_3 merge_demo_k_trunc IterBatch MergeBatch Ascend950PR batch_mat_mul_v3 32 32 1 1 1 切B轮转分配(核间零重复读零依赖) 切B均分(核间零重复读零依赖) 64 1 4 1024 128 1024 128 512 256 64 256 1 8 d_两侧都切K 合并驻留 32 128 1024 128 16 128 allocate(GM->L1随路驻留L2) direct_gm(输出仅写一次,直写GM不占L2) direct_gm 0 0 不涉及(核内不切M/N) 1 1 1 0 0 0 0 True 2 两侧都切K: k_L1=64, K段成对流水, batch边界天然无缝 b0=4 (L0C上限5.7/算存比上限19.0/b_core=64); K截断; 合并后单次DMA搬入 A'[128,256]+B'[256,128]
6 iter_demo_4 merge_iter_arbitrate IterBatch Ascend950PR batch_mat_mul_v3 32 32 1 1 1 切B轮转分配(核间零重复读零依赖) 2 4 1 64 64 8192 512 1024 512 1 2 d_两侧都切K b_双batch乒乓 64 64 256 allocate(GM->L1随路驻留L2) direct_gm(输出仅写一次,直写GM不占L2) 0 0 不涉及(核内不切M/N) 1 1 1 0 0 0 0 True 2 两侧都切K: k_L1=1024, K段成对流水, batch边界天然无缝 双batch乒乓: 2*(MK+KN)*dtype=256KB <= L1
7 fp16_out_demo iter_demo_form_b IterBatch Ascend950PR batch_mat_mul_v3 32 32 1 1 1 切B轮转分配(核间零重复读零依赖) 4 1 64 64 512 256 512 256 2 b_双batch乒乓 64 64 256 allocate(GM->L1随路驻留L2) direct_gm(输出仅写一次,直写GM不占L2) 0 0 不涉及(核内不切M/N) 1 1 1 0 0 0 0 True 2 双batch乒乓: 2*(MK+KN)*dtype=256KB <= L1 双batch乒乓: 2*(MK+KN)*dtype=128KB <= L1
8 to_matmul_demo iter_demo_form_d 转Matmul IterBatch Ascend950PR batch_mat_mul_v3 32 1 32 1 1 1 切B轮转分配(核间零重复读零依赖) 0 2 1 0 64 0 64 0 8192 0 1024 1 d_两侧都切K 0 64 0 64 0 256 allocate(GM->L1随路驻留L2) direct_gm(输出仅写一次,直写GM不占L2) 0 0 不涉及(核内不切M/N) 1 1 1 0 0 0 0 True 2 BatchA=1或BatchB=1, 折叠转普通Matmul (该分支详实现待后续迭代) 两侧都切K: k_L1=1024, K段成对流水, batch边界天然无缝
9 special_k1 streamk_demo 特殊分支 StreamK Ascend950PR batch_mat_mul_v3 32 1 1 1 1 32 B/M/N切出4块, 每块32核切K归约 (归约组内核c负责K段[c*K/32,(c+1)*K/32)) 0 1 1 0 128 0 128 0 320 0 256 1 K段标准分块流水 0 128 0 128 0 64 allocate(部分和驻留L2) resident(部分和4B驻留L2, 防精度丢失不随C的fp16/fp8转换) 0 0 8388608 grid_K=32路切K+归约 1 1 32 0 0 0 0 True 2 4 K=1, Cube 无用, 走 AIV 向量通路 (该分支详实现待后续迭代) P=1.00, grid_K=32, 部分和驻留L2按4B写出, AIV归约后按C dtype=2B写最终
10 asw_fallback_demo asw_demo_full ASW_Basic Ascend950PR batch_mat_mul_v3 32 1 1 47 1 47 1 B->M->N线性映射+ASW滑窗蛇形(W=4) 0 1 0 176 0 176 0 1024 0 256 1 双缓冲驻留当前tile输入 0 176 0 176 0 80 allocate(输入驻留L2吸收重复读) direct_gm(输出直写GM不占L2) 0 4 0 方案B 52 52 1 52 52 2 139 True 2 IterBatch/MergeBatch 进入条件均不满足 (如负载均衡/搬移效率不达标), 回落 ASW_Basic (该分支详实现待后续迭代); IterBatch未过: 3_L1驻留形态(四选一, 核心要求: 单batch核内零重复读); MergeBatch未过: 1_batch关系与每核份额: BatchA==BatchB 且 b_core=B/C>=2*b0; 2_L0C容量: 2*(b0*M)*(b0*N)*4B <= L0C; 5_访存Bound: 2MN/(M+N) < R16/b0 L2场景B_输入驻留输出直写GM, r_in=1.00; 尾轮: 周长型主导, rho=0.06<rho_dv=0.53, A1b被dValue卡死, 方案B反超
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 direct_gm 0 0 不涉及(每核一块无尾轮) 1 1 1 0 0 0 0 True 2 P=16.00<C, 降核是理性选择 (强切则 tile 跌破搬移效率下限反而更慢)