From a5a35cae830a0a06b788efc9e4c35bb8b3e1a039 Mon Sep 17 00:00:00 2001 From: admin Date: Fri, 28 Aug 2026 08:14:45 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=9A=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E5=AE=98=E6=96=B9=E7=BA=A6=E6=9D=9F=E5=87=BA=E5=A4=84=EF=BC=8C?= =?UTF-8?q?=E6=BE=84=E6=B8=85=E9=AB=98=E9=98=B6API=E7=BA=A6=E6=9D=9F?= =?UTF-8?q?=E4=B8=8E=E5=BA=95=E5=B1=82unitFlag=3D2/3=E6=9C=BA=E5=88=B6?= =?UTF-8?q?=E7=9A=84=E4=B8=A4=E5=B1=82=E5=8C=BA=E5=88=AB=EF=BC=8C=E7=BA=A0?= =?UTF-8?q?=E6=AD=A3K=E5=88=86=E6=AE=B5=E7=B4=AF=E5=8A=A0=E8=AE=BA?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Matmul/UnitFlag能否取代L0C_DoubleBuffer.html | 93 ++++++++++++++------ 1 file changed, 65 insertions(+), 28 deletions(-) diff --git a/Matmul/UnitFlag能否取代L0C_DoubleBuffer.html b/Matmul/UnitFlag能否取代L0C_DoubleBuffer.html index 3033796..34f902b 100644 --- a/Matmul/UnitFlag能否取代L0C_DoubleBuffer.html +++ b/Matmul/UnitFlag能否取代L0C_DoubleBuffer.html @@ -95,15 +95,16 @@ L0C.A(块n+2): [==== MMAD ====]···
  • UnitFlag 达到 ≈max(t_mm,t_fp) 几乎无条件(块内 512B 流水),还省下 L0C 容量(这份容量可用来把 baseM/baseN 做大,减少重复读)。
  • 所以在 UnitFlag 合法域内,DB 相对它没有独立价值,可以被取代。你的直觉在这一层是对的。

    -

    3.2 从合法域看:UnitFlag 有硬约束,DB 是兜底

    -

    UnitFlag 的官方约束(缺一不可):

    +

    3.2 从合法域看:UnitFlag 有约束,DB 是兜底

    + +

    高阶 API 层官方约束(出处:昇腾官网 → CANN → 算子实践参考 → 优秀实践 → Matmul 性能调优案例 → 《Matmul 高阶 API 开启 UnitFlag》社区版 / 《Matmul 高阶 API 使能 UnitFlag》商用版,"约束条件"一节,逐字摘录):

      -
    1. 模板限制:仅 Norm / IBShare / MDL 三模板;
    2. -
    3. 流水互斥:使能后不允许同时存在 CO1(L0C)→GM 与 A1(L1)→GM 两种搬出流水
    4. -
    5. 累加限制:使能 + L0C 累加时,不支持多次 Iterate、一次 GetTensorC 输出
    6. -
    7. 收益前提:仅当 MMAD 与 Fixpipe 串行且未被 MTE2 等其他流水掩盖时才有收益。
    8. +
    9. 模板限制:UnitFlag 功能仅支持 Norm、IBShare、MDL 三个模板。
    10. +
    11. 流水互斥:开启 UnitFlag 功能时,不支持算子内同时存在 L0C Buffer(CO1)搬出到 Global Memory 和 L1 Buffer(A1)搬出到 Global Memory 的两种流水
    12. +
    13. 累加限制:开启 UnitFlag 功能时,若同时开启 L0C 累加 功能,不支持多次 Iterate 计算、一次 GetTensorC 输出
    14. +
    15. 收益前提:仅当 MMAD 流水与 FIXPIPE 流水串行执行且未被其他流水掩盖(比如 MTE2 Bound)时,开启 UnitFlag 才有收益;否则收益很小。
    -

    凡是落在这些约束之外的场景(最典型就是 §2.2 的多分片 K 在 L0C 累加),UnitFlag 直接不可用,只能退回到 L0C DB 做块间掩盖。

    +

    这四条是官方文档明确写出的原文(第 2、3 条在 §3.4 逐条考据)。落在高阶 API 约束之外的场景,UnitFlag 不可用,只能退回 L0C DB 做块间掩盖。

    3.3 从 mat_mul_v3 实际看:默认已开 UnitFlag,DB 是「补位」而非「主选」