文档
注册

算子分析

简介

本节以Add TBE算子和AI CPU算子开发为例进行算子分析,帮助读者快速掌握算子分析流程。

TBE算子分析

使用TBE DSL方式开发Add算子前,我们需要确定算子功能、输入、输出、算子开发方式、算子类型以及算子实现函数名称等。

  1. 明确算子的功能以及数学表达式。

    add算子的数学表达式为:

     z=x+y

    计算过程:将两个输入参数相加,得到最终结果z并将其返回。

  2. 明确输入和输出。
    • add算子有两个输入:x与y,输出为z。
    • 本样例中算子的输入支持的数据类型为float16、float32、int32,算子输出的数据类型与输入数据类型相同。
    • 算子输入支持所有shape,输出shape与输入shape相同。
    • 算子输入支持的format为:NCHW,NC1HWC0,NHWC,ND。
  3. 确定算子开发方式及使用的计算接口。
    1. 计算过程只涉及加法操作,初步分析可使用tbe.dsl.vadd(lhs, rhs)接口实现x+y,请参考算子开发指南中的“算子开发过程 > 算子代码实现(TBE DSL)”章节。
    2. 由于tbe.dsl.vadd(lhs, rhs)接口要求两个输入tensor的shape需要相同,所以需要首先获取两个输入tensor中较大的shape值,然后调用tbe.dsl.broadcast(var, shape, output_dtype=None)接口将入参广播成指定的shape大小。
  4. 明确算子实现文件名称、算子实现函数名称以及算子的类型(OpType)。算子命名规则如下:
    • 算子类型需要采用大驼峰的命名方式,即采用大写字符区分不同的语义。
    • 算子文件名称和算子函数名称,可选用以下任意一种命名规则:
      • 用户自定义,此时需要在算子信息定义中配置opFile.valueopInterface.value
      • 不配置算子信息定义opFile.valueopInterface.value,FE会将OpType按照如下方式进行转换后进行算子文件名和算子函数名的匹配。
        • 首字符的大写字符转换为小写字符。

          例如:Abc -> abc

        • 小写字符后的大写字符转换为下划线+小写字符。

          例如:AbcDef -> abc_def

        • 紧跟数字以及大写字符后的大写字符,作为同一语义字符串,查找此字符串后的第一个小写字符,并将此小写字符的前一个大写字符转换为下划线+小写字符,其余大写字符转换为小写字符。若此字符串后不存在小写字符,则直接将此字符串中的大写字符转换为小写字符。

          例如:ABCDef -> abc_def;Abc2DEf -> abc2d_ef;Abc2DEF -> abc2def;ABC2dEF -> abc2d_ef。

    因此本例中,算子类型定义为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方式开发算子前,我们需要确定算子功能、输入、输出、算子类型以及算子实现函数名称等。

  1. 明确算子的功能以及数学表达式。

    以Add算子为例,Add算子的数学表达式为:

     z=x+y

    计算过程是:将两个输入参数相加,得到最终结果z并将其返回。

  2. 明确输入和输出。
    • 例如Add算子有两个输入:x与y,输出为z。
    • 本样例中算子的输入支持的数据类型为float16、float32、 int32,算子输出的数据类型与输入数据类型相同。
    • 算子输入支持所有shape,输出shape与输入shape相同。
    • 算子输入支持的format为:NCHW,NHWC,ND。
  3. 明确算子实现文件名称以及算子的类型(OpType)。
    • 算子类型需要采用大驼峰的命名方式,即采用大写字符区分不同的语义。
    • 算子文件名称,可选用以下任意一种命名规则:

      建议将OpType按照如下方式进行转换,得到算子文件名称。

      转换规则如下:
      • 首字符的大写字符转换为小写字符。

        例如:Abc -> abc

      • 小写字符后的大写字符转换为下划线+小写字符。

        例如:AbcDef -> abc_def

      • 紧跟数字以及大写字符后的大写字符,作为同一语义字符串,查找此字符串后的第一个小写字符,并将此小写字符的前一个大写字符转换为下划线+小写字符,其余大写字符转换为小写字符。若此字符串后不存在小写字符,则直接将此字符串中的大写字符转换为小写字符。

        例如:ABCDef -> abc_def;Abc2DEf -> abc2d_ef;Abc2DEF -> abc2def;ABC2dEF -> abc2d_ef。

    因此本例中,算子类型定义为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

搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词