融合原理
自动融合的实现包含两部分,自动确定融合范围和根据融合范围自动生成融合kernel源码及kernel二进制。前者称为自动融合前端,后者称为自动融合的后端(对应图1中的公共底层能力):
前端的实现主要是根据一定规则或配置判断哪些算子能够融合,确定一个融合算子的融合范围,融合范围用FusedGraph来表达,如下图图1所示,FusedGraph内部包含>=1个AscBackend节点,AscBackend可以理解为一个类似于ge::op::partitionedcall的Ascend IR算子,其携带一个子图对象,一个AscBackend节点携带一个AscGraph属性,一个AscGraph内包含多个AscIR节点。AscIR与AscGraph详细介绍请参见AscIR与AscGraph。
图2 AscBackend对应的AscGraph
后端的实现包含Schedule/Codegen/Auto Tiling等,后端接收到FusedGraph后,Schedule首先针对计算/搬运类节点分别生成对应的TilingGroup,并通过TilingGroup合并策略,构建适用于整个融合算子的归一化TilingGroup。最终基于该归一化TilingGroup来生成FusedGraph的Tiling策略。经过Codegen实现和Auto Tiling,生成kernel源码、tiling_func源码、tiling_data源码、并编译生成Host和Device交付件。 自动融合的生效方式请参见AutoFuse使能方式。Schedule/Codegen/Auto Tiling的实现原理请分别参见对应章节。
父主题: AutoFuse概述
