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 是「补位」而非「主选」