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流水任务
单核处理程序可以有多个流水任务,任务之间会有数据依赖关系
![](https://img-blog.csdnimg.cn/f09619af7f2943d5a2bf70af8ba5c00c.png)
每个流水任务可以进行数据切片使得多个任务并行执行
![](https://img-blog.csdnimg.cn/ff9a8212fd8b4a06b5e4fbffd7270f18.png)
矢量编程的三个流水任务(Stage)
CopyIn
Compute
CopyOut
2.2任务间通信与同步
知识点
任务通信与同步管理单元
Queue
TQue
代码中的使用示例
TQue<TPosition::VECOUT, 2> que;
Queue
接口
EnQue(放入Queue)
DeQue(从Queue中取出)
Queue
的逻辑位置(
QuePosition
)
VECIN
VECOUT
![](https://img-blog.csdnimg.cn/04b96e32dcfa44848fd07f0ba2131cfb.png)
![](https://img-blog.csdnimg.cn/773f86b6245b451e8eda457ec0c59cd2.png)
关于矢量编程的任务间通信与同步的描述,正确的是:
Compute
任务中主要进行了数据的计算操作,需要从
VECIN
中取出
LocalTensor
,最后将结果
LocalTensor
存入
VECOUT
2.3内存管理
知识点
内存管理单元
Pipe
TPipe
TBuf
Pipe
接口
InitBuffer
(…)
Queue接口
AllocTensor
(…)
FreeTensor
(…)
Buf接口
Get(…)
内存管理模块 Pipe![](https://img-blog.csdnimg.cn/b08a6f2ec8dc41fe8a0d9f74a4a39180.png)
Pipe对TBuf初始化存储空间,Get方法获取全部分配到的存储空间或部分空间,从TBuf分配到LocalTensor
LocalTensor<T> Get<T>();
LocalTensor<T> Get<T>(uint32_t len);
![](https://img-blog.csdnimg.cn/20af91dc1b2d49fcbe7cf86c1be57fe5.png)
2.4算子开发流程
知识点
2.4.1基于内核调用符方式
![](https://img-blog.csdnimg.cn/292e3aff1e99442097811883b51b6f45.png)
2.4.2算子分析
2.4.3核函数定义
![](https://img-blog.csdnimg.cn/572999ac061b44cb93597c4aaf0dd645.png)
2.4.4算子类实现
![](https://img-blog.csdnimg.cn/bdd820ac676c432191e16a5d4232af9c.png)
![](https://img-blog.csdnimg.cn/c454f72fa907462392d49f0ef33759fa.png)
2.4.5成员函数实现
![](https://img-blog.csdnimg.cn/31585720531d4294a300b3dc061faba4.png)
下列关于矢量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://img-blog.csdnimg.cn/779b3ac279874a4eb7642ef1371d146c.png)
![](https://img-blog.csdnimg.cn/8723072a65814e2c85e5cd4c3a729759.png)
![](https://img-blog.csdnimg.cn/72156de0b8464d3d92dd84c2c8b25588.png)