【2023 · CANN训练营第一季】- Ascend C 新算子入门专项讲解

本课程以矢量编程Add算子为例,对Ascend C(旧名TIK C++)的使用进行详细讲解,并讲解sqrt单目算子的改写步骤

视频地址

https://www.bilibili.com/video/BV1Lh4y1b7Fz/?spm_id_from=333.999.0.0&vd_source=fab7ab33e37b07e028e35048a6ab7634

pdf文档下载:TIK2算子开发

https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/63RC1alpha002/download

1.昇腾AI处理器的硬件结构

文档地址

https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/63RC1alpha002/operatordevelopment/opdevg/atlasopdev_10_0005.html

CANN算子在昇腾AI处理器上的位置
TIK C++算子在AI Core上运行

【2023 · CANN训练营第一季】- Ascend C 新算子入门专项讲解_第1张图片

【2023 · CANN训练营第一季】- Ascend C 新算子入门专项讲解_第2张图片

向量运算每个时钟周期可以运算的数据是256Bytes

2.算子开发的思想:大事化小

1.切分

比如说我们要计算一个8*2048 half (float)类型的数据。

昇腾AI处理器里面有8个计算核心,所以我们要把这些数据要给它分到这些计算核心上,在这个例子里面,就是把它分成了八份,分给了八个计算核心去进行计算。

【2023 · CANN训练营第一季】- Ascend C 新算子入门专项讲解_第3张图片

2.double buffer

【2023 · CANN训练营第一季】- Ascend C 新算子入门专项讲解_第4张图片

double buffer是基于MTE指令队列与Vector指令队列的独立性和可并行 性,通过将数据搬运与Vector计算并行执行以隐藏数据搬运时间并降低Vector指令的等 待时间,最终提高Vector单元的利用效率,您可以通过为队列申请内存时中设置内存 块的个数来实现数据并行,简单代码示例如下:

pipe.InitBuffer(inQueueX, 2, 256);

就是copy in/compute/copy out 三个步骤并行了

3.再看Add算子运行的过程

3.1 参考gitee中的源代码

Ascend/cann_op_contrib

TIK2 C++的例子在这个目录下

/root/cann_op_contrib/community/ops

UT相关的文件有4个

ST相关的文件有4个

具体可参考在线实验:基于昇腾CANN的Ascend C算子开发

昇腾社区-官网丨昇腾万里 让智能无所不及

4.使用其它矢量算子试一试 sqrt

单目算子的编写可参考官方文档TIK2的第五章矢量编程,在add示例代码的基础上修改为单目计算(求平方根)

要点:

1.输入有2个变量改为1个变量

2.Compute部分Add算子改为Sqrt

【2023 · CANN训练营第一季】- Ascend C 新算子入门专项讲解_第5张图片

你可能感兴趣的:(c++,开发语言)