ParseOpToGraphFn
================

#### 函数功能

注册实现算子一对多子图映射的函数，即将算子映射为多个算子。

#### 函数原型

OpRegistrationData &ParseOpToGraphFn(const ParseOpToGraphFunc &parse\_op\_to\_graph\_fn)

#### 参数说明

| 参数 | 输入/输出 | 说明 |
| :-- | :-- | :-- |
| parse\_op\_to\_graph\_fn | 输入 | 
实现算子一对多映射，进行子图构造的函数。

请参见[回调函数ParseOpToGraphFunc](#回调函数parseoptographfunc)。

 |

#### 约束说明

实现一对多子图映射时，插件注册时首先需要将原始框架中的算子映射成AI处理器中的PartitionedCall算子，并在[ParseParamsByOperatorFn](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cannkit-parseparamsbyoperatorfn)函数中使用“SetAttr”接口设置original\_type。

实现样例请参见[调用示例](#调用示例)。

#### 回调函数ParseOpToGraphFunc

开发者自定义并实现ParseOpToGraphFunc函数，通过IR模型构建方式完成一对多子图的构造。

回调函数原型定义如下。

Status  ParseOpToGraphFunc(const ge::Operator &op, ge::Graph &graph)

**表1** 参数说明

| 参数 | 输入/输出 | 说明 |
| :-- | :-- | :-- |
| op | 输入 | PartitionedCall算子数据结构，Operator类对象。 |
| graph | 输出 | 构造的子图。 |

子图输入输出关系构建方式如下。

*   输入：通过添加Data节点标识，Data节点的index属性表示原节点的第index个输入边。
    
*   输出：通过Graph::SetOutputs()接口设置，该接口的入参为**std::vector<std::pair<Operator, std::vector<size\_t>>>** ，输出边按照设置的输出顺序相连。
    

#### 调用示例

以将Add算子转换成Addn+Abs为例。

实现Add算子到PartitionedCall算子的映射函数示例如下所示：

Status ParseParams(const ge::Operator &op\_src, ge::Operator& op\_dest)
{
    // ...
    op\_dest.SetAttr("original\_type", "ai.onnx::11::Add");
}

一对多子图构造函数实现示例如下所示：

static Status ParseOpToGraph(const Operator &op, Graph &graph) {
  auto data\_0 = op::Data().set\_attr\_index(0);
  auto data\_1 = op::Data().set\_attr\_index(1);
  auto addn = op::AddN("addn\_sum").create\_dynamic\_input\_x(2)
      .set\_dynamic\_input\_x(0, data\_0)
      .set\_dynamic\_input\_x(1, data\_1)
      .set\_attr\_N(2);
  auto abs = op::Abs("abs\_sum").set\_input\_x(addn);
  std::vector<Operator> inputs{data\_0, data\_1};
  std::vector<std::pair<Operator, std::vector<size\_t>>> output\_indexs;
  output\_indexs.emplace\_back(abs, std::vector<std::size\_t>{0});
  graph.SetInputs(inputs).SetOutputs(output\_indexs);
  return domi::SUCCESS;
}

进行注册：

REGISTER\_CUSTOM\_OP("PartitionedCall")
.FrameworkType(xx)
.OriginOpType(xx)
.ParseParamsByOperatorFn(ParseParams)
.ParseOpToGraphFn(ParseOpToGraph)
.ImplyType(ImplyType::TVM);

图为将Add算子进行一对多子图映射后的示例。

**图1** 一对多转换示意图

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/43/v3/Alk_NPfIRYaCkUX6haBm7A/zh-cn_image_0000002625188963.png?HW-CC-KV=V1&HW-CC-Date=20260612T073744Z&HW-CC-Expire=86400&HW-CC-Sign=D912605559838C29CBF32D74433B811C1AC52EC25ABC301BF0B68ACE7CFEE220)