算子分析
使用TIK方式开发matmul算子前,我们需要确定算子功能、输入、输出,算子开发方式、算子类型以及算子实现函数名称等。
- 明确算子的功能以及数学表达式。
matmul算子的数学表达式为:
y=x1*x2
计算过程是:将两个输入矩阵相乘,得到最终结果矩阵z并将其返回。
- 明确输入和输出。
- matmul算子有两个输入:x1与x2,输出为y。
- 算子输入的数据类型为float16,输出的数据类型为float32。
- 算子输入支持固定shape,输入shape分别为(16,64)和(64,1024),输出shape为(16,1024)。
- 算子输入支持的format为:ND。
- 确定算子开发方式及使用的计算接口。
- 计算过程中主要涉及矩阵乘法操作,初分析可使用matmul()接口实现矩阵x1*x2的操作。
- 由于在整个matmul的计算过程中会涉及到数据搬运操作,可使用data_move()接口把数据从Global Memory搬迁到L1 Buffer中。
- 矩阵计算完成后,对结果进行处理,可使用fixpipe()把数据从L1OUT Buffer搬迁到Global Memory中。
- 明确算子实现文件名称、算子实现函数名称以及算子的类型(OpType)。
- 算子类型需要采用大驼峰的命名方式,即采用大写字符区分不同的语义。
- 算子文件名称和算子函数名称,可选用以下任意一种命名规则:
本例中,算子类型定义为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
