CANN/cannbot-skills:管道同步操作

📅 2026/7/11 17:11:01
CANN/cannbot-skills:管道同步操作
管道同步操作 — set_flag / wait_flag / pipe_barrier【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills关键词Pipe Sync, Event ID, set_flag, wait_flag, pipe_barrier, Pipeline Synchronization概述管道同步操作是 HIVM 中最细粒度的同步机制用于同一 Block 内不同 Pipeline 之间的协调。NPU 的多 Pipeline 架构中MTE1/MTE2/MTE3/M/V 等 Pipeline 可以并行执行但存在数据依赖时需要通过 Event Flag 机制保证执行顺序。三个核心操作hir.set_flag在 set_pipe 上设置 Event Flag通知 wait_pipe 数据已就绪hir.wait_flag在 wait_pipe 上等待 Event Flag阻塞直到数据就绪hir.pipe_barrierPipeline 屏障等待该 Pipe 上所有先前操作完成IR 操作定义SetFlagOp从 HIVMSynchronizationOps.td 提取def SetFlagOp : HIVM_SynchronizationOpset_flag { let arguments (ins HIVM_PipeAttr:$set_pipe, HIVM_PipeAttr:$wait_pipe, OptionalAttrHIVM_EventAttr:$static_event_id, OptionalI64:$dynamic_event_id); let assemblyFormat [{ [ $set_pipe , $wait_pipe , customEventID($static_event_id, $dynamic_event_id) ] attr-dict }]; }WaitFlagOp从 HIVMSynchronizationOps.td 提取def WaitFlagOp : HIVM_SynchronizationOpwait_flag { let arguments (ins HIVM_PipeAttr:$set_pipe, HIVM_PipeAttr:$wait_pipe, OptionalAttrHIVM_EventAttr:$static_event_id, OptionalI64:$dynamic_event_id); let assemblyFormat [{ [ $set_pipe , $wait_pipe , customEventID($static_event_id, $dynamic_event_id) ] attr-dict }]; }PipeBarrierOp从 HIVMSynchronizationOps.td 提取def PipeBarrierOp : HIVM_SynchronizationOppipe_barrier { let arguments (ins HIVM_PipeAttr:$pipe); let assemblyFormat [ $pipe ] attr-dict; }参数说明SetFlagOp / WaitFlagOp 参数参数类型必选说明$set_pipeHIVM_PipeAttr是发送信号的 Pipeline$wait_pipeHIVM_PipeAttr是接收信号的 Pipeline$static_event_idHIVM_EventAttr否静态 Event ID编译时确定$dynamic_event_idI64否动态 Event ID运行时计算PipeBarrierOp 参数参数类型必选说明$pipeHIVM_PipeAttr是需要屏障的 PipelineEvent ID 约束每个 Pipe 有 8 个 Event IDEVENT_ID0 ~ EVENT_ID7static_event_id和dynamic_event_id二选一不能同时存在同一对 set_flag/wait_flag 必须使用相同的 (set_pipe, wait_pipe, event_id) 三元组Event ID 在同一 (set_pipe, wait_pipe) 对中不能重复使用除非前一对已完成 wait典型 Pipe 组合set_pipewait_pipe场景PIPE_MTE1PIPE_ML1 数据加载完成后通知 Cube 计算PIPE_MTE2PIPE_MGM 数据加载完成后通知 Cube 计算PIPE_MPIPE_MTE3Cube 计算完成后通知 GM 写回PIPE_MPIPE_FIXCube 计算完成后通知 FixpipePIPE_MPIPE_VCube 计算完成后通知 Vector 后处理IR 示例静态 Event IDhivm.hir.set_flag [#hivm.pipePIPE_MTE1, #hivm.pipePIPE_M, #hivm.eventEVENT_ID0] hivm.hir.wait_flag [#hivm.pipePIPE_MTE1, #hivm.pipePIPE_M, #hivm.eventEVENT_ID0]动态 Event ID%eventId arith.constant 1 : i64 hivm.hir.set_flag [#hivm.pipePIPE_MTE1, #hivm.pipePIPE_M, %eventId] hivm.hir.wait_flag [#hivm.pipePIPE_MTE1, #hivm.pipePIPE_M, %eventId]Pipe Barrierhivm.hir.pipe_barrier [#hivm.pipePIPE_M]完整的 Load → Compute → Store 同步模式// 加载数据到 L1 hivm.hir.load ins(%src_gm : ...) outs(%dst_l1 : ...) // 设置 flag 通知 M Pipe 数据已就绪 hivm.hir.set_flag [#hivm.pipePIPE_MTE2, #hivm.pipePIPE_M, #hivm.eventEVENT_ID0] // 等待数据就绪后执行矩阵乘 hivm.hir.wait_flag [#hivm.pipePIPE_MTE2, #hivm.pipePIPE_M, #hivm.eventEVENT_ID0] hivm.hir.mmadL1 ins(...) outs(...) // 设置 flag 通知 MTE3 Pipe 计算结果已就绪 hivm.hir.set_flag [#hivm.pipePIPE_M, #hivm.pipePIPE_MTE3, #hivm.eventEVENT_ID1] // 等待计算完成后写回 GM hivm.hir.wait_flag [#hivm.pipePIPE_M, #hivm.pipePIPE_MTE3, #hivm.eventEVENT_ID1] hivm.hir.store ins(...) outs(...)IR 层约束与验证Event ID 配对set_flag 和 wait_flag 必须使用相同的 (set_pipe, wait_pipe, event_id) 三元组。Event ID 唯一性同一 (set_pipe, wait_pipe) 对中正在使用的 Event ID 不能重复。静态/动态互斥static_event_id和dynamic_event_id不能同时存在。Pipe 合法性set_pipe 和 wait_pipe 必须是合法的 PIPE 枚举值。顺序约束set_flag 必须在对应的 wait_flag 之前执行否则 wait_flag 会阻塞。PipeBarrierpipe_barrier 会等待指定 Pipe 上所有先前操作完成是比 set_flag/wait_flag 更重的同步操作。常见问题Q: 什么时候用静态 Event ID什么时候用动态 Event IDA: 静态 Event ID 适用于编译时可以确定同步点的场景如单次 load→compute→store。动态 Event ID 适用于循环中需要复用 Event ID 的场景运行时根据循环变量计算 Event ID。Q: Event ID 数量不够用怎么办A: 每个 Pipe 只有 8 个 Event ID。在复杂场景中InjectSync Pass 会自动管理 Event ID 的分配和复用。GraphSyncSolver Pass 可以更优化地使用 Event ID。Q: pipe_barrier 和 set_flag/wait_flag 的区别A: pipe_barrier 是重量级同步等待整个 Pipe 完成set_flag/wait_flag 是轻量级同步只同步特定的数据依赖。通常优先使用 set_flag/wait_flag。相关文档源码参考HIVMSynchronizationOps.td测试用例sync-ops.mlirEvent 枚举06-Attributes-Types/01-enumerations.md【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考