diff --git a/BMM/BMM_Theory/bmm_theory/branches/asw_basic.py b/BMM/BMM_Theory/bmm_theory/branches/asw_basic.py index c996e33..6a555c6 100644 --- a/BMM/BMM_Theory/bmm_theory/branches/asw_basic.py +++ b/BMM/BMM_Theory/bmm_theory/branches/asw_basic.py @@ -96,9 +96,11 @@ class AswBasicBranch(Branch): l2_out = "direct_gm(输出直写GM不占L2)" r_in = self._l2_group_r_in(case, single_m, single_n) - # Step 6: k_l1 (GM->L1 K 向粒度, 须 >= 256B/dt) + # Step 6: k_l1 (GM->L1 K 向粒度, 须 >= dValue 下限; K 小于下限时整 K 一次搬入不切) + dv_min_elems = max(s.dvalue_hw_min // dt, 1) k_l1 = min(k, s.dvalue_recommend // dt) - k_l1 = max(k_l1, s.dvalue_hw_min // dt) + if k_l1 < dv_min_elems: + k_l1 = k # K 本身小于 dValue 下限: 不切 K, 整段搬入 (K 非连续维, dValue 由 M/N 保证) # ---- 尾轮决策 (必要组成环节) ---- n_blk = b * m_cnt * n_cnt @@ -130,10 +132,16 @@ class AswBasicBranch(Branch): """降核模式: 只用 ceil(P) 核, 每核一个 L0C 满载输出块.""" s = self.spec used = max(1, math.ceil(p)) - # SingleCoreM/N 在 L0C 容量内取最大 + dt = case.dtype_in_bytes + # SingleCoreM/N 在 L0C 容量内取最大, 收敛到不越界 (issue#5: 降核漏容量反推) + from ..constraints import clamp_base_mn_l0c, clamp_base_k single_mn = int(math.sqrt(s.l0c_bytes // 4)) # L0C/4B 单份 single_m = min(case.m, align_down(single_mn, s.fractal)) single_n = min(case.n, align_down(single_mn, s.fractal)) + # 降核每核单份 L0C (double_buffer=False) + single_m, single_n = clamp_base_mn_l0c(single_m, single_n, False, s) + # base_k 由 L0A/L0B 容量按 dtype 反推 (issue#5: 原硬编码 min(K,64) 在 fp32 下溢出) + base_k = clamp_base_k(single_m, single_n, dt, case.k, s) return ImplPlan( case_id=case.case_id, branch=self.name + "_降核", used_core_num=used, @@ -142,10 +150,10 @@ class AswBasicBranch(Branch): core_map=f"降核: 只用{used}核, 每核一个L0C满载输出块, 其余核闲置", b_core=0, merge_b0=1, single_core_m=single_m, single_core_n=single_n, single_core_k=case.k, - k_l1=min(case.k, s.dvalue_recommend // case.dtype_in_bytes), b_l1=1, + k_l1=min(case.k, s.dvalue_recommend // dt), b_l1=1, l1_form="标准核内流水", base_m=single_m, base_n=single_n, - base_k=min(case.k, 64), + base_k=base_k, l2_policy_in="allocate", l2_policy_out="direct_gm", swizzle_w=0, workspace_bytes=0, tail_strategy="不涉及(每核一块无尾轮)",