| feat: 添加ge_session_registry功能
Co-authored-by: stevenaw0<huangguijun@huawei.com>
# message auto-generated for no-merge-commit merge:
!1151 merge feat/ge-session-registry into develop
feat: 添加ge_session_registry功能
Created-by: stevenaw0
Commit-by: stevenaw0
Merged-by: cann-robot
Description: ## 描述
新增 ge_session_registry 功能,用于管理 GE session 的生命周期和资源清理。
## 变更类型
请选择本次引入的变更类型:
<!-- [x] 表示选中 -->
- [ ] ✨ 新功能
- [x] 🐛 Bug 修复
- [ ] 💄 代码风格更新(格式化,局部变量)
- [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动)
- [ ] 📦 构建过程或辅助工具的变动
- [ ] 📝 文档内容更新
## 关联的Issue
<!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 -->
无
## 如何测试
编译并运行相关测试用例验证新增功能:
1. 确保 GEFinalizeV2() 正确调用 FinalizeAllSessions()
2. 确保多个 session 的资源都能被正确清理
## 核对清单
<!-- [x] 表示选中 -->
- [x] 我的代码遵循了项目的代码风格
- [x] 我已对代码进行了自测
- [x] 我已更新了相关的文档
- [x] 我在标题中使用了合适的类型标签(如:feat:)
- [x] 我已经详细阅读了贡献指南,并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等
## 其他信息
### 本次修改的改动说明
#### 为什么需要这样修改?
1. **问题背景**:原有的 GE 机制在 GEFinalizeV2() 调用时,创建的 session 不会被清理
2. **核心痛点**:每个 session 的 inner_session_ 需要在程序结束时手动调用 Finalize(),但没有集中管理的机制
3. **潜在风险**:如果先调用GEFinalizeV2(),后释放GeSession,会触发资源释放与模型卸载,但是全局的资源已经在GEFinalizeV2中释放了,容易出现未定义行为。
#### 具体实现方案
1. **新增 ge_session_registry**:使用单例模式创建全局 session 注册表
2. **注册机制**:在 GeSession::Impl 构造函数中,将 session 的 finalize 函数注册到 registry
3. **清理机制**:在 GEFinalizeV2() 中调用 FinalizeAllSessions(),遍历所有注册的 session 执行 Finalize 并清理
4. **线程安全**:使用 std::mutex 保护注册表,确保多线程安全
#### 修改文件说明
- ge_session_registry.h:新增 session 注册表实现
- ge_session_impl.h/cc:在构造/析构时注册/注销 session
- ge_api_v2.cc:在 GEFinalizeV2() 中调用 FinalizeAllSessions()
#### 代码要点
- 使用单例模式管理全局 session 注册表
- 使用函数式编程存储 finalize 函数,支持灵活的清理逻辑
- 线程安全的实现,避免并发访问问题
- RAII 机制,确保 session 销毁时自动清理
See merge request: cann/ge!1151 | 2 个月前 |