custom_macro 完全指南:跨 Pipeline 宏操作怎么写、同步机制怎么理解

发布时间:2026/9/19 22:12:57
custom_macro 完全指南:跨 Pipeline 宏操作怎么写、同步机制怎么理解 custom_macro 完全指南跨 Pipeline 宏操作怎么写、同步机制怎么理解【免费下载链接】BiliBiliToolProB 站bilibili自动任务工具支持docker、青龙、k8s等多种部署方式。全面拥抱AI。敏感肌也能用。项目地址: https://gitcode.com/GitHub_Trending/bi/BiliBiliToolPro在 HIVM 方言昇腾 AscendNPU-IR 项目中的向量 IR 层里hir.custom_macro 是一个跨 Pipeline硬件管道的自定义宏操作当一个操作需要同时用到多条硬件管道——比如一边从显存搬数据、一边做向量计算——就用它把整件事封装成单个操作管道之间的同步交给编译器自动补齐。如果你的操作只在一条管道内完成请继续用 hivm.hir.custom不要上宏版本。什么场景必须用跨 Pipeline 的宏操作 结论先行判断标准只有一条——操作是否跨越两条或以上管道。跨越了用 custom_macro没跨越用 custom。单管道操作带 SinglePipeOpTraitTrait 是挂在操作上、用来告诉编译器它属于哪一类行为的标记接口编译器只在管道内部排布同步。如果你把跨管道操作错配成 custom同步点会插错位置数据还没搬完就开始算结果直接错。你的操作形态该选什么输入、计算、输出都在同一条管道内完成hivm.hir.custom数据从显存搬运管道进、在向量管道算或类似的跨管道组合hivm.hir.custom_macro编译器内置的跨管道操作如 gather_loadcustom_macro 的内置形式custom_macro 怎么定义参数、属性与方法速查IR 定义只有五行操作定义在源文件 HIVMOps.td完整路径与行号见文末导航def CustomMacroOp : HIVM_CustomOpcustom_macro, [MacroOpTrait] { let arguments (ins StrAttr:$name, VariadicAnyType:$inputs, VariadicAnyType:$outputs); let results (outs VariadicAnyType:$results); }关键在[MacroOpTrait]这个标记让编译器在同步分析阶段把它当跨管道操作特殊处理而不是普通单管道操作。操作数与属性一览表名称类型必选说明$nameStrAttr是操作名称自定义填操作名内置填内置操作名$inputsVariadic是输入操作数变长、任意类型$outputsVariadic是输出/初始化缓冲区DPS 风格的 init 操作数$resultsVariadic—结果值直接写回 $outputs 指定的缓冲区DPSDestination-Passing Style目的地传参输出缓冲区作为显式操作数传入结果原地写回不再新建返回值。属性类型必选说明hivm.tcore_typeTCoreTypeAttr是执行用的 Core 类型如 VECTORhivm.pipe_inPipeAttr是输入 Pipeline数据从哪条管道进入hivm.pipe_outPipeAttr是输出 Pipeline结果落在哪条管道hivm.vf_modeVFModeAttr是向量运行模式如 SIMDgm_addr_args_indicesDenseI32ArrayAttr否$inputs 中保存全局显存GM地址的操作数索引和单 Pipe 版 custom 的完整差异特性CustomOpcustomCustomMacroOpcustom_macroTraitSinglePipeOpTraitMacroOpTraitPipe 属性hivm.pipe单个hivm.pipe_in hivm.pipe_out两个Pipeline 数量单个跨多个同步范围管道内同步跨管道同步BuiltinInfo 字段coreType, pipe, vfModecoreType, inPipe, outPipe, vfMode属性读写 API方法返回类型用途getInPipe()PIPE读输入 PipesetInPipe(PIPE)void写输入 PipegetOutPipe()PIPE读输出 PipesetOutPipe(PIPE)void写输出 PipegetCoreType()optional读 Core 类型setCoreType(TCoreType)void写 Core 类型getVFMode()optional读向量运行模式setVFMode(VFMode)void写向量运行模式isBuiltin()bool判断是否内置操作程序里读写 Pipe 属性时走下面这两个常量不要手写字符串static constexpr StringLiteral inPipeName hivm.pipe_in; static constexpr StringLiteral outPipeName hivm.pipe_out;两个最小 MLIR 示例逐行走读自定义宏操作哪一行决定了什么行为%empty tensor.empty() : tensor3x3xf32 %0 hivm.hir.custom_macro { hivm.tcore_type #hivm.tcore_typeVECTOR, hivm.vf_mode #hivm.vf_modeSIMD, hivm.pipe_in #hivm.pipePIPE_MTE2, hivm.pipe_out #hivm.pipePIPE_V } my_custom_op ins(%arg0, %arg1, %c4_i64, %c0_i32, %c2_i64, %c1_i64, %c2_i32, %c2_i32, %c0_i32, %c0_i32 : memref?xf32, tensor3x3xi64, i64, i32, i64, i64, i32, i32, i32, i32) outs(%empty : tensor3x3xf32) - tensor3x3xf32行决定了什么行为%empty tensor.empty()预留输出缓冲区稍后作为 outs 的 init 操作数传入hivm.pipe_in PIPE_MTE2数据经 MTE2显存搬运管道进入——编译器据此在操作前插入等输入管道就绪的同步hivm.pipe_out PIPE_V结果落在 V向量计算管道——编译器据此在操作后插入结果已写回的同步hivm.vf_mode SIMD向量按 SIMD单指令多数据模式运行my_custom_op操作名作为 $name 传入ins(...)输入数据 标量参数类型列表必须与值一一对应outs(%empty) - tensor3x3xf32结果原地写回 %empty返回类型与缓冲区一致一句话pipe_in / pipe_out 是整个操作里最重要的两行它们决定了同步插在哪。内置宏操作少写一行属性%empty tensor.empty() : tensor3x3xf32 %0 hivm.hir.custom_macro __builtin_gather_load ins(%arg0, %arg1, %c4_i64, %c0_i32, %c2_i64, %c1_i64, %c2_i32, %c2_i32, %c0_i32, %c0_i32 : memref?xf32, tensor3x3xi64, i64, i32, i64, i64, i32, i32, i32, i32) outs(%empty : tensor3x3xf32) - tensor3x3xf32内置形式不显式写属性行编译器按操作名认出它是内置操作isBuiltin() 为真补上默认属性并核对参数个数与类型。名字写错、参数对不上编译期直接报错不会悄悄放过。你写完后编译器会替你检查什么⚠️ 你只负责把 pipe_in / pipe_out 写对剩下的交给同步 PassPass 是编译器里对 IR 做一轮整体改写的阶段同步注入InjectSync 与 GraphSyncSolver 这两个 Pass 读取 pipe_in 和 pipe_out在操作前后自动插入 set_flag标记某条管道完成与 wait_flag让另一条管道等待指令你不需要手写任何同步。合法性校验pipe_in 与 pipe_out 必须都存在$outputs 必须能作为 DPS init 操作数使用操作实现需满足 DestinationStyleOpInterface 接口。内置参数检查内置宏操作的 ins/outs 个数与类型由编译器对照内置定义校验不匹配即报编译错误。同步分析特殊路径因为带 MacroOpTrait同步分析会把它和单管道操作区分对待按跨管道规则排布同步点。高频困惑选型与同步Q: 什么时候该用 custom_macro 而不是 customA: 结论跨越两条或以上管道就用 custom_macro单管道就用 custom。原因custom 带 SinglePipeOpTrait编译器只做管道内同步拿它写跨管道操作同步点会插错数据可能没搬完就开始算。Q: pipe_in 和 pipe_out 怎么选A: 结论pipe_in 填数据进来的管道pipe_out 填结果产出的管道。例如从全局显存GM加载数据pipe_in 用 PIPE_MTE2在向量核心上计算pipe_out 用 PIPE_V。Q: set_flag / wait_flag 要自己写吗A: 不用。InjectSync / GraphSyncSolver 会按你写的 pipe_in / pipe_out 自动插入。你的唯一职责是让这两个属性真实反映数据流向。Q: 内置宏操作和自定义宏操作差在哪A: 结论写法上内置操作少写一行属性、参数由编译器校验同步机制上两者完全一致。内置操作名如 __builtin_gather_load是编译器认识的固定清单参数写错会在编译期报错。源码、测试与相邻特性导航内容路径位置操作定义CustomMacroOpbishengir/include/bishengir/Dialect/HIVM/IR/HIVMOps.tdL1105-L1167官方测试用例含 custom 与 custom_macro 验证bishengir/test/Dialect/HIVM/IR/custom-op.mlir全文相邻特性单管道自定义操作hivm.hir.customCustomOp位于同一文件 HIVMOps.td单属性 hivm.pipe、管道内同步建议的阅读顺序先读 custom 的定义理解 SinglePipeOpTrait再对照 custom_macro 的 MacroOpTrait 与双 Pipe 属性最后跑一遍 custom-op.mlir 里的验证用例。【免费下载链接】BiliBiliToolProB 站bilibili自动任务工具支持docker、青龙、k8s等多种部署方式。全面拥抱AI。敏感肌也能用。项目地址: https://gitcode.com/GitHub_Trending/bi/BiliBiliToolPro创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询