当前位置: 首页 > 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.gsyq.cn/news/1342731.html

相关文章:

  • 全面掌握GemPy三维地质建模:从核心概念到实战应用
  • RedisBloom Cuckoo过滤器终极指南:为什么它比布隆过滤器更强大
  • CANN/asc-devkit张量形状定义
  • 2026年评价高的榨菜芯/去皮榨菜优质厂家推荐榜 - 品牌宣传支持者
  • CANN Ascend C向量计算API
  • 《Sysinternals实战指南》进程和诊断工具学习笔记(8.24):Handle——谁占着不放?句柄泄漏排查、强制解锁与检索技巧
  • Go语言并发编程:sync包深度解析与实践
  • FICO创凭证标准错误:在折旧范围 01 中的业务与帐面净值规则冲突
  • 如何将普通桌面实时转换为3D立体视频?nunif iw3-desktop完全指南
  • ElevenLabs高棉文语音私有化部署终极方案(含Docker+Khmer IPA音素映射表),仅限前200位技术负责人获取
  • 3分钟掌握gmpublisher:Garry‘s Mod工坊发布的终极解决方案
  • 深入拆解 MySQL InnoDB 隔离级别:从 MVCC 到临键锁
  • rk3588/rk3576使用rkllm推理大模型,提供OpenAI服务
  • AI论文软件的实战手册:什么程度算学术不端?
  • C语言06(操作符)
  • 080.领域自适应:当你的YOLO在新车间“水土不服”时
  • VxWorks网络通信模块:网络协议栈解析(第五部分)
  • ComfyUI全面掌握-知识点详解——ComfyUI 开发与扩展基础(开发指南+环境搭建)
  • linuxcnc开发环境搭建
  • Win11 右键菜单缺少“新建文本文档“win11 某些软件中文乱码
  • 谷歌关键词优化seo需要怎么做?避开这4个最掏钱的布词误区
  • 2026年整箱榨菜厂家精选合集 - 行业平台推荐
  • Allen-Bradley 280D-F12Z-10B-CR启动控制模块
  • HTTP状态码与请求方式全解析【个人八股】
  • LangChain 是什么?从零开始学会 LangChain 的工程实践指南
  • 性价比高的国产PLM软件公司
  • 3.url编码
  • 关于 ops-transformer 和它背后那套系统,几个我见过最常见的误解
  • VGG16猫狗二分类数据集处理
  • ops-transformer 基础设施性能实验报告:GE 融合边界与 Runtime 调度效率实测