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

设计思路

本节以BatchNorm算子为例,介绍通过TIK方式进行算子开发的设计思路。

算子分析

BatchNorm算子主要包括以下两部分:

  • 对输入进行归一化处理,xnorm = (x − μ) / σ,其中, μ和 σ是计算的均值和方差。
  • 归一化后进行缩放和平移,得到输出y = γ * xnorm + β。

本样例重点关注的是算子动态shape场景,因此仅实现了归一化处理部分。

算子规格

确定BatchNorm算子设计规格。

参数

规格

支持框架

Caffe

格式

单算子调用场景设计,采用NCHW格式。

输入数据类型

用户自行设计。当前样例为float16。

N

用户自行设计。当前样例支持单Batch,即N=1。

C

用户自行设计。当前样例为0~1024通道。

H

用户自行设计。当前样例为0~1024像素。

W

用户自行设计。当前样例为0~1024像素。

shape

支持任意shape。

Tiling设计

BatchNorm算子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 MemoryUnified Buffer间PingPong操作。

说明:112KB是结合pingpong流水线考虑后的Size值,为Unified Buffer空间的一半并保留一定大小的Buffer缓存空间,下文不再赘述。

Tiling_3:单featuremap的H*W*C(C>1) <= 112KB时,一次可搬运多个通道,Global MemoryUnified Buffer间pingpong操作,不同通道间可考虑多核优化。

下面分别介绍各种场景的详细设计思路:

  1. 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对齐。

  2. 单通道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等待时间。

  3. 多通道HW并行场景设计思路。

    考虑Unified Buffer空间大小, 当Size (H*W*C) (C > 1) < 112KB时,可一次搬运多个通道的数据,C通道方向可以考虑多核并行计算。

    设计时考虑Global Memory->Unified Buffer->Global Memory的PingPong操作,提高单位时间内Vector利用率,减少Vector等待时间。

分享:

    相关文档

    相关产品

close