简介
本节以Add TBE算子和AI CPU算子开发为例进行算子分析,帮助读者快速掌握算子分析流程。
TBE算子分析
使用TBE DSL方式开发Add算子前,我们需要确定算子功能、输入、输出、算子开发方式、算子类型以及算子实现函数名称等。
- 明确算子的功能以及数学表达式。
Add算子的数学表达式为:
z=x+y
计算过程:将两个输入参数相加,得到最终结果z并将其返回。
- 明确输入和输出。
- Add算子有两个输入:x与y,输出为z。
- 本样例中算子的输入支持的数据类型为float16、float32、int32,算子输出的数据类型与输入数据类型相同。
- 算子输入支持所有shape,输出shape与输入shape相同。
- 算子输入支持的format为:NCHW,NC1HWC0,NHWC,ND。
- 确定算子开发方式及使用的计算接口。
- 计算过程只涉及加法操作,初步分析可使用tbe.dsl.vadd(lhs, rhs)接口实现x+y,请参考《TBE&AI CPU算子开发指南》中的“算子开发过程 > 算子代码实现(TBE DSL)”章节。
- 由于tbe.dsl.vadd(lhs, rhs)接口要求两个输入tensor的shape需要相同,所以需要首先获取两个输入tensor中较大的shape值,然后调用tbe.dsl.broadcast(var, shape, output_dtype=None)接口将入参广播成指定的shape大小。
- 明确算子实现文件名称、算子实现函数名称以及算子的类型(OpType)。
算子命名规则如下:
- 算子类型需要采用大驼峰的命名方式,即采用大写字符区分不同的语义。
- 算子文件名称和算子函数名称,可选用以下任意一种命名规则:
- 用户自定义,此时需要在算子信息库定义中配置opFile.value与opInterface.value。
- 不配置算子信息库定义中opFile.value与opInterface.value,FE会将OpType按照如下方式进行转换后进行算子文件名和算子函数名的匹配。
因此本例中,算子类型定义为Add;算子的实现文件名称及实现函数名称将首字母转换小写字符,定义为add。
- 通过以上分析,得到Add算子的设计规格如下:
表1 Add算子设计规格算子类型(OpType)
|
Add
|
算子输入
|
name:x1
|
shape:all
|
data type:
float16、float32、 int32
|
format:
NCHW,NC1HWC0,NHWC,ND
|
name:x2
|
shape:all
|
data type:
float16、float32、 int32
|
format:
NCHW,NC1HWC0,NHWC,ND
|
算子输出
|
name:y
|
shape:all
|
data type:
float16、float32、 int32
|
format:
NCHW,NC1HWC0,NHWC,ND
|
算子实现使用的主要DSL接口
|
tbe.dsl.broadcast(var, shape, output_dtype=None)
tbe.dsl.vadd(lhs, rhs)
|
算子实现文件/实现函数名称
|
add
|
AI CPU算子分析
使用AI CPU方式开发算子前,我们需要确定算子功能、输入、输出、算子类型以及算子实现函数名称等。
- 明确算子的功能以及数学表达式。
以Add算子为例,Add算子的数学表达式为:
z=x+y
计算过程是:将两个输入参数相加,得到最终结果z并将其返回。
- 明确输入和输出。
- 例如Add算子有两个输入:x与y,输出为z。
- 本样例中算子的输入支持的数据类型为float16、float32、 int32,算子输出的数据类型与输入数据类型相同。
- 算子输入支持所有shape,输出shape与输入shape相同。
- 算子输入支持的format为:NCHW,NHWC,ND。
- 明确算子实现文件名称以及算子的类型(OpType)。
因此本例中,算子类型定义为Add,算子的实现文件名称为add,因此各个交付件的名称建议命名如下:
- 算子的代码实现(即kernel实现)文件命名为add_kernel.h与add_kernel.cc。
- 插件实现文件命名为add_kernel_plugin.cc。
- 原型定义文件命名为:add.h与add.cc。
- 信息定义文件命名为add.ini。
- 通过以上分析,得到Add算子的设计规格如下:
表2 Add算子设计规格算子类型(OpType)
|
Add
|
算子输入
|
name:x
|
shape:all
|
data type:
float16、float32、 int32
|
name:y
|
shape:all
|
data type:
float16、float32、 int32
|
算子输出
|
name:z
|
shape:all
|
data type:
float16、float32、 int32
|
算子实现文件名称
|
add
|