已合并
fix: 修复 ATT 注册表并删除历史 pass #1821
zhang_shengjie创建于 9 天前
fix: 修复 ATT 注册表并删除历史 pass #1821
已合并
Pull Request已成功合入, 合并人@CANN-robot
(感谢 zhang_shengjie 的贡献)9 天前 创建了 pull request,commit aeaaca6f
atomgit-bot
9 天前 评论:
9 天前 评论:
变更摘要
本 PR 主要修复 ATT 性能函数注册表在并发访问和静态初始化阶段的风险,并清理不再被真实 ModelInfo 输出及下游消费者使用的历史 pass 链路。一方面为 EvalCosts 的 ASCIR/AscendC 注册表增加同一把 std::mutex 保护,并让 ApiPerfFactory::Create 在锁内复制 creator、解锁后再执行;另一方面将全局注册点改为保存性能函数 key(如 kAdd、kUnitVector),创建对象时才通过 GetPerfFunc 解析,避免静态初始化阶段解析带来的风险。同时删除 ATTPassMgr/matmul_align_pass 相关代码与测试。
主要改动
- 并发保护
EvalCosts注册表:在ascendc_api_perf.h中为EvalCosts新增std::mutex,RegisterFunc、RegisterAscendCFunc、GetFunc、GetAscendCFunc的读写均加锁,并将读操作改为find后返回迭代器值,消除并发读写风险。 ApiPerfFactory锁外执行 creator:api_perf_factory.cpp的Create改为在锁内查找并复制 creator,解锁后再调用creator(class_name),避免持锁执行用户注册的创建逻辑。- 注册点改为保存 key、创建时解析:
api_perf_factory.h新增带perf_func_name参数的ApiPerfRegister构造函数并声明GetPerfFunc;ascir_api_perf_v1.cpp中所有注册点由GetPerfFunc(kXxx)改为直接传kXxx(ascir_api_perf_v2.cpp同步调整),保留kUnitVector、select/where(kSelect→kWhere)等特殊 key 映射,避免静态初始化阶段提前解析函数。 - 删除历史 pass 链路:删除
pass/pass_mgr.h(ATTPassMgr、PassRegister、REGISTER_GTC_PASS)与pass/matmul_align_pass.cpp,并从gen_model_info.cpp的GenerateSingleModelInfoWithContext中移除执行 pass 生成att_config的步骤。 - 删除对应测试:删除针对 pass 链路的 ST 用例
test_att_config.cpp和 UT 用例test_matmul_align_pass.cpp。


atomgit-bot
9 天前 评论:
9 天前 评论:
9 天前 添加了label:stat/needs-squash
9 天前 添加了label:cann-cla/yes
此处折叠了52条消息 查看更多
8 天前 关联了issue:fix: 修复 ATT 性能函数注册表并发安全并清理历史 pass
8 天前 修改了pull request 的描述
8 天前 添加了label:approved
8 天前 合入了pull request
Pull Request
描述
一、主要解决的问题
EvalCosts使用unordered_map保存 ASCIR/AscendC 函数。注册、查找和遍历操作缺少统一同步保护,存在并发读写及静态初始化阶段访问风险。ApiPerfFactory的全局注册点过早解析性能函数,可能在注册表尚未完成初始化时访问。ATTPassMgr/pass_mgr.h/matmul_align_pass已不在当前产品 CV 融合路径使用,相关实现和测试继续保留会增加维护与构建负担。二、修改方案
EvalCosts内增加std::mutex,统一保护 ASCIR/AscendC 注册表的注册、查找和列表遍历。ApiPerfFactory查找时在锁内复制 creator,释放锁后创建对象,避免锁内执行创建逻辑。kUnitVector、select/where、true_div/div和 V2 key。ATTPassMgr/pass_mgr.h/matmul_align_pass实现,以及对应 ST/UT 测试和ModelInfo过时代码路径。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
如何测试
一、测试用例说明
1.1 单元测试
1.2 系统测试
ASCEND_HOME_PATH=$HOME/Ascend/cann cmake --build build --target aihac_codegen -j 8:通过。git diff --check upstream/develop...HEAD:通过。核对清单
其他信息
验证方法
upstream/develop。1077921使用 HEAD35f01f80ba72执行成功,并生成ci-pipeline-passed标签。注意事项
提交记录
9d220d5c3aee26c7a9f9b37e8301005635f01f80修改文件清单
autofuse/att/gen_model_info/api_perf_register/api_perf_factory.cppautofuse/att/gen_model_info/api_perf_register/api_perf_factory.hautofuse/att/gen_model_info/api_perf_register/ascendc_api_perf.hEvalCosts互斥保护autofuse/att/gen_model_info/api_perf_register/v1/ascir_api_perf_v1.cppautofuse/v35/att/api_perf_register/ascir_api_perf_v2.cppautofuse/att/gen_model_info/gen_model_info.cppautofuse/att/gen_model_info/pass/pass_mgr.hautofuse/att/gen_model_info/pass/matmul_align_pass.cppautofuse/tests/ut/att/testcase/gen_model_info/pass/test_matmul_align_pass.cppautofuse/tests/st/att/testcase/source_mirror/gen_model_info_content/test_att_config.cpp