mlir-tblgen 的应用渐进式示例

示例01 -gen-dialect-decls

toy_dia.1.toy

include "mlir/IR/OpBase.td"
//include "mlir/IR/FunctionInterfaces.td"
//include "mlir/IR/SymbolInterfaces.td"
//include "mlir/Interfaces/SideEffectInterfaces.td"def Toy_Dialect : Dialect {let name = "toy";let summary = "A high-level dialect for analyzing and optimizing the Toy language";let description = [{The Toy language is a tensor-based languange that allowssss you to define functions.}];let cppNamespace = "toy";
}

命令:

../../../llvm-project/build_mlir_15/bin/mlir-tblgen -gen-dialect-decls ./toy_dia.1.td -I ../../../llvm-project/mlir/include

生成:

示例02 no def -gen-op-decls

源码:

toy_op.1.td:

include "mlir/IR/OpBase.td"
//include "mlir/IR/FunctionInterfaces.td"
//include "mlir/IR/SymbolInterfaces.td"
//include "mlir/Interfaces/SideEffectInterfaces.td"def Toy_Dialect : Dialect {let name = "toy";let summary = "A high-level dialect for analyzing and optimizing the Toy language";let description = [{The Toy language is a tensor-based languange that allowssss you to define functions.}];let cppNamespace = "toy";
}class Toy_Op<string mnemonic, list<Trait> traits = []> :Op<Toy_Dialect, mnemonic, traits>;

命令:

$ mlir-tblgen -gen-op-decls ./toy_op.1.td -I ../../../llvm-project/mlir/include/

生成:

示例03 -gen-op-decls

toy_dia.2.toy:

include "mlir/IR/OpBase.td"
//include "mlir/IR/FunctionInterfaces.td"
//include "mlir/IR/SymbolInterfaces.td"
//include "mlir/Interfaces/SideEffectInterfaces.td"def Toy_Dialect : Dialect {let name = "toy";let summary = "A high-level dialect for analyzing and optimizing the Toy language";let description = [{The Toy language is a tensor-based languange that allowssss you to define functions.}];let cppNamespace = "toy";
}class Toy_Op<string mnemonic, list<Trait> traits = []> :Op<Toy_Dialect, mnemonic, traits>;def ConstantOp : Toy_Op<"constant"> {
}

命令:

$ mlir-tblgen -gen-op-decls ./toy_dia.2.td -I ../../../llvm-project/mlir/include/

生成:

示例04

源码:

include "mlir/IR/OpBase.td"
//include "mlir/IR/FunctionInterfaces.td"
//include "mlir/IR/SymbolInterfaces.td"
//include "mlir/Interfaces/SideEffectInterfaces.td"def Toy_Dialect : Dialect {let name = "toy";let summary = "A high-level dialect for analyzing and optimizing the Toy language";let description = [{The Toy language is a tensor-based languange that allowssss you to define functions.}];let cppNamespace = "toy";
}class Toy_Op<string mnemonic, list<Trait> traits = []> :Op<Toy_Dialect, mnemonic, traits>;def ConstantOp : Toy_Op<"constant"> {let arguments = (ins F64ElementsAttr:$value);let results = (outs F64Tensor);
}

命令: 

llvm-project/build_mlir_15/bin/mlir-tblgen -gen-op-decls ./toy_op.3.td -I ../../../llvm-project/mlir/include

生成:

$ ../../../llvm-project/build_mlir_15/bin/mlir-tblgen -gen-op-decls ./toy_op.3.td -I ../../../llvm-project/mlir/include
/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|*                                                                            *|
|* Op Declarations                                                            *|
|*                                                                            *|
|* Automatically generated file, do not edit!                                 *|
|*                                                                            *|
\*===----------------------------------------------------------------------===*/#if defined(GET_OP_CLASSES) || defined(GET_OP_FWD_DEFINES)
#undef GET_OP_FWD_DEFINES
namespace toy {
class ConstantOp;
} // namespace toy
#endif#ifdef GET_OP_CLASSES
#undef GET_OP_CLASSES//===----------------------------------------------------------------------===//
// Local Utility Method Definitions
//===----------------------------------------------------------------------===//namespace toy {//===----------------------------------------------------------------------===//
// toy::ConstantOp declarations
//===----------------------------------------------------------------------===//class ConstantOpAdaptor {
public:ConstantOpAdaptor(::mlir::ValueRange values, ::mlir::DictionaryAttr attrs = nullptr, ::mlir::RegionRange regions = {});ConstantOpAdaptor(ConstantOp op);::mlir::ValueRange getOperands();std::pair<unsigned, unsigned> getODSOperandIndexAndLength(unsigned index);::mlir::ValueRange getODSOperands(unsigned index);::mlir::DictionaryAttr getAttributes();::mlir::DenseElementsAttr valueAttr();::mlir::DenseElementsAttr value();::mlir::LogicalResult verify(::mlir::Location loc);
private:::mlir::ValueRange odsOperands;::mlir::DictionaryAttr odsAttrs;::mlir::RegionRange odsRegions;::llvm::Optional<::mlir::OperationName> odsOpName;
};
class ConstantOp : public ::mlir::Op<ConstantOp, ::mlir::OpTrait::ZeroRegions, ::mlir::OpTrait::OneResult, ::mlir::OpTrait::OneTypedResult<::mlir::TensorType>::Impl, ::mlir::OpTrait::ZeroSuccessors, ::mlir::OpTrait::ZeroOperands, ::mlir::OpTrait::OpInvariants> {
public:using Op::Op;using Op::print;using Adaptor = ConstantOpAdaptor;
public:static ::llvm::ArrayRef<::llvm::StringRef> getAttributeNames() {static ::llvm::StringRef attrNames[] = {::llvm::StringRef("value")};return ::llvm::makeArrayRef(attrNames);}::mlir::StringAttr valueAttrName() {return getAttributeNameForIndex(0);}static ::mlir::StringAttr valueAttrName(::mlir::OperationName name) {return getAttributeNameForIndex(name, 0);}static constexpr ::llvm::StringLiteral getOperationName() {return ::llvm::StringLiteral("toy.constant");}std::pair<unsigned, unsigned> getODSOperandIndexAndLength(unsigned index);::mlir::Operation::operand_range getODSOperands(unsigned index);std::pair<unsigned, unsigned> getODSResultIndexAndLength(unsigned index);::mlir::Operation::result_range getODSResults(unsigned index);::mlir::DenseElementsAttr valueAttr();::mlir::DenseElementsAttr value();void valueAttr(::mlir::DenseElementsAttr attr);static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::DenseElementsAttr value);static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::DenseElementsAttr value);static void build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes = {});::mlir::LogicalResult verifyInvariantsImpl();::mlir::LogicalResult verifyInvariants();
private:::mlir::StringAttr getAttributeNameForIndex(unsigned index) {return getAttributeNameForIndex((*this)->getName(), index);}static ::mlir::StringAttr getAttributeNameForIndex(::mlir::OperationName name, unsigned index) {assert(index < 1 && "invalid attribute index");return name.getRegisteredInfo()->getAttributeNames()[index];}public:
};
} // namespace toy
MLIR_DECLARE_EXPLICIT_TYPE_ID(toy::ConstantOp)#endif  // GET_OP_CLASSES

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/75987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go语言从零构建SQL数据库(5)-Pratt解析算法:SQL表达式解析的核心引擎

Pratt解析算法&#xff1a;SQL表达式解析的核心引擎 1. 算法概述与工作原理 Pratt解析算法&#xff08;自顶向下运算符优先级解析&#xff09;是一种优雅的表达式解析方法&#xff0c;特别适合处理具有不同优先级运算符的复杂表达式。在我们的SQL解析器中&#xff0c;它负责解…

spring-ai-openai调用Xinference1.4.1报错

1、Xinference 报错logs 此处是调用 /v1/chat/completions 接口 2025-04-06 15:48:51 xinference | return await dependant.call(**values) 2025-04-06 15:48:51 xinference | File "/usr/local/lib/python3.10/dist-packages/xinference/api/restful_api.py", …

刻意练习:如何从新手到大师

1. 练习方式 练习主要有两类&#xff1a;天真的练习和刻意练习。 所谓“天真的练习”&#xff0c;基本上只是反复地做某些事情&#xff0c;并指望只靠那种反复&#xff0c;就能提高表现和水平。一旦某个人的表现达到了“可接受”的水平&#xff0c;并且可以做到自动化&#x…

基于Java的人脸识别在线考试系统(jsp+springboot+mysql8.x)

基于Java的人脸识别在线考试系统(jspspringbootmysql8.x) 在线考试系统提供全面的考试管理和用户管理功能。登录界面支持管理员、教师和学生三种身份验证&#xff0c;确保不同用户访问相应的功能模块。系统自动组卷功能允许管理员根据不同科目和题型&#xff0c;如单选题、多选…

预测分析(二):基于机器学习的数值预测

文章目录 基于机器学习的数值预测机器学习简介监督学习的任务创建第一个机器学习模型机器学习的目标——泛化过拟合现象评价函数与最优化 建模前的数据处理进一步特征变换 多元线性回归模型LASSO回归kNN算法原理算法步骤k值的选择 基于机器学习的数值预测 机器学习是人工智能的…

批量压缩 jpg/png 等格式照片|批量调整图片的宽高尺寸

图片格式种类非常的多&#xff0c;并且不同的图片由于像素、尺寸不一样&#xff0c;可能占用的空间也会不一样。文件太大会占用较多的磁盘空间&#xff0c;传输及上传系统都非常不方便&#xff0c;可能会收到限制&#xff0c;因此我们经常会碰到需要对图片进行压缩的需求。如何…

生鲜果蔬便利店实体零售门店商城小程序

——线上线下融合赋能社区零售新生态 随着新零售模式的深化和消费者需求的升级&#xff0c;生鲜果蔬便利店亟需通过数字化工具实现经营效率与用户体验的双重提升。结合线下实体门店与线上商城的一体化小程序&#xff0c;成为行业转型的核心工具。以下从功能模块、运营策略及行…

如何开通google Free Tier长期免费云服务器(1C/1G)

Google宣布的一项政策&#xff0c;为标准层级的网络提供每地域200G的免费流量。两项政策结合&#xff0c;于是便可以得到一台1核心、1G内存、30G磁盘、200G流量的小云服务器&#xff0c;可玩性大大提高。这篇文章就分享一下如何正确开机&#xff0c;避免产生额外的费用。 免费…

C# 多线程并发编程基础

1. 线程基础 1.1 线程简介 C# 中的线程是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程中&#xff0c;是进程中的实际运作单位。一个进程可以包含多个线程&#xff0c;这些线程可以并发执行不同的任务。 1.2 线程的创建与启动 在 C# 中&#xff0c;可以使…

【Introduction to Reinforcement Learning】翻译解读2

2.2 马尔可夫决策过程&#xff08;MDPs&#xff09; 马尔可夫决策过程&#xff08;MDP&#xff09;为顺序决策提供了框架&#xff0c;其中动作不仅影响即时奖励&#xff0c;还会影响未来结果。与多臂老虎机问题不同&#xff0c;MDP中的即时奖励与延迟奖励相平衡。在多臂老虎机…

STM32单片机入门学习——第22节: [7-2] AD单通道AD多通道

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.07 STM32开发板学习——第22节: [7-2] AD单通道&AD多通道 前言开发板说明引用解…

Python高阶函数-filter

1. 基本概念 filter() 是Python内置的高阶函数&#xff0c;用于过滤序列中的元素。它接收一个函数和一个可迭代对象作为参数&#xff0c;返回一个迭代器&#xff0c;包含使函数返回True的所有元素。 filter(function, iterable)2. 工作原理 惰性计算&#xff1a;filter对象是…

密码学基础——分组密码的运行模式

前面的文章中文我们已经知道了分组密码是一种对称密钥密码体制&#xff0c;其工作原理可以概括为将明文消息分割成固定长度的分组&#xff0c;然后对每个分组分别进行加密处理。 下面介绍分组密码的运行模式 1.电码本模式&#xff08;ECB&#xff09; 2.密码分组链接模式&…

Redlinux(2025.3.29)

1、将你的虚拟机的网卡模式设置为nat模式&#xff0c;给虚拟机网卡配置三个主机位分别为100、200、168的ip地址。(以nmtui命令为例) 2、测试你的虚拟机是否能够ping通网关和dns&#xff0c;如果不能请修改网关和dns的地址。 首先打开虚拟网络编辑器查看NAT设置里的网关IP&…

【PalladiumZ2 使用专栏 1 -- 波形 trigger 抓取详细介绍】

文章目录 Palladium Z2 OverviewPalladium 波形抓取Palladium 波形存放文件创建Palladium Trigger 断点设置Palladium 加探针并 dumpPalladium 波形查看 Palladium Z2 Overview Cadence Palladium Z2 是 Cadence 推出的企业级硬件仿真加速平台&#xff0c;旨在应对复杂 SoC 设…

Redisson分布式锁:原理、使用

1. Redisson简介 Redisson是一个基于Redis的Java客户端库&#xff0c;提供了丰富的分布式对象和服务&#xff08;如分布式锁、信号量、Map等&#xff09;。其核心优势在于​​简化分布式锁的实现​​&#xff0c;并解决了原生Redis分布式锁的常见问题&#xff08;如死锁、误删…

Java大厂面试题 -- JVM 优化进阶之路:从原理到实战的深度剖析(2)

最近佳作推荐&#xff1a; Java大厂面试题 – 深度揭秘 JVM 优化&#xff1a;六道面试题与行业巨头实战解析&#xff08;1&#xff09;&#xff08;New&#xff09; 开源架构与人工智能的融合&#xff1a;开启技术新纪元&#xff08;New&#xff09; 开源架构的自动化测试策略优…

MySQL学习笔记(四)——DML和DQL

目录 1. DML 1.1 添加数据 1.1.1 给指定字段添加数据 1.1.2 给全部字段添加数据 1.1.3 批量添加数据 1.2 修改数据 1.3 删除数据 2. DQL 2.1 基本语法 2.2 基础查询 2.2.1 查询多个字段 2.2.2 字段设置别名 2.2.3 去除重复记录 2.3 条件查询 2.4 聚合函数 2.5 …

DeepSeek-MLA

MLA 结构 需要缓存 KV 向量共用的压缩隐特征K 向量多头共享的带位置编码的向量 为什么带有位置信息的 Q 向量来自于隐特征向量&#xff0c;而带有位置的 K 向量来自于 H 向量且共享呢&#xff1f; 最好的方法肯定是从H向量直接计算并且不共享&#xff0c;但是会大大增加显存使…

检索增强技术RAG和向量数据库技术的优势和劣势,应用范围和价值

RAG 和向量数据库在技术栈中处于不同层级&#xff0c;前者侧重生成任务的准确性与动态性&#xff0c;后者专注检索效率与扩展性。在实际应用中&#xff0c;二者常协同工作&#xff0c;但也可独立服务于不同场景。企业需根据需求选择&#xff1a;若需生成内容&#xff0c;RAG 是…