用于将一个 MLIR 代码段中的Block
和Value
映射到另一个代码段
介绍
主要用途
Op Clone
: 当克隆一个新的算子的时候,算子的operand还有result需要映射到新的operand和result
Block Clone
: 基本块内部的值,需要映射到新创建的值上
场景分析
现在我有以下需求:
- 给定一个原始funcOp, 需要抠出里面的部分Op,重新组建一个funcOp
我的大致思路如下:
void cloneOpsIntoNewFunc(vector ops) { // 1. 遍历ops,找到算子集合的输入,将输入和输入的类型都存入vector // 2. 遍历ops,找到算子集合的输出,将输出和输出的类型都存入vector // 3. 根据输入和输出type新建一个funOp // 4. 将ops里面的op按顺序克隆到funcOp里面 // 5. 创建输入算子, 将funcOp的形参和实参联系起来 // 6. 创建输出算子 // 7. 将新建的funcOp插入到module里面返回 }
- 算子克隆
注意到,我这里会批量的进行算子克隆,克隆之后我需要将克隆后的算子和新创建的funcOp对应的形参进行绑定,这是一个很烦人的工作!
这里使用mapping之后我的操作如下:
vector input, inputTypes; collectInputAndTypes(&input, &inputTypes); BlockAndValueMapping mapping; auto funcOp = createFuncOp(inputTypes, outputTypes); auto entryBlock = funcOp.getBody().fornt(); // 在这里进行原始输入和新funcOp的输入的绑定 int argIdx = 0; for (auto val : input) { mapping.map(val, entryBlock.getArgument(argIdx++)); } // 创建新算子的时候将mapping传进去,这样克隆出来的算子自动的会将输出映射到map的值上 for (auto op : ops) { builder.setInsertPoint(); builder.clone(op, mapping); }