当前位置: 首页 > news >正文

mlir 编译器学习笔记之六 -- 经典实现

1、利用 重载方法: val.getDefiningOp<emitc::CallOpaqueOp>() 和 val.getDefiningOp()

class Value { private: Operation* definingOp_ = nullptr; public: Operation*getDefiningOp() const { // 基础版本 return definingOp_; } template <typename OpTy> // 模板版本 - 调用基础版本,增加类型检查 OpTy getDefiningOp() const { return llvm::dyn_cast_or_null<OpTy>(getDefiningOp()); } };

2、动态多态 (dyn_cast) 要求具有相同的基类。当没有相同基类时候可以使用requires(C++20)

模版类变量 可以使用 dyn_cast<BAUStructuredOp>(*op) 直接类型转换,也可以Operation* operation = op隐式类型转换

3、利用模版template <typename... OpType>实现多个同类算子处理

template <typename... OpTypes>

static void registerMAUOps(RewritePatternSet &patterns) {

(patterns.add<InsertDataLayoutforBAUByInterface<OpTypes>>(patterns.getContext()), ...);

}

4、return WalkResult::advance();是结束本次迭代,而不是结束整个funcOp->walk

5、class ConvertAtenAddOp 需要处理两个操作数的类型提升,利用了返回值已经是类型提升后的类型简化

Value operandA = convertScalarToDtype(rewriter, loc, adaptor.getA(), resultType);

6、LLVM中,Pattern Rewrite通常使用一个循环来反复应用优化规则,直到没有规则可以应用为止,eg:combine

bool changed = true; while (changed) { changed = false; changed |= applyPattern1(); changed |= applyPattern2(); // 更多模式... }

7、获取tensor的维度值

Location loc = addOp.getLoc();

OpBuilder builder(op->getContext());

SmallVector<OpFoldResult> sizes = tensor::getMixedSizes(builder, loc, lhs);

// 使用dispatchIndexOpFoldResults将sizes解析获取静态和动态值(仅动态维)

8、this->softmaxOps[softmaxOp] = std::move(info);相比

this->softmaxOps[softmaxOp] = info 高效,仅仅转移所有权,而不需要复制整个容器

9、创建型设计模式(单例模式):

explicit SymbolAnalysis() = default; // 禁止默认构造

static SymbolAnalysis *instance; // 仅创建一次,存在时直接返回

10、alloc, tensor.reshape 动态shape和静态shape表达形式存在差异 ?

11、禁用特定pattern的方法: patterns.disablePattern<MyPattern2>();

12、寄存器分配不能使用纯回溯(智能搜索 + 剪枝),并非暴力遍历

a) 分形传播时考虑输入间的约束,则需要回溯,因为一个输入的选择会影响所有其他输入 ==> 回溯剪枝

b) 如果不考虑输入间的约束, 只需考虑这个输入自身的约束,则线性时间,无需回溯==>

动态规划/贪心算法(遵循最优子结构性质, 即一个问题的最优解包含其子问题的最优解)

13、在 MLIR 中,ShapedType是所有具有形状和元素类型的类型的公共基类,包括TensorTypeVectorTypeMemRefType。可以使用ShapedType来区别标量

14、方言合法性:动态shape无法区分是否合法时,可以设置标记,eg:

target.addDynamicallyLegalOp<scf::ForOp, scf::YieldOp>([this](Operation *op) { if (this->dynamicShape) { auto attr = op->getAttrOfType<BoolAttr>("isLegal"); return attr && attr.getValue(); } ... } // 相应配置newOp->setAttr("isLegal", rewriter.getBoolAttr(true));

15、属性也是Op的一部分,属性不一样,Op就不同,所以当算子加上属性后,就能避免cse优化

defOp->setAttr(cseBarrier, builder.getIndexAttr(currBarrier++));

16、实现延迟的关键是要存储行为,"存储行为"的核心是延迟计算策略模式的实现

17、 pattern匹配后注册的优先

populateArithToEmitCPatterns(patterns) { SignedCastConversion<arith::IndexCastOp>, // 优先级较低 IndexCastOpConversion, // 优先级较高,后注册优先匹配}
http://www.jsqmd.com/news/862094/

相关文章:

  • ubuntu24 主题经验
  • 抖音内容本地化保存解决方案:批量下载与去水印工具实践
  • 谷歌关键词优化seo需要怎么做?避开这4个最掏钱的布词误区
  • 2026年最新一键生成论文工具全攻略(含免费额度说明)
  • 【Midjourney拟物化风格实战指南】:20年视觉设计专家亲授3大材质渲染公式与5步出图工作流
  • 新人结婚开封汴绣婚庆礼品推荐
  • C语言中的sizeof和strlen
  • 2026年评价高的榨菜芯/去皮榨菜优质厂家推荐榜 - 品牌宣传支持者
  • 【docker镜像加速器配置】
  • Spring AI Alibaba 1.x 系列【55】Interrupts 中断机制:静态中断源码分析
  • 升学赠礼推荐开封汴绣绣品
  • 2026年局域网考试系统选型对比:优考试助力政企信创与内网安全
  • 【RK3588-AI-004】RK3588 AI专属依赖环境预装(Python、OpenCV、基础编译工具)
  • 3分钟掌握gmpublisher:Garry‘s Mod工坊发布的终极解决方案
  • 数分-MySQL基础01
  • Allen-Bradley 280D-F12Z-10B-CR启动控制模块
  • Go语言并发编程:sync包深度解析与实践
  • 升官发财送开封汴绣礼品推荐
  • 【Linux驱动开发】第10天:设备树零基础入门——DTS/DTB/DTC全解+编译流程
  • AI论文软件的实战手册:什么程度算学术不端?
  • Aeneas终极指南:3步搞定音频文本自动对齐,准确率超95%
  • 【Linux驱动开发】第11天:设备树(Device Tree)超详细全解:从诞生背景到工作原理
  • 如何构建更接近真实交通的自动驾驶仿真世界:数字孪生、风险重构与物理感知全栈实践
  • 编译和链接+预处理
  • 从塑料感→博物馆级质感,Midjourney材质进阶全路径:Chaos=0.3+Texture Boost+--style raw三重锁频技术,限时公开
  • ElevenLabs高棉文语音私有化部署终极方案(含Docker+Khmer IPA音素映射表),仅限前200位技术负责人获取
  • 为什么这款文档转换工具能同时实现高效与精准?揭秘Marker的核心优势
  • 2026.5.12【芯片设计面试经验分享】上海车载芯片设计公司
  • 079.自监督学习预训练:在无标签数据上预训练YOLO骨干网络
  • ElevenLabs挪威文语音API调用全链路拆解,从HTTP头配置到SSML韵律标记实战,零基础30分钟上线商用级语音