已合并
fix: 修复 ATT 注册表并删除历史 pass #1821
fix: 修复 ATT 注册表并删除历史 pass #1821
已合并
zhang_shengjie创建于 9 天前
zhang_shengjie成员
9 天前

Pull Request

描述

一、主要解决的问题

  1. ATT 性能函数注册表 EvalCosts 使用 unordered_map 保存 ASCIR/AscendC 函数。注册、查找和遍历操作缺少统一同步保护,存在并发读写及静态初始化阶段访问风险。
  2. ApiPerfFactory 的全局注册点过早解析性能函数,可能在注册表尚未完成初始化时访问。
  3. 历史 ATTPassMgr/pass_mgr.h/matmul_align_pass 已不在当前产品 CV 融合路径使用,相关实现和测试继续保留会增加维护与构建负担。

二、修改方案

  • EvalCosts 内增加 std::mutex,统一保护 ASCIR/AscendC 注册表的注册、查找和列表遍历。
  • ApiPerfFactory 查找时在锁内复制 creator,释放锁后创建对象,避免锁内执行创建逻辑。
  • 全局注册点延迟保存和解析性能函数 key,规避静态初始化顺序问题。
  • 保留 v1/v35 特殊 key 映射,包括 kUnitVectorselect/wheretrue_div/div 和 V2 key。
  • 删除历史 ATTPassMgr/pass_mgr.h/matmul_align_pass 实现,以及对应 ST/UT 测试和 ModelInfo 过时代码路径。
  • 按 clang-format 18.1.8 规范化 ATT 注册相关源文件,修复 codecheck_precommit 检查失败。

三、代码修改流程图

sequenceDiagram
    participant Register as 注册阶段
    participant Registry as EvalCosts 注册表
    participant Factory as ApiPerfFactory
    participant Worker as 线程执行阶段
    Register->>Registry: 加锁写入 ASCIR/AscendC creator
    Worker->>Factory: 请求创建性能对象
    Factory->>Registry: 加锁查找并复制 creator
    Registry-->>Factory: 返回 creator
    Factory-->>Worker: 解锁后创建对象

变更类型

关联的Issue

  • #283(fix: 修复 ATT 性能函数注册表并发安全并清理历史 pass)

如何测试

一、测试用例说明

1.1 单元测试

  • ATT UT:1062/1062 通过。
  • pre-commit:clang-format、pre-commit-hooks、codespell、OAT 全部通过。

1.2 系统测试

  • ATT ST:110/110 通过。
  • ASCEND_HOME_PATH=$HOME/Ascend/cann cmake --build build --target aihac_codegen -j 8:通过。
  • git diff --check upstream/develop...HEAD:通过。

核对清单

其他信息

验证方法

  • 基线分支:upstream/develop
  • 远端流水线 1077921 使用 HEAD 35f01f80ba72 执行成功,并生成 ci-pipeline-passed 标签。

注意事项

  • 本 PR 不包含 docs 提交。
  • 当前 CV 融合路径不使用历史 ATT matmul pass,删除范围仅覆盖确认无产品消费者的实现和测试。

提交记录

Commit 描述 修改文件数 修改行数
9d220d5c 保护 ATT 性能注册表 1 +10/-8
3aee26c7 延迟 ATT 性能函数查找 4 +243/-219
a9f9b37e 删除历史 ATT pass manager 5 +0/-307
83010056 保留最新 ATT 注册映射 1 +1/-3
35f01f80 修复 ATT 文件格式 2 +267/-298

修改文件清单

文件路径 修改类型 说明
autofuse/att/gen_model_info/api_perf_register/api_perf_factory.cpp 修改 creator 查找与对象创建同步策略
autofuse/att/gen_model_info/api_perf_register/api_perf_factory.h 修改 注册工厂接口与延迟解析支持
autofuse/att/gen_model_info/api_perf_register/ascendc_api_perf.h 修改 EvalCosts 互斥保护
autofuse/att/gen_model_info/api_perf_register/v1/ascir_api_perf_v1.cpp 修改 v1 注册映射和格式化
autofuse/v35/att/api_perf_register/ascir_api_perf_v2.cpp 修改 v35/V2 注册映射和格式化
autofuse/att/gen_model_info/gen_model_info.cpp 修改 移除历史 pass 使用链路
autofuse/att/gen_model_info/pass/pass_mgr.h 删除 历史 pass manager
autofuse/att/gen_model_info/pass/matmul_align_pass.cpp 删除 历史 matmul pass
autofuse/tests/ut/att/testcase/gen_model_info/pass/test_matmul_align_pass.cpp 删除 对应 UT
autofuse/tests/st/att/testcase/source_mirror/gen_model_info_content/test_att_config.cpp 删除 对应 ST 配置镜像
likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 zhang_shengjie 的贡献)
Zzhang_shengjie成员
9 天前 创建了 pull request,commit aeaaca6f
atomgit-bot
atomgit-bot
9 天前 评论:

变更摘要

本 PR 主要修复 ATT 性能函数注册表在并发访问和静态初始化阶段的风险,并清理不再被真实 ModelInfo 输出及下游消费者使用的历史 pass 链路。一方面为 EvalCosts 的 ASCIR/AscendC 注册表增加同一把 std::mutex 保护,并让 ApiPerfFactory::Create 在锁内复制 creator、解锁后再执行;另一方面将全局注册点改为保存性能函数 key(如 kAddkUnitVector),创建对象时才通过 GetPerfFunc 解析,避免静态初始化阶段解析带来的风险。同时删除 ATTPassMgr/matmul_align_pass 相关代码与测试。

主要改动

  • 并发保护 EvalCosts 注册表:在 ascendc_api_perf.h 中为 EvalCosts 新增 std::mutexRegisterFuncRegisterAscendCFuncGetFuncGetAscendCFunc 的读写均加锁,并将读操作改为 find 后返回迭代器值,消除并发读写风险。
  • ApiPerfFactory 锁外执行 creatorapi_perf_factory.cppCreate 改为在锁内查找并复制 creator,解锁后再调用 creator(class_name),避免持锁执行用户注册的创建逻辑。
  • 注册点改为保存 key、创建时解析api_perf_factory.h 新增带 perf_func_name 参数的 ApiPerfRegister 构造函数并声明 GetPerfFuncascir_api_perf_v1.cpp 中所有注册点由 GetPerfFunc(kXxx) 改为直接传 kXxxascir_api_perf_v2.cpp 同步调整),保留 kUnitVectorselect/wherekSelectkWhere)等特殊 key 映射,避免静态初始化阶段提前解析函数。
  • 删除历史 pass 链路:删除 pass/pass_mgr.hATTPassMgrPassRegisterREGISTER_GTC_PASS)与 pass/matmul_align_pass.cpp,并从 gen_model_info.cppGenerateSingleModelInfoWithContext 中移除执行 pass 生成 att_config 的步骤。
  • 删除对应测试:删除针对 pass 链路的 ST 用例 test_att_config.cpp 和 UT 用例 test_matmul_align_pass.cpp
likedislike
atomgit-bot
atomgit-bot
9 天前 评论:

代码审查

✅ 未发现问题

likedislike
CANN-robotCANN-robot成员
9 天前 添加了label:stat/needs-squash
CANN-robotCANN-robot成员
9 天前 添加了label:cann-cla/yes
此处折叠了52条消息 查看更多
Zzhang_shengjie成员
8 天前 关联了issue:fix: 修复 ATT 性能函数注册表并发安全并清理历史 pass
Zzhang_shengjie成员
8 天前 修改了pull request 的描述
张德鹏成员
8 天前 评论:

/approve

likedislike
CANN-robotCANN-robot成员
8 天前 添加了label:approved
CANN-robotCANN-robot成员
8 天前 合入了pull request