custom_macro 跨 Pipe 宏操作完全指南:从原理到 IR 写法
custom_macro 跨 Pipe 宏操作完全指南从原理到 IR 写法【免费下载链接】BiliBiliToolProB 站bilibili自动任务工具支持docker、青龙、k8s等多种部署方式。全面拥抱AI。敏感肌也能用。项目地址: https://gitcode.com/GitHub_Trending/bi/BiliBiliToolPro如果你的融合算子需要同时动用多条 Pipeline——例如 MTE2 负责把数据从 GM 搬进来Vector Core 接着完成计算——HIVM 方言里的hir.custom_macro跨 Pipe 宏操作就是为这类场景准备的。它是hir.custom的多 Pipeline 版本用hivm.pipe_in和hivm.pipe_out两个属性声明数据从哪里流入、从哪个 Pipeline 流出而跨 Pipe 同步则交给编译器自动补齐。先说场景单 Pipe 的 custom 为什么不够hir.custom的设计假设是算子从头到尾待在一条 Pipeline 里一个hivm.pipe属性足以交代它的位置。可实际的融合操作往往横跨多条流水线——数据先从 GM 经 MTE2 加载进来在 Vector Core 上做主计算随后还要走一遍后处理。这种数据流单 Pipe 操作描述不了Pipeline 之间先后关系的表达更是无从谈起。hir.custom_macro正是为此开辟的入口。 机制两条流水线之间的交接可以把它理解成两条流水线之间的一次交接上游 Pipelinepipe_in比如PIPE_MTE2语义是数据从 GM 加载进入把数据递出去下游 Pipelinepipe_out比如PIPE_V语义是交给 Vector Core 处理再接手。承担这个语义标记的是MacroOpTrait。被该 trait 标记的操作会在编译器的同步分析阶段被区别对待InjectSync/GraphSyncSolverPass 读取pipe_in与pipe_out的取值后替你补上set_flag/wait_flag跨 Pipe 同步操作使两条 Pipeline 的先后次序得到保证。换句话说你只需把进出两条 Pipe 指对同步 flag 由编译器负责生成。长什么样TableGen 定义与字段速览定义本身相当紧凑摘自HIVMOps.tddef CustomMacroOp : HIVM_CustomOpcustom_macro, [MacroOpTrait] { let arguments (ins StrAttr:$name, VariadicAnyType:$inputs, VariadicAnyType:$outputs); let results (outs VariadicAnyType:$results); }字段逐一拆解字段类型必选角色$nameStrAttr是操作名称$inputsVariadicAnyType是输入参数$outputsVariadicAnyType是输出/初始化参数DPS init$resultsVariadicAnyType—结果值属性一侧四个必填项共同刻画跑在哪、数据怎么走hivm.tcore_typeTCoreTypeAttr执行的 Core 类型、hivm.pipe_inPipeAttr输入 Pipeline、hivm.pipe_outPipeAttr输出 Pipeline、hivm.vf_modeVFModeAttrVector 运行模式。此外还有一个可选属性gm_addr_args_indicesDenseI32ArrayAttr用于指明哪些参数位置上是 GM 地址。动手写 IR自定义与内置的写法差异自定义宏操作需要把四个属性显式写全数据流向在 IR 上一目了然%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一旦操作命中 Builtin写法就可以收敛到只留名字和操作数属性块整体省略%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两段 IR 的操作数布局完全一致分岔点只在属性声明前者显式告诉编译器从 MTE2 进入、从 V 流出VECTOR core、SIMD 模式后者的这些信息由 Builtin 名称隐含编译器按内置定义自行解析。选型custom 还是 custom_macro判断标准只有一条——数据流是否落在同一条 Pipeline 内维度CustomOpCustomMacroOpTraitSinglePipeOpTraitMacroOpTraitPipe 属性hivm.pipe单个hivm.pipe_inhivm.pipe_out两个覆盖 Pipeline单个跨多个同步方式Pipe 内同步跨 Pipe 同步一句话总结单 Pipeline 内的操作继续用hir.custom只要涉及数据加载 计算 后处理这类跨流水线协作就切换到hir.custom_macro。⚡ 编译器替你做了哪些事同步注入MacroOpTrait让InjectSync/GraphSyncSolverPass 识别出跨 Pipe 操作并自动在操作前后生成set_flag/wait_flag。你不需要手写任何同步指令前提是pipe_in、pipe_out如实反映真实的数据流向——编译器完全依据这两个属性生成同步。DPS 语义操作实现了DestinationStyleOpInterface$outputs作为 DPS 的 init 操作数参与执行结果写入$results。这意味着输出侧张量要由你先构造好示例里那个tensor.empty() : tensor3x3xf32就是为此准备的。Builtin 校验命中内置操作时编译器会按内置定义检查参数是否正确参数与定义不符会在验证阶段被拦下。快速参考C API 与属性常量Pipe 相关方法getInPipe()/setInPipe(PIPE)、getOutPipe()/setOutPipe(PIPE)返回与参数类型均为PIPE。执行配置相关getCoreType()→optionalTCoreType、setCoreType(TCoreType)、getVFMode()→optionalVFMode、setVFMode(VFMode)。另可用isBuiltin()判断操作是否为内置。Pipe 属性名常量static constexpr StringLiteral inPipeName hivm.pipe_in; static constexpr StringLiteral outPipeName hivm.pipe_out;延伸资料源码定义bishengir/include/bishengir/Dialect/HIVM/IR/HIVMOps.tdL1105–L1167测试用例bishengir/test/Dialect/HIVM/IR/custom-op.mlir相关文档CustomOp 说明01-custom-op.md【免费下载链接】BiliBiliToolProB 站bilibili自动任务工具支持docker、青龙、k8s等多种部署方式。全面拥抱AI。敏感肌也能用。项目地址: https://gitcode.com/GitHub_Trending/bi/BiliBiliToolPro创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

ORB-SLAM3跑TUM-VI数据集:yaml参数调优与IMU配置实战

ORB-SLAM3跑TUM-VI数据集:yaml参数调优与IMU配置实战

1. 从零上手ORB-SLAM3与TUM-VI数据集:为什么值得花时间啃这块硬骨头视觉惯性SLAM这两年热度一直没降过,尤其是ORB-SLAM3出来之后,把单目、双目、RGB-D和IMU惯性单元的组合都统一到了一个框架里,算是这个方向里工程完成度相当高的一…

2026/9/19 7:40:27 阅读更多 →
变电站巡检机器人技术落地指南:从传感器选型到数据闭环

变电站巡检机器人技术落地指南:从传感器选型到数据闭环

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 7:40:27 阅读更多 →
ESP32-P4 USB从设备实现稳定MSC读卡器

ESP32-P4 USB从设备实现稳定MSC读卡器

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 7:40:26 阅读更多 →

最新新闻

ccswich 切模型只显示官方模型,改到 TaoToken 通道行不行?

ccswich 切模型只显示官方模型,改到 TaoToken 通道行不行?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 9:57:48 阅读更多 →
Open Computer Use 的 .env 要填多套模型 Key?模型通道改走 TaoToken

Open Computer Use 的 .env 要填多套模型 Key?模型通道改走 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 9:57:48 阅读更多 →
Java缓冲流原理与性能优化实战指南

Java缓冲流原理与性能优化实战指南

1. Java缓冲流深度解析与性能优化实战作为一名长期奋战在Java开发一线的工程师,我深知IO操作是系统性能的关键瓶颈之一。今天我将结合多年实战经验,带大家深入剖析Java缓冲流(Buffered Stream)的工作原理、使用技巧和性能优化策略…

2026/9/20 9:57:48 阅读更多 →
Claude Code 实战:TaoToken 跑通 Next.js 仓库组件拆分

Claude Code 实战:TaoToken 跑通 Next.js 仓库组件拆分

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 9:57:48 阅读更多 →
OneAPI 渠道测试总不通?TaoToken 这样改上游地址

OneAPI 渠道测试总不通?TaoToken 这样改上游地址

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 9:57:48 阅读更多 →
企业级AI Agent实战:PolarDB知识库与数据库融合方案

企业级AI Agent实战:PolarDB知识库与数据库融合方案

1. 为什么是“知识库 数据库”的组合?出发点与基础场景1.1 知识库与数据库,解决的是两种完全不同的问题这两年“AI Agent”这个概念已经快被玩坏了。很多人一上来就搭 Agent,第一反应是给模型接一个向量数据库,做一套 RAG 知识库…

2026/9/20 9:56:46 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →