已关闭
[Requirement|需求建议]: 统一 Runtime Task 资源管理公共接口并收敛平台强转 #752
daijinling创建于  7月17日关闭于  1 天前
daijinling成员
7月17日 创建

[Requirement|需求建议]: 统一 Runtime Task 资源管理公共接口并收敛平台强转

Background(背景信息)

Runtime 中 TaskInfo 的申请、查询、正常完成回收和提交失败回退分布在 A2/A3、A5、DQS、XPU 等不同资源模型中。Stream::taskResMang_ 的静态类型已经是 TaskResManage*,A5/XPU 使用的 TaskResManageDavid 也继承自该基类,但公共查询和资源状态接口尚未完全在基类统一:

  • GetTaskInfoResetTaskRes 等已有虚函数仍有调用点先转换为 TaskResManageDavid* 再调用。
  • head、tail、empty、pending 在不同产品中的业务含义一致,但部分接口只在 A5 实现类中声明,Stream、Task 提交和回收代码只能依赖具体实现类型。
  • A5/XPU 的申请、多 SQE 回收、失败回退与位置校验确有专用语义;若把这些操作与公共只读状态混在一起,要么造成重复类型转换,要么会以无效基类接口掩盖错误调用。

因此先完成 TaskResManage 公共成员的多态归一:公共状态和查询通过基类指针调用,由实际对象选择 A2/A3 环或 A5/XPU A 环;平台专用修改操作继续留在 TaskResManageDavid。本需求不改变现有 Task 申请、回收和 SQE 提交流程。

Origin(信息来源)

Runtime Task 资源管理架构演进与可维护性治理。

Benefit / Necessity(价值/作用)

  • 统一 TaskResManage 公共查询和状态接口,调用方不再为了访问同义成员依赖 TaskResManageDavid,降低平台实现对 core 调用链的渗透。
  • 保持 A2/A3 完整 Task ID 资源环与 A5/XPU pos + sqeNum A 环的既有语义,通过虚分派复用调用方式而不混淆底层模型。
  • 明确公共接口与平台专用接口的边界:只读状态和共同查询进入基类;申请、批量回收、失败回退、位置校验和分配计数仍由 A5/XPU 专用接口负责。
  • 删除 GetTaskPosHeadGetTaskPosTail 与公共 head/tail 的同义命名,减少后续调用点选择和维护成本。
  • 改造不增加锁、原子操作、内存申请或数据复制,不修改对外 API、Task ID、内存布局和资源所有权,控制重构风险。

Design(设计方案)

公共接口

TaskResManage 中统一以下虚接口:

virtual TaskInfo* GetTaskInfo(uint32_t taskId) const;
virtual void ResetTaskRes();
virtual uint16_t GetResHead() const;
virtual uint16_t GetResTail() const;
virtual void GetHeadTail(uint16_t& head, uint16_t& tail) const;
virtual bool IsEmpty() const;
virtual uint16_t GetPendingNum();

A2/A3 默认实现读取 taskResHead_taskResTail_,pending 按 (tail + pool - head) % pool 计算;GetTaskInfo 继续按完整 Task ID 校验有效区间、保存 ID 和 0xFFFF 无效值。

TaskResManageDavid override 资源状态接口并直接读取 taskResAHead_taskResATail_。一个 A5/XPU Task 可占用多个连续 SQ 位置,GetTaskInfo 仍支持从任一占用位置反查首 pos 的完整 TaskInfo。旧 GetTaskPosHeadGetTaskPosTail 删除,统一使用 GetResHeadGetResTail

调用点迁移

  • DavidStream 的 TearDown、SQ 位置、等待/完成判断、延迟回收、资源清理和 Task 查询统一通过 taskResMang_ 调用公共接口。
  • A5 的 Task 提交、CQ/SQ 回收、同步和模型绑定 Stream 清理路径移除仅用于公共成员访问的具体类型转换。
  • XPU 的 Stream 状态、Task 查询和回收边界读取同样通过基类指针分派。
  • 已有测试和 mock 中的旧 getter 更新为公共接口名称。

专用接口边界

以下接口不提升到基类,调用点可保留一次明确的 TaskResManageDavid* 转换:

  • AllocTaskInfoAndPos
  • RecycleTaskInfo(pos, sqeNum)
  • RollbackTail
  • IsRecyclePosValid
  • GetAllocNum

这些接口会修改 A 环或依赖多 SQE、最近一次分配等专用状态,A2/A3 没有等价契约,不能通过空实现或无效 override 归一。

实现范围

本次只实施 TaskResManage 成员函数多态归一。以下内容保持不变:

  • Stream::AllocTask 和各产品 TaskInfo 申请来源。
  • A2/A3 正常回收与 STARS 分离回收。
  • A5/XPU 多 SQE 申请、批量回收和提交失败回退。
  • SQE 构造、驱动交互、Task ID、taskSnpossqeNum、内存布局和对外 API。
  • Stream 创建期申请/回收函数绑定,作为后续独立批次实施。

测试设计

  • A2/A3:通过 TaskResManage* 覆盖空、满、跨零点、pending、完整 ID、0xFFFF、位置复用和 STARS head 推进。
  • A5:通过基类指针覆盖单/多 SQE、后续位置反查首 pos、head/tail/pending、回收和 reset。
  • DQS、XPU:在实际 Stream 资源管理对象上验证虚分派读取 A 环,专用申请和回收仍走原接口。
  • 静态检查所有 TaskResManageDavid 转换,保留项必须调用申请、回收、回退、位置校验或分配计数等专用成员。

Implementation / Acceptance(实现与验收)

对应 PR:https://gitcode.com/cann/runtime/merge_requests/3707

验收项 结果
交付提交 18fbb0326f72bd3ed68ab600f066d7d832752b32
编译 PASS;bash build.sh
LLT 未执行;按本次交付要求仅验证编译,不声明 LLT/HLT 通过
文档同步 PASS;docs/zh/design/modules/task/task.md 类图与当前接口一致
测试审计与代码审查 PASS;独立测试审计 clean,文档漂移修复后第二轮独立 review clean
likedislike
Ddaijinling成员
7月17日 添加了label:requirement
Ddaijinling成员
7月17日 关联了pull request:refactor: 统一 Runtime Task 资源申请与回收接口,收敛选路(#752)
Ddaijinling成员
7月17日 修改了issue 的描述
Ddaijinling成员
8月3日 修改了issue 的描述
Ddaijinling成员
27 天前 修改了issue 的描述
Ddaijinling成员
25 天前 修改标题为 “[Requirement|需求建议]: 统一 Runtime Task 资源管理公共接口并收敛平台强转”,原标题为“[Requirement|需求建议]: 统一 Runtime Task 资源申请与回收接口(收敛选路)”
Ddaijinling成员
24 天前 修改了issue 的描述
Ddaijinling成员
24 天前 修改了issue 的描述
Ddaijinling成员
18 天前 修改了issue 的描述
CANN-robotCANN-robot成员
1 天前 关闭了 issue
Ddaijinling成员
1 天前 issue状态由 进行中 改变为 已完成
CANN-robotCANN-robot成员
1 天前 添加了label:resolved