TIK C++算子编程范式及算子实现
编程范式
- 流水任务:单核处理程序中主程序调度的并行任务
• 同一时间,可以有多个流水任务在并行处理
- TIK C++ 把算子内部的处理程序分成多个流水任务以张量为数据载体以队列进行任务之间的通信与同步以内存管理模块管理内存间的通信
任务之间的通信与同步
- Queue完成任务之间的通信与同步提供EnQue与DeQue等API矢量编程中Queue类型(逻辑位置)包括:VECIN、BECOUT
内存管理
- 内存统一使用内存管理模块Pipe进行管理
- 通过InitBuffer对外提供Queue内存初始化功能,可为指定的Queue分配内存调用AllocTensor为LocalTensor分配内存使用FreeTensor回收LocalTensor
- 临时内存使用TBuf数据结构来申请指定QuePosition上的存储空间使用Get()将分配到的存储空间分配给新的LocalTensor
开发范例
- 算子开发流程
• 快速TIK C++算子开发流程:完成核函数开发,基于内核调用符进行算子验证
• 标准TIK C++算子开发流程:完成核函数开发,完成单算子网络程序开发基于ACL单算子调用方式进行算子运行验证
• 算子分析:输入输出,实现逻辑核函数定义:定义入口函数内部实现:根据矢量编程范式实现算子类
- 流程
•
端到端TIK C++算子开发流程
动态shape算子
- 动态shiape,输入shape频繁变动开发难度高,要考虑不同的逻辑分支优化难度高,AI编译器对未知数据采取保守策略
- 将固定shape变为动态shape将控制形状的变量变为输入
• tiling结构体设计tiling结构体 - 实现tiling解析函数 - 核函数调用tiling结构体
• tiling解析函数对不同模式涉及到指针转化,需要用宏函数进行区分
• 用宏函数INIT_TILING_DATA区分tilingdata不同的初始化过程
• 使用宏函数GET_TILINT_DATA暴露给核函数进行调用
- 文件区别
•
CPU模式下算子功能调试
- TIK C++支持孪生调试技术,模拟在NPU下的环境进行调试
• 1、GDB进行调试2、使用printf或者std::cout进行调试
测试验证
- UT测试:本质是使用内核调用符测试CPU模式下的TIK C++算子用例
- ST测试:本质是建立ACL应用程序测试NPU模式下的TIK C++算子用例
算子入门专项讲解
昇腾AI处理器的硬件结构
- 算子执行在AI Core
• 计算单元:Cube矩阵运算Vector向量运算Scalar标量数据与流程控制
- 算子开发的思想:大事化小数据切分,运行+等待
Add算子运行过程
- 任务间数据传递使用到的内存统一由内存管理模块Pipe进行管理Queue队列内存初始化完成后,需要使用内存时,通过调用AllocTensor来分配内存
- 开辟两倍内存,充分利用计算单元使其在数据存取阶段进行计算
- 开发步骤
• 1、切分数据。2、是否开启double buffer。3、如何规划整体计算流程。4、编码实现。