该Pass的run函数主要作用:
-
定义:rewrite_subgraph function
-
调用:EncapsulateSubgraphsInFunctions
一、rewrite_subgraph function
作用:为子图整理/分类/关联input。
二、EncapsulateSubgraphsInFunctions
该函数主要构造:encapsulator, 用encapsulator来将graph中被标记的节点划分为一张子图。主要调用了:
-
encapsulator.SplitIntoSubgraphs
-
encapsulator.BuildFunctionDefs
-
encapsulator.BuildOutputGraph
三、SplitIntoSubgraphs
-
作用:寻找带有group_attribute标签的节点,把带有标签的节点分别归到subgraph中。
-
过程:
-
CopySubgraphNodes: 将统一标记的node放到同一张子图中。
-
遍历主图中每个node,将node中functionId相同的node放到一个子图中,将这些子图构建一个map<functionId, subGraph>
-
-
CopySubgraphEdges:将边信息从主图中复制到子图中。
-
遍历每条边,获取src和dst node信息,将src/dst信息对应到子图中,根据情况为子图增加边。
-
同子图:直接增加边。
-
如果src在子图中,dst不在: 给src子图记录一个output。
-
如果dst在子图中,src不在: 给dst子图记录一个input。
-
因为上述三个条件都为if,所以不同子图会相互记一个input, output。
-
-
-
MarkGuaranteedConstants: 为某些子图的input标记:_is_guaranteed_constant
-
扫描所有子图,去掉一些无用边。
-
四、BuildFunctionDefs
-
作用:遍历所有子图,将子图转换为function
-
过程:
-
通过rewrite_subgraph 完善子图
-
BuildControlFlowInfo 验证图形是否具有格式良好的控制流结构。
-
GraphToFunctionDef 将重写图的输入输出节点到FunctionDef的输入输出参数。
-
五、BuildOutputGraph:
-
作用:将最原始的图转换为加入FunctionDef的图。
-
过程:
-
CopyNodesToOutputGraph: 复制最原始图中不带有xla标记的node。
-
AddFunctionCallNodes: 复制FunctionCall Nodes到output 图。
-
AddEdgesToOutputGraph: 重新构建图中边。