公司动态

mlir 编译器学习笔记之十三 -- 算子切分tiling

📅 2026/8/20 23:21:10
mlir 编译器学习笔记之十三 -- 算子切分tiling
需要符号推导和切分两部分共同的作用1、符号推导标记算子的公共轴(相同的符号)具体方法为每个 tensor 的每个维度分配一个符号Symbol本质是 int32_t然后通过 Union-Find 数据结构记录**哪些维度必须相等-- 必要性某个 Op 没有实现 SymbolicAnalysisInterface其所有输入/输出维度的符号互相独立Tiling 时无法推导出正确的维度映射关系2、切分对应5个接口: llvm-project 中已经实现transform-interpreter描述一个 Op 如何被分块tile执行。Dialect 通过 **ExternalModel** 机制为各 Op 注册 TilingInterface,│ 1. getLoopIteratorTypes — 描述循环维度的类型 ││ 2. getIterationDomain — 描述循环维度的范围 │ 比如返回dst的维度范围│ 3. getTiledImplementation — 给定 offsets/sizes 生成 tiled Op │基于dst推算对应src范围并构建相应的算子│ 4. getResultTilePosition — 计算 tiled result 在原始 result 中的位置 ││ 5. generateResultTileValue — 生成指定 result tile 的计算代码-- 必要性- **迭代空间Iteration Domain**Op 的计算可以用一组嵌套循环描述每个循环维度有偏移offset、规模size、步长stride- **迭代器类型Iterator Type**每个循环维度是 parallel可并行还是 reduction需归约- **分块Tiling**将完整迭代空间切分为若干子空间每次只处理一个子空间tile3、测试用例参考 [mlir][draft] Incorrect sizes/offsets after tile fuse · Issue #150203 · llvm/llvm-project · GitHub同时支持fix and scalable Compiler Explorer4、开发注意事项amlir::clone 自动从原始操作复杂所有的attributes到新操作数因此构建的时候仅需要填写操作数即可b) getResultTilePosition 需要防御性编码因为 它是一个查询接口一框架可能会对任意 resultNumber 调用它来探测这个结果能 tile 对不存在的 result number 返回 failure() 只有 success时才会调 generateResultTilevalue因此generateResultTilevalue中不需要防御性