进行算子开发前,开发者应首先进行算子分析,算子分析包含:明确算子的功能及数学表达式,选择算子开发方式(DSL方式或者TIK方式),最后细化并明确算子规格,分析流程如下所示:
例如Atanh算子,反双曲正切函数atanh是双曲正切函数tanh的反函数,等价于tanh-1x,数学表达式如下:
定义区间为(-1, 1),值域范围为(-∞, +∞),关于原点对称,为奇函数。
+,-,*,/,ln()
DSL开发方式的主要特点是CANN预先在TVM的机制上面封装了若干运算接口,并配备了常用的运算模板,开发过程中只需要关注算子的运算逻辑,不需要关注底层昇腾AI处理器的数据适配和指令的运算流程。DSL开发的方式最方便快捷,可以满足Pow、Sqrt、ReduceSum等这些基本数学运算的实现。当前DSL提供了加减乘除、对数、指数等的计算接口,开发者可以基于这些接口组合出需要的逻辑。
例如,Atanh算子用到的基本运算有+,-,*,/,ln(),分析TBE DSL提供的API是否可满足这些运算要求:
通过如上分析,可看出TBE DSL接口满足Atanh算子的实现要求,所以可优先选择TBE DSL方式进行Atanh算子的实现。
基于TIK的自定义算子开发,提供了对Buffer的管理和数据自动同步机制,但需要开发者手动计算数据的分片和索引,需要开发者对AI Core架构非常了解,入门难度更高。理论上所有的算子都是可以使用TIK的开发方式,当DSL不能满足开发诉求的时候,可以选择TIK开发方式。
2明确使用的算子实现方式及算子实现接口后,需要进一步明确算子输入输出支持的数据类型,形态以及数据排布格式,明确算子实现文件名称、算子实现函数名称以及算子的类型(OpType)。
以上作为算子开发设计规格。