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_timing、swimlane_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_layout→init_data_from_layout;runtime_create_from_sm→runtime_reserve_layout |
a5 用新名 |
a2a3 采用 a5 |
成员 payload->prefetch()→自由函数 prefetch_payload() |
a5 已重构 |
a2a3 采用 a5 |
可变参 PTO2_SCOPE_GUARD(...) |
a2a3 仅无参 |
a2a3 采用 a5 |
dead TaskSubmitResult alias |
零使用 |
a2a3 删除 |
pto2_submitted_tasks→submitted_tasks;read_pto2_runtime_status→read_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_layout 的 task_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)
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_timing、swimlane_converter.py在 a5 可用),无需处理。真正需要补齐的是 a5 落后于 a2a3 的调度 / dispatch / AICPU 热路径优化。下表为 a5 当前缺失项总览;补齐顺序见 Proposed Fix。
a5 缺失点总览(a5 落后 a2a3,需从 a2a3 移植)
AsyncCtx::make+ 清 slab + 写两个 context 指针task_tokenready_sync_queues[]Tier-0 专用车道 +run_staging_order共享骨架dummy_ready_queue固定 thread 0(注释"避免跨线程竞争"=未解决竞态)thread_idx < 3)enabled?get_sys_cnt():0prefetch_block_dst预取当前 + 下一块phase_subretire_count,残留旧sched_scan_cycleswimlane_converter.py同 PR)get_pipeline_contract()(Tier-C extern-C ABI,跨仓消费)run()thread-idx 边界检查反向:a2a3 落后 a5(非 arch 命名/重构债务,按 rule 10 一次提交统一到全部树)
init_from_layout→init_data_from_layout;runtime_create_from_sm→runtime_reserve_layoutpayload->prefetch()→自由函数prefetch_payload()PTO2_SCOPE_GUARD(...)TaskSubmitResultaliaspto2_submitted_tasks→submitted_tasks;read_pto2_runtime_status→read_runtime_statussizeof(PTO2TaskSlotState)写"32 bytes"但static_assert为 64文档修正(代码已对,无需改码)
src/a5/.../docs/profiling_levels.mdsrc/a5/.../docs/MULTI_RING.mdpto2_make_task_id()(两树实际都用PTO2TaskId::make)必要差异(arch 决定,不要同步,仅记录以免误判为落后)
pmu_aicore_record_task)a5 独有153daee6)core_num/s_block_idx/s_block_numblock_idx/block_num为内建保留符),不能回退;统一只能 a2a3 采用 a5backend_cookie0xD0、头文件 guardSRC_A5_*待验证:
reserve_layout的task_window_sizes[]重载——一份读法为"a5 缺失(落后)",另一份为"a5 删了 dead 参数(更干净)"。动手前先确认方向。Location
基线
upstream/main@ca22a8f4。两树对照:src/a2a3/runtime/tensormap_and_ringbuffer/src/a5/runtime/tensormap_and_ringbuffer/按缺失点定位:
runtime/scheduler/scheduler_dispatch.cpp,runtime/scheduler/scheduler_cold_path.cppruntime/scheduler/pto_scheduler.h,scheduler_dispatch.cpp,runtime/shared/pto_runtime2_init.cppruntime/scheduler/scheduler_dispatch.cppaicore/aicore_executor.cppruntime/scheduler/scheduler_*+simpler_setup的swimlane_converter.pyhost/runtime_maker.cppaicpu/aicpu_executor.cppProposed Fix
拆成多个小 PR 分批落地(禁止一个大 diff——会与所有在飞分支冲突)。推荐补齐顺序:
backend_cookie/s_block命名swimlane_converter.py+ 文档同一 PR(见 #1382)get_pipeline_contract()core_num方向为 a2a3 采用 a5关联:#1548, #545。
Priority
Medium (minor risk, should fix in next few releases)