2023CANN训练营第二季——Ascend C算子开发(入门)——基础概念

第一章 Ascend C 算子开发入门

一、基础概念

1.Ascend C

概念:Ascend C是CANN针对算子开发场景推出的编程语言,原生支持C和C++标准规范,最大化匹配用户开发习惯;通过多层接口抽象、自动并行计算、孪生调试等关键技术,极大提高算子开发效率,助力AI开发者低成本完成算子开发和模型调优部署。

使用Ascend C开发的优势:

1.支持C和C++语言,开发者可以使用这两种编程语言进行自定义算子。

2.Ascend C能够屏蔽硬件差异性,意思是写一套Ascend C代码,可以在不同的硬件架构上执行,这对于昇腾不断推出新的硬件,但是原来的Ascend C代码还是可以正常运行,是十分重要的。

3.具备四级API接口,开发者可以调用不同层级的API接口定义算子,非常灵活高效

4.孪生调试,这个词的意思是对于不具备NPU的情况下,Ascend C提供了CPU侧可以模拟NPU行为,以减少对NPU依赖。这对于不具备NPU资源时非常有利。

2.CANN架构

华为昇腾计算架构CANN通过提供多层次编程接口,支持用户快速构建基于昇腾平台的AI应用和业务。

CANN 和Ascend C的关系:

在华为昇腾计算架构CANN中,Ascedn C作为其计算语言,具有三大开发模式,分别为:算子开发,模型开发,应用开发。除了计算语言外,CANN还包括了昇腾计算服务层、编译层、执行层、基础层,这些层级可以进一步帮助开发者自定义算子,然后将算子移植到不同的模型里面,使模型在NPU上训练,最后推出神经网路模型或者大型人工智能应用程序。

3.SIMD计算

首先认识什么一个概念:AICore

NPU是华为AI加速卡,而AICore是NPU的计算核心,每个NPU内部有多个AICore,开发者可以将不同的任务分发到AICore上执行。

AICore内部支持三种核心计算:标量、向量、矩阵运算

标量就是简单的两个数进行相加:x+y=z

而向量好比一维矩阵,是两个矢量相加,每个矢量里面可能包含多个数据。

矩阵运算就是二维矩阵,两个二维矩阵之间进行运算

SIMD,翻译为单指令多数据计算,表示一条指令可以处理多个数据,可以进行多个AICore计算。

在Ascend C编程语言中,计算API主要使用向量计算和矩阵运算,且都遵循SIMD样式。

4.单程序多数据(SPMD)和流水线并行

单程序多数据(Single Program, Multiple Data,SPMD)
原理: 单程序多数据(Single Program, Multiple Data,SPMD)是一种并行计算模型,在 SPMD 模型中,所有的处理单元(通常是处理器或计算节点)都执行相同的程序,但可以处理不同的数据。
特点:

  • 同一程序:所有处理单元执行相同的程序代码,不需要不同的程序版本。
  • 多数据:每个处理单元可以操作不同的数据集,通常通过数据分割或分发来实现。
  • 独立执行:每个处理单元独立执行,无需与其他处理单元进行协同工作。
  • 数据并行:并行计算是通过将数据分成多个部分并将这些部分分配给不同的处理单元来实现的。

流水线并行
原理: 流水线并行是一种将复杂任务分成多个阶段,然后将这些阶段分配给不同的处理单元以并行执行的计算模型。每个处理单元负责执行一个阶段,并且不需要等待整个任务完成,而是将部分结果传递给下一个阶段,以实现连续的并行计算。
特点:

  • 任务分解:复杂任务被分解成多个互相依赖的阶段。
  • 并行执行:不同的处理单元同时执行不同阶段的任务。
  • 流水线操作:数据或任务从一个阶段传递到下一个阶段,形成流水线操作。
  • 减少等待时间:由于阶段之间的互相依赖性,流水线并行可以减少任务的总执行时间。

实验

Ascend C算子开发快速入门

根据昇腾社区文档,自己快速跑一个简单的Ascend C 加法算子开发实例,代码地址在samples仓库:代码仓库

一、环境准备

在ModelArts平台创建一个训练环境Notebook,然后打开终端。

1、使用wget工具从指定URL下载Ascend AI Toolkit的安装脚本:
wget https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/Milan-ASL/Milan-ASL%20V100R001C13SPC702/Ascend-cann-toolkit_7.0.RC1.alpha002_linux-x86_64.run -O Ascend-cann-toolkit_7.0.RC1.alpha002_linux-x86_64.run

2、使用chmod命令添加执行权限,以允许运行Ascend-cann-toolkit_7.0.RC1.alpha002_linux-x86_64.run

chmod +x Ascend-cann-toolkit_7.0.RC1.alpha002_linux-x86_64.run

3、运行Ascend-cann-toolkit_7.0.RC1.alpha002_linux-x86_64.run脚本
./Ascend-cann-toolkit_7.0.RC1.alpha002_linux-x86_64.run --install --force

4、使用wget下载Ascend AI Toolkit的社区软件开发工具包的压缩文件。
wget https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/Milan-ASL/Milan-ASL%20V100R001C13SPC702/Ascend-cann-communitysdk_7.0.RC1.alpha002_linux-x86_64.tar.gz -O Ascend-cann-communitysdk_7.0.RC1.alpha002_linux-x86_64.tar.gz

5、使用tar命令解压缩之前下载的压缩文件,并将文件提取到~/Ascend/ascend-toolkit/latest 目录
tar -xf Ascend-cann-communitysdk_7.0.RC1.alpha002_linux-x86_64.tar.gz -C ~/Ascend/ascend-toolkit/latest

6、使用wget下载CMake工具的Linux x86_64版本的压缩文件
wget https://github.com/Kitware/CMake/releases/download/v3.26.4/cmake-3.26.4-linux-x86_64.tar.gz

7、使用tar解压缩之前下载的CMake工具的压缩文件
tar -xf cmake-3.26.4-linux-x86_64.tar.gz


上面命令全部执行完以后,可能会显示需要配置环境变量

二、配置环境变量
source /home/ma-user/Ascend/ascend-toolkit/set_env.sh
export ASCEND_CUSTOM_PATH=$HOME/Ascend/ascend-toolkit/latest
export ASCEND_HOME_DIR=$HOME/Ascend/ascend-toolkit/latest
export PATH=/home/ma-user/work/cmake-3.26.4-linux-x86_64/bin:$PATH

三、运行脚本

执行完上面四句命令之后,就可以去下载gitee代码仓库了
git clone https://gitee.com/ascend/samples.git

切换到Add算子文件库
cd ./samples/cplusplus/level1_single_api/4_op_dev/6_ascendc_custom_op/kernel_invocation/Add

CPU模式下执行
bash run.sh add_custom ascend910 AiCore cpu

运行成功截图如下:

总结

我学习了Ascend C算子开发入门课程的基础概念,然后做了一个很简单加法算子开发实验,对于Ascend C有了一定程度的理解,虽然我是初学者,然后现在学下来感觉有些复杂,有点难理解,但是我相信,跟着课程一步一步来,下一节学习Ascend C编程模型与范式,深入地理解多核并行、流水编程等概念,学习核函数开发,核函数验证的具体知识点。希望最后可以对Ascend C有一个更全面的认识,且可以自己学会写使用Ascend C编程,加油,坚持学习,坚持进步,慢慢来!

相关推荐
guozhetao2 分钟前
【ST表、倍增】P7167 [eJOI 2020] Fountain (Day1)
java·c++·python·算法·leetcode·深度优先·图论
小坏坏的大世界5 小时前
C++ STL常用容器总结(vector, deque, list, map, set)
c++·算法
liulilittle6 小时前
C++ TAP(基于任务的异步编程模式)
服务器·开发语言·网络·c++·分布式·任务·tap
励志要当大牛的小白菜7 小时前
ART配对软件使用
开发语言·c++·qt·算法
PAK向日葵8 小时前
【算法导论】如何攻克一道Hard难度的LeetCode题?以「寻找两个正序数组的中位数」为例
c++·算法·面试
QQ_43766431413 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
liulilittle14 小时前
C++/CLI与标准C++的语法差异(一)
开发语言·c++·.net·cli·clr·托管·原生
小狄同学呀14 小时前
VS插件报错,g++却完美编译?API调用错因分析
c++
程序员编程指南14 小时前
Qt 数据库连接池实现与管理
c语言·数据库·c++·qt·oracle
小乖兽技术15 小时前
C#与C++交互开发系列(二十四):WinForms 应用中嵌入C++ 原生窗体
c++·c#·交互