一、学习目标
1. 掌握TIKC++矢量算子动态shape输入的实现
2. 掌握CPU模式下的算子调试技术
3. 掌握UT和ST的测试编码方法
4. 了解NPU模式下的性能采集与分析
二、动态shape算子
1.
基于现有的固定shape算子,将其改装为动态shape的算子。将控制形状的BLOCK DIM,TOTAL LENGTH,TILE NUM这些变量依靠外界输入得到,在核函数中额外传入一个tiling,它将指向控制核函数逻辑处理的至关重要的这几个变量
2. tiling结构体
流程:
tiling结构体中的信息:
- BLOCK DIM:并行计算使用的核数
- TOTAL LENGTH:总共需要计算的数据个数
- TILE NUM:每个核上计算数据分块的个数
3. tiling解析函数
核函数传入tiling指针,与x,y,Z的角色相同,添加获得tiling结构体的宏函数调用GET_TILING DATA
4. 与固定shape对比
(1)核函数
(2)KernelAdd类
(3)Init()函数
(4) main.cpp
(5)
三、功能调试
TIK C++提供孪生调试技术,即在CPU模式下进行运算实际上会创建一个NPU的模型并模拟它的计算行为以此进行业务功能的调试。相同的算子代码可以在CPU模式下进行精度调试,并无缝切换到NPU模式下运行。
四、测试验证
1.UT
UT的本质是使用内核调用符测试CPU模式下的TIK C++算子用例
为TIK C++自定义算子添加UT测试步骤:
2.ST
ST的本质是创建ACL应用程序测试NPU模式下的TIK C++算子用例
为TIK C++自定义算子添加ST测试步骤:
3.
host侧算子实现开发,包括算子原型注册、Shape推导等函数实现与注册、Tiling实现与注册和信息库配置
- 算子原型注册,算子原型描述了算子的输入输出,属性等信息,算子原型注册用于将算子注册到算子原型库中
- Shape推导等函数实现与注册,根据算子的输入张量描述、算子逻辑及算子属性,推理出算子的输出张量描述,包括张量的Shape、数据类型及数据排布格式等信息。这样算子构图准备阶段就可以为所有的张量静态分配内存,避免动态内存分配带来的开销
- Tiling实现与注册,计算数据切分过程相关的参数,比如每次计算的数据量大小
- 信息库配置(根据运行平台进行配置),算子开发者需要通过配置算子信息库文件,将算子在异腾A处理器上相关实现信息注册到算子信息库中
五、性能采集
性能采集工具-msprof
当使用内核调用符时,会生成相应的二进制可执行文件,可以使用性能采集工具运行NPU模式下生成的可执行文件从而采集TIK C++算子在昇腾平台上执行的性能数据。