LLVM MLIR怎么给操作添加类型约束

酷敏大大_6168

酷敏大大_6168

2026-09-30

608人浏览

原创

ods中单体约束直接写在字段声明后(如anytensorofrank),多实体约束需用let constraints独立声明并设hascustomverify=1,所有约束必须编译期可求值。

llvm mlir怎么给操作添加类型约束

直接在 ODS(Operation Definition Specification)中用 Constraint 声明,而不是写 C++ 验证逻辑——这是最轻量、最符合 MLIR 设计意图的方式。

怎么在 ODS 里写单体类型约束

单体约束作用于单个操作数、结果或属性,直接写在对应字段声明后面。比如要求第一个操作数必须是 2D tensor:

  • 用 AnyTensorOfRank 表达固定秩约束,它来自 OpBase.td 内置的约束模板
  • 若需更细粒度(如 shape 已知),可用 SameTypeAsOperand 或自定义 Def 类型约束
  • 注意:不能在约束里写运行时逻辑,所有约束必须能在 TableGen 编译期求值

示例(ODS 片段):

def Toy_TransposeOp : Toy_Op {
  let arguments = (ins TensorType:$input);
  let results = (outs AnyTensorOfRank:$output);
}

多实体约束怎么声明(比如 input/output shape 一致)

多实体约束无法塞进单个字段声明,必须提出来作为独立 let constraints = [...] 块。这类约束本质是 PredOpTrait 实例,由 TableGen 翻译成 C++ 的 verifyInvariants 调用。

Consensus
Consensus

一款AI工具,主要用于一个新型搜索引擎,利用AI在科学研究中为你找到答案,适合需要提升相关任务效率的用户。

下载
  • 常见写法是调用预定义谓词,如 ShapeIsSameAsOperand(要求 result #0 和 operand #1 shape 相同)
  • 若预定义不够用,需在 .td 文件里用 def 定义新 Constraint,并实现其 CxxCode 字段
  • 别漏掉 let hasCustomVerify = 1;,否则生成的 C++ 不会插入验证逻辑

示例:

def Toy_ReshapeOp : Toy_Op {
  let arguments = (ins TensorType:$input, TensorType:$shape);
  let results = (outs TensorType:$output);
  let constraints = [
    ShapeIsSameAsOperand,  // output shape == shape operand
    SameTypeAsOperand      // input & shape must have same element type
  ];
  let hasCustomVerify = 1;
}

为什么 getOperand(0).getType() 在 verify 里拿不到完整 shape

因为 ODS 生成的 verifyInvariants 默认只做静态结构检查,不触发 shape 推导。如果 operand 类型是 tensor<?x ?xf32> 这种动态 shape,getType() 返回的 ShapedType 就不含具体维度。

  • 真正需要 shape 信息的验证(比如 reshape 后 volume 不变),得手动在 C++ 中调用 inferReturnTypes 或 getShapeForValue
  • 更稳妥的做法是把 shape 约束拆到两个层面:ODS 做 type 兼容性检查(如 rank、element type),C++ 做 runtime shape 校验
  • 别指望 Constraint 自动帮你推 shape——它不是分析器,只是编译期断言容器

真正容易被忽略的是约束的“生效时机”:ODS 约束只在 IR 构建和解析阶段起作用,对已存在的 IR(比如 pass 修改后)不做重检。如果你在自定义 pass 里改了 operand 类型但没同步更新 result,ODS 约束不会自动报错,得靠后续的 verify 或 canonicalize 显式触发。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

0

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

0

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

200

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

120

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

100

15

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

2026.09.22

60

12

Conan二进制包配置指南
Conan二进制包配置指南

本专题介绍Conan根据操作系统、编译器、架构和构建类型生成二进制包的方法,讲解Profile、Settings、Options及Package ID的作用,帮助管理不同平台和编译环境下的包版本。

2026.09.22

80

13

Conan私有仓库搭建教程
Conan私有仓库搭建教程

本专题系统的讲解Conan私有仓库的搭建流程,涵盖仓库服务部署、存储目录配置、用户认证、权限划分和远程地址添加,并介绍内部C++依赖包的上传、下载及版本维护方法。

2026.09.22

60

19

loomy官网入口地址合集
loomy官网入口地址合集

本专题汇总了 Loomy 桌面 AI 助理的官方入口地址合集及使用指南。提供 macOS 与 Windows 客户端下载 。Loomy 是讯飞推出的桌面级 AI 工作搭子,支持文件整理、数据分析、网页操作及通过飞书/钉钉远程操控电脑,助你高效完成本地办公任务 。

2026.09.22

80

19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程