Skip to content

[Code Health] Reconcile a2a3 vs a5 tensormap_and_ringbuffer runtime implementation divergence #1582

Description

@ChaoZheng109

Category

Technical Debt (cleanup, refactor)

Component

AICPU Scheduler

Description

tensormap_and_ringbuffer (tmr) 运行时有两份近乎重复的实现:src/a2a3/runtime/tensormap_and_ringbuffer/src/a5/runtime/tensormap_and_ringbuffer/。目标是两份实现尽量保持一致,仅在硬件/架构确有要求处才允许差异

对 tmr 全树做内容级 diff(基线 upstream/main @ ca22a8f4)后的结论:文件结构完全相同(a5 仅多 urma 后端),差异全在实现内容。strace / timing / L2-swimlane / profiling 计装已代码级对齐strace_timingswimlane_converter.py 在 a5 可用),无需处理。

真正需要补齐的是 a5 落后于 a2a3 的调度 / dispatch / AICPU 热路径优化。下表为 a5 当前缺失项总览;补齐顺序见 Proposed Fix。

a5 缺失点总览(a5 落后 a2a3,需从 a2a3 移植)

# 领域 a5 当前状态 a2a3 已有能力 影响 关联
1 dispatch 热路径 每次派发都 AsyncCtx::make + 清 slab + 写两个 context 指针 init() 里按 (core,buf) 一次性预填常量字段,每次派发只写 task_token 性能(每任务) 最大
2 调度结构 无正常 sync_start 车道,所有 sync_start 走 stop-the-world drain ready_sync_queues[] Tier-0 专用车道 + run_staging_order 共享骨架 性能 + 结构 最大结构差 #1548
3 调度并发 dummy_ready_queue 固定 thread 0(注释"避免跨线程竞争"=未解决竞态) 跨 sched 线程分摊 (thread_idx < 3) 正确性(疑似竞态)
4 dispatch 分派 正常 dispatch 路径整簇分类 MIX(drain 路径已有拆分) 正常路径按核拆分 gated MIX 性能 #1308
5 AICore executor 旧合并型 L2 记录;DFX 关也每次读计时器;记录可能跨缓冲代 reserve/commit 拆分 + 计时门控 enabled?get_sys_cnt():0 正确性 + 性能 #1513
6 dispatch 微优化 prefetch_block_dst 预取当前 + 下一块 性能(低风险)
7 DFX 计数 phase_subretire_count,残留旧 sched_scan_cycle 完整计数 可观测性(须与 swimlane_converter.py 同 PR) #1382
8 host 接口 get_pipeline_contract()Tier-C extern-C ABI,跨仓消费) 能力缺失(需协调移植) #1463
9 AICPU 健壮性 run() thread-idx 边界检查 健壮性(轻微) #1119

反向:a2a3 落后 a5(非 arch 命名/重构债务,按 rule 10 一次提交统一到全部树)

说明 方向
init_from_layoutinit_data_from_layoutruntime_create_from_smruntime_reserve_layout a5 用新名 a2a3 采用 a5
成员 payload->prefetch()→自由函数 prefetch_payload() a5 已重构 a2a3 采用 a5
可变参 PTO2_SCOPE_GUARD(...) a2a3 仅无参 a2a3 采用 a5
dead TaskSubmitResult alias 零使用 a2a3 删除
pto2_submitted_taskssubmitted_tasksread_pto2_runtime_statusread_runtime_status PTO2 前缀退役仅落在 a5 a2a3 同步
a5 注释 sizeof(PTO2TaskSlotState) 写"32 bytes"但 static_assert 为 64 a5 注释错误 改 a5 注释

文档修正(代码已对,无需改码)

文档 问题
src/a5/.../docs/profiling_levels.md 描述旧 complete_task 结合型 level-1,与 a5 自身 decoupled 代码矛盾
src/a5/.../docs/MULTI_RING.md 写了不存在的 API pto2_make_task_id()(两树实际都用 PTO2TaskId::make

必要差异(arch 决定,不要同步,仅记录以免误判为落后)

原因 关联
AICore PMU per-task ring(pmu_aicore_record_task)a5 独有 a5 领先;a2a3 硬件能力不足,不 back-port
a5 删除 cache invalidate/flush(deinit / async-wait counter-line / SDMA record / PMU record) a5 AICPU 与 DMA/HBM 缓存一致,顺序由 acquire/release 原子保证;a3 需要而 a5 不需要 #1235 (153daee6)
core_num / s_block_idx / s_block_num a5 编译器要求block_idx/block_num 为内建保留符),不能回退;统一只能 a2a3 采用 a5
urma 后端 + backend_cookie a5 硬件专有 #1392
核数/频率常量、DMB MMIO 偏移 0xD0、头文件 guard SRC_A5_* dav-c310 硬件

待验证reserve_layouttask_window_sizes[] 重载——一份读法为"a5 缺失(落后)",另一份为"a5 删了 dead 参数(更干净)"。动手前先确认方向。

Location

基线 upstream/main @ ca22a8f4。两树对照:

  • src/a2a3/runtime/tensormap_and_ringbuffer/
  • src/a5/runtime/tensormap_and_ringbuffer/

按缺失点定位:

Proposed Fix

拆成多个小 PR 分批落地(禁止一个大 diff——会与所有在飞分支冲突)。推荐补齐顺序:

阶段 包含项 目标 前置 / 风险
P0 热路径性能 #1, #4, #5, #6 补齐每任务开销最大的 AICPU/AICore dispatch 优化(自包含、低风险) #5 需与 a5 的 PMU-ring/lazy-head 代码协调;保留 a5 的 backend_cookie/s_block 命名
P1 调度结构决策 #2, #3 补齐 sync_start 车道与 dummy-drain 并发 需 sync_start / dep-pool owner 签字:是移植 a2a3 双车道,还是正式采纳 a5 单车道;#3 是竞态需优先确认
P2 DFX 对齐 #7 swimlane 计数对齐 必须与 swimlane_converter.py + 文档同一 PR(见 #1382
P3 外部 ABI #8 get_pipeline_contract() Tier-C ABI,需与跨仓消费方协调,勿盲拷
P4 命名统一 反向表全部 消除非 arch 命名债务 rule 10:一个方向、全部树一次提交;core_num 方向为 a2a3 采用 a5
P5 文档 profiling_levels.md, MULTI_RING.md 修文档 无依赖,可随时做

关联:#1548, #545

Priority

Medium (minor risk, should fix in next few releases)

Metadata

Metadata

Assignees

No one assigned

    Labels

    code healthTechnical debt, robustness, code quality

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions