更新时间:2021-03-18 GMT+08:00
分享

算子分析

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

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

    matmul算子的数学表达式为:

     y=x1*x2

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

  2. 明确输入和输出。

    • matmul算子有两个输入:x1与x2,输出为y。
    • 算子输入的数据类型为float16,输出的数据类型为float32。
    • 算子输入支持固定shape,输入shape分别为(16,64)和(64,1024),输出shape为(16,1024)。
    • 算子输入支持的format为:ND。

  3. 确定算子开发方式及使用的计算接口。

    1. 计算过程中主要涉及矩阵乘法操作,初分析可使用matmul()接口实现矩阵x1*x2的操作。
    2. 由于在整个matmul的计算过程中会涉及到数据搬运操作,可使用data_move()接口把数据从Global Memory搬迁到L1 Buffer中。
    3. 矩阵计算完成后,对结果进行处理,可使用fixpipe()把数据从L1OUT Buffer搬迁到Global Memory中。

  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。

    本例中,算子类型定义为MatmulTik;算子的实现文件名称及实现函数名称定义为matmul_tik。通过以上分析,得到MatmulTik算子的设计规格如下:

    表1 MatmulTik算子设计规格

    算子类型(OpType)

    MatmulTik

    算子输入

    name:x1

    shape:(16,64)

    data type:float16

    format:ND

    name:x2

    shape:(64,1024)

    data type:float16

    format:ND

    算子输出

    name:y

    shape:(16,1024)

    data type:float32

    format:ND

    算子实现使用主要TIK接口

    matmul()

    data_move()

    fixpipe()

    算子实现文件/实现函数名称

    matmul_tik

分享:

    相关文档

    相关产品

close