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),仅供参考

相关新闻

MCP 文件系统 Agent 的模型请求,Key 走 TaoToken 行不行?

MCP 文件系统 Agent 的模型请求,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/19 22:12:59 阅读更多 →
jsPDF 快速上手与深入实践:在浏览器与 Node.js 中纯客户端生成 PDF

jsPDF 快速上手与深入实践:在浏览器与 Node.js 中纯客户端生成 PDF

jsPDF 快速上手与深入实践:在浏览器与 Node.js 中纯客户端生成 PDF 【免费下载链接】jsPDF Client-side JavaScript PDF generation for everyone. 项目地址: https://gitcode.com/gh_mirrors/js/jsPDF jsPDF 是一个纯 JavaScript 的 PDF 生成库,…

2026/9/21 1:31:07 阅读更多 →
Element Plus 2026实战指南:Vue 3后台管理系统的组件库选型与工程化落地

Element Plus 2026实战指南:Vue 3后台管理系统的组件库选型与工程化落地

Element Plus 这个组件库,我从它还是 Element UI 的 Alpha 版本时期就开始跟了,一路用到 2026 年的今天,可以说见证了 Vue 生态里这套组件库从小众走向事实标准的过程。如果你是刚接触 Vue 3 生态,或者正打算把手头的老项目迁移到…

2026/9/21 1:22:30 阅读更多 →

最新新闻

逆向必学:PE文件结构核心字段与加壳脱壳实战解析

逆向必学:PE文件结构核心字段与加壳脱壳实战解析

简介:这份PE文件结构详解PDF对照《加密与破解》第十章,系统梳理Windows下exe、dll、sys等可执行文件的格式规范,适合逆向工程、软件安全、病毒分析初学者,也适合备考事业单位计算机岗位的读者夯实底层基础,还可作为高校…

2026/9/21 2:02:05 阅读更多 →
UL 60950-22户外设备认证指南:从适用边界到测试要点

UL 60950-22户外设备认证指南:从适用边界到测试要点

简介:UL 60950-22:2017 第二版标准PDF,专注于信息技术设备户外安装的安全规范,面向产品安全工程师、认证测试人员及户外设备研发人员。该标准整合了IEC 60950-22第二版的技术内容,针对户外环境下的防水防尘、电气安全、机械结构强…

2026/9/21 2:02:05 阅读更多 →
工业智能体落地指南:从概念、架构到实践路径与趋势

工业智能体落地指南:从概念、架构到实践路径与趋势

简介:这份《2025工业智能体应用现状与趋势展望报告》面向制造业决策者、数字化转型负责人及工业AI研究人员,系统梳理了工业智能体的概念定义、设备级到集团级的五大层级类型、应用现状与未来趋势。报告基于对汽车制造、高端装备等六大重点行业127家企业的…

2026/9/21 2:02:05 阅读更多 →
3DES源代码全解析:加解密实现、CBC模式与踩坑指南

3DES源代码全解析:加解密实现、CBC模式与踩坑指南

简介:3DES源代码包面向信息安全与密码学学习者,提供加密与解密的完整实现,可直接用于理解三重DES算法的工作流程。资源共11个文件,核心为main.cpp源程序,并配有可执行exe、C工程配置文件(cbp/layout/depend…

2026/9/21 2:02:05 阅读更多 →
大模型入门指南:从零开始的技术路线与实战经验

大模型入门指南:从零开始的技术路线与实战经验

1. 大模型转行指南:从零开始的认知重塑去年夏天,我偶然在GitHub上看到一个用Stable Diffusion生成动漫头像的项目,当时完全看不懂那些术语——transformer、LoRA、prompt engineering...但正是这种"看不懂"激发了我的好奇心。三个月…

2026/9/21 2:02:05 阅读更多 →
SpringBoot三层架构实战:从零实现用户管理系统

SpringBoot三层架构实战:从零实现用户管理系统

1. 项目概述:SpringBoot三层架构实战刚入行Java开发时,总听前辈们念叨"三层架构",但真正自己动手实现一个完整的用户管理系统才发现,理论到实践之间藏着不少门道。这次就用SpringBoot从零实现带三层架构的用户增删改查&…

2026/9/21 2:01:05 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

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 阅读更多 →