已关闭
【重构需求】删除 att L0/L2 求解器——L0 不适用 CV 融合场景,L2 硬件命中不可控 #207
zhang_shengjie创建于  7月23日关闭于  27 天前
zhang_shengjie成员
7月23日 创建

删除 att L0/L2 求解器

问题背景

att 的 HighPerf Tiling求解器历史上设计了三段式求解架构:L0 求解器 → L2 求解器 → General 求解器。设计初衷是通过快速确定性启发式先行求解硬件亲和变量(L0A/L0B/L0C 和 L2 相关变量),缩小 General 启发式搜索器的搜索空间,提升求解质量和速度。

  • L0 求解器:针对 cube 算子的 L0A/L0B/L0C 变量,在候选值集合 {16, 32, 64, 128, 256, 512, 1024} 中枚举搜索,目标是最大化 MAC 利用率(要求核数利用率 ≥ 60%)。
  • L2 求解器:在 L2 缓存容量约束(默认 EMPIRIC_L2_SIZE = 128MB)下求解 L2 tiling 变量,并处理多核读冲突,依赖 L0 求解器的输出作为基本块大小(base_val)。

问题描述

随着技术演进,两个求解器已无法满足实际需求:

L0 求解器:仅适用于 cube 算子,不适用于 CV 融合场景

当前 CV 融合(Cube+Vector)使用的是另一套 tiling 方案,L0 求解器的候选值集合和 MAC 利用率最大化目标针对的是纯 cube 计算的硬件特征。CV 融合场景下,vector 部分的计算特征、UB 占用、流水排布与纯 cube 差异显著,L0 求解器的启发式假设不再成立,强行套用会导致次优解或与 CV 融合方案冲突。

L2 求解器:输入输出 Tensor 大小和硬件命中不可控,难以准确估计

L2 求解器的核心约束是 L2 缓存占用不超过容量上限,但实际 L2 占用取决于输入输出 Tensor 的大小和硬件 cache 命中行为:

  • Tensor 大小在编译期 codegen 阶段难以准确获取(依赖运行时 shape、数据排布、padding)
  • 硬件 L2 cache 命中行为受访问模式、prefetch、其他算子竞争等运行时因素影响,编译期无法精确建模

当前 L2 求解器用固定经验值 EMPIRIC_L2_SIZE = 128MBl2_solver_code.h)和符号表达式估算 L2 占用,与实际硬件行为偏差大,求解结果不可靠,可能引导 tiling 走向错误的分块策略。

结论

L0/L2 求解器的假设已失效,继续维护增加代码复杂度却无法产生实际收益,应当删除。HighPerf 路径改为单段 General 求解,由 General 启发式搜索器统一处理全部 tiling 变量,避免 L0/L2 的错误假设带来的风险。

计划方案

前置条件

  1. 完成 HighPerf 与 L0/L2 的解耦(使 HighPerf 不再调用 L0/L2 方法,改为单段 General 求解)
  2. 验证 HighPerf ST(concat/matmul/ffn 等)在解耦后全绿

建议步骤

  1. 删除 L0/L2 运行时模板

    • 删除 solver_pass/l0_solver_code.hsolver_pass/l2_solver_code.h
    • 修改 solver_pass/solver.h/solver.cpp:移除 include 和 L0/L2 分支
  2. 删除 L0/L2 codegen

    • 删除 solver_pass_gen/l0_solver/solver_pass_gen/l2_solver/ 目录
    • 修改 solver_pass_manager.h/.cpp:移除 L0/L2 方法、include,简化遍历逻辑
  3. 收缩 SolverType 枚举

    • 修改 base_types.hSolverType 收缩为 {SEARCH_TILE, ERROR}
  4. 删除 L0/L2 测试

    • 删除 UT/ST 及 source_mirror 中 L0/L2 相关目录
    • 更新 tests/ut/att/CMakeLists.txt 的 glob
  5. 更新 CMake

    • 检查 att/CMakeLists.txt 是否显式引用 L0/L2 源文件,若有则移除

需要验证的点

  1. 编译验证:att 模块编译通过,无 L0/L2 符号残留(L0TileSolverL2TileSolverL0TileSolverGenL2TileSolverGenExecuteL0SolverExecuteL2Solver
  2. General 路径输出正确solver_pass_gen/manager UT 验证 GenFuncPass/GenClassPass 只生成 General 代码
  3. HighPerf ST 全绿:现有 HighPerf ST(concat/matmul/ffn)在单段 General 求解下 tiling 可执行且结果正确
  4. AxesReorder 不受影响:默认 AxesReorder 路径 ST 全绿
  5. 求解质量对比:HighPerf 改单段 General 后,对比改前改后的 tiling 结果和耗时,确认无显著退化
  6. L0/L2 测试已清理:确认无遗留 L0/L2 测试编译引用,CMake 无残留 glob

验证命令

sh build.sh -u --module=autofuse_framework -j 8
sh build.sh -s --module=autofuse_e2e -j 8
likedislike
Zzhang_shengjie成员
7月23日 修改了issue 的描述
Zzhang_shengjie成员
7月23日 修改标题为 “【需求】删除 att L0/L2 求解器——L0 不适用 CV 融合场景,L2 硬件命中不可控”,原标题为“删除 att L0/L2 求解器——L0 不适用 CV 融合场景,L2 硬件命中不可控”
sgd
sgd成员
7月23日 评论:
likedislike
CANN-robotCANN-robot成员
7月23日 将 zhang_shengjie 设为负责人
Zzhang_shengjie成员
7月23日 修改标题为 “【重构需求】删除 att L0/L2 求解器——L0 不适用 CV 融合场景,L2 硬件命中不可控”,原标题为“【需求】删除 att L0/L2 求解器——L0 不适用 CV 融合场景,L2 硬件命中不可控”
Zzhang_shengjie成员
7月23日 修改了issue 的描述
JJett_Woo成员
7月24日 移除了负责人 zhang_shengjie
gcw_NLOuEjCz
7月24日 评论:

@Jett_Woo 老师,这边尝试一下,请求分配

likedislike
JJett_Woo成员
7月24日 将 gcw_NLOuEjCz 设为负责人
Ggcw_NLOuEjCz
8月10日 关联了pull request:refactor: 面向VV融合的求解器,删除L0/L2求解器
CANN-robotCANN-robot成员
27 天前 关闭了 issue
CANN-robotCANN-robot成员
27 天前 添加了label:resolved