1.课程简介
课程地址
第二章 Ascend C(旧名TIK C++)算子编程范式及算子实现
https://www.hiascend.com/zh/developer/courses/detail/1627494761683783682
课程视频
https://space.bilibili.com/1190614918/channel/collectiondetail?sid=1201995
TIK2文档
https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/63RC1alpha002/operatordevelopment/tik2opdevg/atlastik2_10_0001.html
在线实验>基于昇腾CANN的TIK C++算子开发
https://www.hiascend.com/zh/edu/experiment/detail/Tik_xl
示例代码
https://gitee.com/zgx950813/samples/tree/master/tik2_demo/kernel_samples/kernel_add_sample
2.课程内容
2.1流水任务
单核处理程序可以有多个流水任务,任务之间会有数据依赖关系
每个流水任务可以进行数据切片使得多个任务并行执行
矢量编程的三个流水任务(Stage)
CopyIn
Compute
CopyOut
2.2任务间通信与同步
知识点
任务通信与同步管理单元 Queue
TQue
代码中的使用示例
TQue que;
Queue 接口
EnQue(放入Queue)
DeQue(从Queue中取出)
Queue 的逻辑位置( QuePosition )
VECIN
VECOUT
关于矢量编程的任务间通信与同步的描述,正确的是:
Compute 任务中主要进行了数据的计算操作,需要从 VECIN 中取出 LocalTensor ,最后将结果 LocalTensor 存入 VECOUT
2.3内存管理
知识点
内存管理单元 Pipe
TPipe
TBuf
Pipe 接口
InitBuffer (…)
Queue接口
AllocTensor (…)
FreeTensor (…)
Buf接口
Get(…)
内存管理模块 Pipe
Pipe对TBuf初始化存储空间,Get方法获取全部分配到的存储空间或部分空间,从TBuf分配到LocalTensor
LocalTensor Get();
LocalTensor Get(uint32_t len);
2.4算子开发流程
知识点
2.4.1基于内核调用符方式
2.4.2算子分析
2.4.3核函数定义
2.4.4算子类实现
2.4.5成员函数实现
下列关于矢量Add算子开发流程的描述,正确的是:
A. 该样例使用了多个优化方法,如多核并行, Tiling 分块, Double Buffer 等
B. 该样例使用了多个 TIK C++ 的 API 接口,如涉及数据搬运的 DataCopy (…) ,涉及数据计算的 Add(…) 等
C. 该样例使用了 Queue 来管理任务同步,实例化了 VECIN 和 VECOUT 的队列来管理 LocalTensor 的 EnQue(…) 和 DeQue(…)
D. Init(…) 函数主要为了做一些内存初始化操作,如使用 SetGlobalBuffer (…) 来确定不同逻辑 ID 核的 GlobalTensor 初始地址
E. 该样例设计了 CPU 模式和 NPU 模式,并用内置宏 __CCE_KT_TEST__ 区分,开启宏的代码块会在C PU 模式下参与编译
2.5样例演示
算子样例代码包含
算子工程编译配置 CMakeLists.txt
算子核函数源码文件
算子输入和真值数据生成脚本
算子主机侧调用源码文件
算子一键化调用脚本
https://gitee.com/zgx950813/samples/tree/master/tik2_demo/kernel_samples/kernel_add_sample