算子实现
本节介绍如何针对每一种Tiling策略分别进行算子实现。BatchNorm算子的完整实现代码请参考样例使用获取。
代码结构
不同Tiling策略下,代码结构类似,如下所示:
import os
import warnings
from tbe import tik
from tbe.common.platform import set_current_compile_soc_info
#tiling mode 2 ub size
TILING_1_UB_SIZE = 112*1024
#max allow general mem size
TOTAL_GM_SIZE = 512*1024*1024 #GM_MAX_SIZE
# batch for N
MAX_BATCH = 1
# channel for C
MAX_CHANNEL = 1024
# width for W
MAX_WIDTH = 512
# height for H
MAX_HEIGHT = 1024
class BatchNorm(object):
# 初始化函数
def __init__(self, input0, gamma0, beta0, output0, kernel_name = "BatchNorm"):
"""
初始化函数实现
"""
# 算子计算逻辑实现和编译
def batchnorm_compute(self):
# 不同Tiling策略下计算逻辑不同
self.batchnorm_compute_tiling_c()
# 算子编译
self.tik_instance.BuildCCE(kernel_name=self.kernel_name,
inputs=[self.input_gm,
self.gamma_gm,
self.beta_gm],
outputs=[self.output_gm],
flowtable=[self.input_n, self.input_c,
self.input_h, self.input_w,
self.inputtype, self.output_n,
self.output_c, self.output_h,
self.output_w, self.outputtype,
self.gamma_c, self.gammatype,
self.beta_c, self.betatype,
self.param1, self.param2,
self.param3, self.param4,
self.param5, self.param6,
self.param7, self.param8,
self.param9, self.param10],
config={"double_buffer_non_reuse": True,
"out_of_bound_sync_check": True})
return self.tik_instance
# 算子定义函数
def batch_norm(input_x, gamma, beta, output, kernel_name="BatchNorm"):
obj = BatchNorm(input_x, gamma, beta, output, kernel_name)
obj.batchnorm_compute()
如下几点需要关注:
- 不同Tiling策略下,代码结构类似,主要区别点在于不同Tiling策略下计算逻辑不同。
- 通过BuildCCE接口编译TIK算子时,可以传入flowtable参数。该参数为算子选择器计算好的Tiling参数,相当于在output容器后增加一段用户缓存Tiling参数的地址空间,flowtable列表中的Tiling参数个数和inputs的参数个数之和小于等于64,每个Tiling参数为TIK InputScalar类型,Tiling参数不在TIK中计算,将重复的Scalar运算全部转移到Host CPU上的算子选择器计算,减少AI Core上Scalar运算量,有利于流水线并行。
父主题: 参考实现