设计思路
本节以BatchNorm算子为例,介绍通过TIK方式进行算子开发的设计思路。
算子分析
BatchNorm算子主要包括以下两部分:
- 对输入进行归一化处理,xnorm = (x − μ) / σ,其中, μ和 σ是计算的均值和方差。
- 归一化后进行缩放和平移,得到输出y = γ * xnorm + β。
本样例重点关注的是算子动态shape场景,因此仅实现了归一化处理部分。
算子规格
| 参数 | 规格 | 
|---|---|
| 支持框架 | Caffe | 
| 格式 | 单算子调用场景设计,采用NCHW格式。 | 
| 输入数据类型 | 用户自行设计。当前样例为float16。 | 
| N | 用户自行设计。当前样例支持单Batch,即N=1。 | 
| C | 用户自行设计。当前样例为0~1024通道。 | 
| H | 用户自行设计。当前样例为0~1024像素。 | 
| W | 用户自行设计。当前样例为0~1024像素。 | 
| shape | 支持任意shape。 | 
Tiling设计
| 场景划分 | 策略 | 
|---|---|
| C通道并行度占优,C > H*W | Tiling_1:按照C通道方向并行逐像素点计算,通道设计需考虑32Byte对齐,采用Pingpong以及多核优化技术。 | 
| 单通道HW并行度占优,C < H*W | Tiling_2:单featuremap的H*W*C(C=2)>112KB时,则一次最多能搬运1个通道,按照单通道方向切分featmap来计算BN,考虑Global Memory与Unified Buffer间PingPong操作。 说明:112KB是结合pingpong流水线考虑后的Size值,为Unified Buffer空间的一半并保留一定大小的Buffer缓存空间,下文不再赘述。 | 
| Tiling_3:单featuremap的H*W*C(C>1) <= 112KB时,一次可搬运多个通道,Global Memory与Unified Buffer间pingpong操作,不同通道间可考虑多核优化。 | 

下面分别介绍各种场景的详细设计思路:
- C通道并行场景设计思路。对于C > HW场景,例如NCHW为1x1024x8x6时,C通道并行度占优,需要充分利用C通道并行逐像素计算每个点BatchNorm值。性能提升方面考虑pingpong流水线操作与多核并行技术,提高Unified Buffer利用率。 - Size(N*C*H*W) < 112KB, 只需1次Global Memory->Unified Buffer->Global Memory搬运,不需要考虑HW平面上的Tiling策略。
- Size(N*C*H*W) > 112KB, 需多次Global Memory->Unified Buffer->Global Memory搬运,需要考虑HW平面上的Tiling策略。当H*W或C不满足32Byte对齐时,需要补成32Byte对齐。 注:图中的M=16倍数,是针对当前例子的float16类型数据进行32Byte对齐。 
 
- 单通道HW并行场景设计思路。- 当Size (H*W) < 112KB且Size (H*W*2) > 112KB时,仅考虑在单featuremap上逐像素计算每个点BatchNorm值。
- 当Size(H*W) > 112KB时,需考虑featuremap上Tiling策略。
 设计时考虑Global Memory->Unified Buffer->Global Memory的PingPong操作,提高单位时间内Vector利用率,减少Vector等待时间。  
- 多通道HW并行场景设计思路。考虑Unified Buffer空间大小, 当Size (H*W*C) (C > 1) < 112KB时,可一次搬运多个通道的数据,C通道方向可以考虑多核并行计算。 设计时考虑Global Memory->Unified Buffer->Global Memory的PingPong操作,提高单位时间内Vector利用率,减少Vector等待时间。 