鲲鹏&昇腾创新大赛集训营——Ascend C 算子开发课程笔记
收藏回复举报
鲲鹏&昇腾创新大赛集训营——Ascend C 算子开发课程笔记
新人帖
发表于2024-07-02 17:21:18
0 查看

本次主要学习Ascend C算子。Ascend C算子采用标准C++语法和一组类库API进行编程,方便根据自己的需求选择合适的API开发自定义算子

其运用再 Ascend 处理器使用, Ascend 处理器用的是SoC+达芬奇架构(为矩阵加速设计) Arm架构cpu 。

理论知识

CANN是用于算子开发的框架。对于算子,可以理解为各类抽象的映射、net 中的层等,根据需求实现相应运算。比如有 relu,sigmoid,conv 等

Ascend C 算子编程语言是专门为 CANN 开发的,可以根据直接的需要编写算子,提高性能,完成更多需求。

SPMD 模型,多kernel并行 LocalTensor and GlobalTensor

算子在kernel侧实现

对于 Ascend C 的计算范式,以最简单的矢量计算为例,可以分为 copyin``compute``copyout.

通过que实现任务间的通信与同步,阻塞Deque来实现有序的传值

算子在host侧实现

张量的切分 Tiling 由于内存限制,将数据分块逐步搬到Local Memory 避免动态分配内存 还要注意 data type的转换

算子调用方式

  1. 快速调用

  2. 基于工程的调用

    ◦ aclnnxxx ◦ aclopExecuteV2 ◦ pytorch adapter 等

矩阵编程

分形格式 NZ格式,对最低2 dimensions, pad reshape transpose 单个cube一次只能算16*16 连续写和非连续写模式 切分后的尾块 settail()

优化

数据在机器内部的传输是性能瓶颈

Scalar优化; 0级API指令效率最高; 层次访存优化。

实验

本次实验主要基于 Orange Pi AIpro 进行实践。

首先将 OrangePi 与电脑通过 SSH 进行连接。实践分为两部分,包括 Kernel 直调工程体验和 AclNN 调用体验。最终根据学习的内容考取相关微认证。

直调工程体验

将 add 算子转化为 sinh 算子,并基于基础 API 实现。

核心代码:

Exp(zLocal, xLocal, TILE_LENGTH);
Muls(xLocal, xLocal, (half)-1.0, TILE_LENGTH);
Exp(xLocal, xLocal, TILE_LENGTH);
Sub(zLocal, zLocal, xLocal, TILE_LENGTH);
Muls(zLocal, zLocal, (half)0.5, TILE_LENGTH);

主要根据 API 的 Doc 实现,并关注Ascend C算子的整体结构。

并比较算子实现的 sinh 和标准的 sinh 来验证算子的正确性。

AclNN 工程体验

需要同时在 host 侧和 kernel 侧进行修改。

根据 Example 中的程序进行修改。

需要注意各类参数、数据类型的设置和实现。

最终效果: true

成果

通过实验和课程对于 Ascend C 以及 CANN 有了一定的了解与认识,对于神经网络等技术在更底层的实现、优化、加速有所了解。

本帖最后由 匿名用户 于 2024/07/04 16:44:26 编辑

我要发帖子