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

news2024/11/17 21:17:56

第一章 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应用和业务。

image.png

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样式。
image.png

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

image.png

单程序多数据(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

image.png
image.png
上面命令全部执行完以后,可能会显示需要配置环境变量
二、配置环境变量
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
运行成功截图如下:
image.png

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1118544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java并发编程常见面试题总结

梳理Java并发编程相关的面试题,主要参考《JAVA并发编程实战》(Brian Goetz, Joshua Bloch, David Holmes, Tim Peierls, Joseph Bowbeer, Doug Lea 著, 韩锴, 方妙 译)一书,其余部分整合网络相关内容。注意,关于Java基础相关的面试题可以参考…

‘conda‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

原因:环境变量没有正确添加解决:我的电脑—右键属性—高级系统设置—环境变量—系统变量—Path—双击进入—新建,去安装Anaconda的目录下,找到Library中的bin,将此时的路径粘贴到此处

Python学习第3天-第一个Python程序

文章目录 前言一、创建项目二、创建程序总结 前言 下面给大家展示下经典的Hello World! 一、创建项目 二、创建程序 print("Hello World!")总结 回到顶部 学习网站 欢迎来到Python的世界!

Leetcode1833. 雪糕的最大数量

Every day a Leetcode 题目来源:1833. 雪糕的最大数量 解法1:贪心 排序 本题唯一的难点在于计数排序。 计数排序详解:C算法之计数排序 为了尽可能多的买到雪糕,我们选择从价格低的雪糕开始买,统计能够买到的雪糕…

SQL基础语法总结(查询)

学习网站:https://www.w3schools.com/sql/,提供在线编程 以下内容仅SQL常见语法总结 数据 Customers表 Products表 OrderDetails表 Orders表 Shippers表 Employees表 选择查询 SELECT select语句用来从头数据库中选择数据 SELECT column1, column2,…

基于SSM的大学校医管理系统

基于SSM的大学校医管理系统、学校医院管理系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 主页 登录系统 用户界面 管理员界面 摘要 大学校医管理系统…

Linux系统编程:进程part_2(信号相关)

前言 这一节内容我没怎么认真写,就是纯当草草过了一遍,这部分不是很重要当然能掌握肯定更好。 更多的是有个印象然后知道遇到这样的问题能回想起来知道怎么解决即可(虽然不太可能遇到)。 信号量 实现PV操作 P:测试并…

springboot生成二维码的正确姿势-附视频附源码

二维码的原理是什么,如何保证不重复?你有没有想过这样一件事,二维码是实现原理是什么?如何保证各个平台的二维码是唯一的?就算你的程序停止运行,但是你的二维码依然存在。设计上要保证唯一性,比…

ubuntu启动模式介绍以及如何进入单用户模式和恢复模式

Ubuntu操作系统提供了多种启动模式,每种模式都有不同的用途和功能。下面将深入介绍Ubuntu的几种启动模式: 正常启动模式(Normal boot):这是默认的启动模式,也是大多数用户使用的模式。在正常启动模式下&am…

Linux 救援模式

Linux突然坏了 第三次坏了 第一次是找不到盘,修复好了 第二次是找不到卷,但是能启动,启动界面选择救援模式,可以正常使用 第三次,尝试修复卷,启动后,找不到文件系统了,只能从光盘…

【C++】继承和多态常见的问题

一、概念考查 1、下面哪种面向对象的方法可以让你变得富有( A ) A. 继承 B. 封装 C. 多态 D. 抽象 继承机制是面向对象程序设计使代码可以复用的最重要手段,继承是类设计层次的复用。 2、( D )是面向对象程序设计语…

【MySQL】数据库数据类型

文章目录 1. 整体概要2. 数值类型(有符号) tinyint 创建表(无符号) tinyint 创建表bit类型float 类型(无符号)floatdecimal 3. 二进制类型char类型varchar类型 4. 日期时间日期时间类型 5. string 类型enum类型和set类型enum类型和set类型的查找在枚举中的查找在set中的查找 1.…

MOSFET(五):DrMos

一、简介 DrMos(Driver MOSFET)技术是 Intel 于2004年推出的服务器主板节能技术,即把 2 个MOSFET和 1 个MOS驱动器 三合一,集成在一个封装中。集成后的 DrMos 面积是分离MOSFET的 ,功率密度是其 倍,通过搭…

华为eNSP配置专题-BGP路由协议的配置

文章目录 华为eNSP配置专题-BGP路由协议的配置0、概要介绍1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、终端构成和连接2.2、终端的基本配置 3、OSPF配置4、BGP配置4.1、BGP的基本配置4.2、BGP中路由的宣告4.3、BGP的监控 5、让PC1和PC2互通5.1、将BGP的路由引入…

【鸿蒙软件开发】ArkTS常用组件之Button

文章目录 前言一、创建按钮1.1 Button创建接口介绍1.2 创建正常的按钮,不包括子组件1.3 创建正常的按钮,包括子组件1.4 按钮的不同样式胶囊按钮(默认类型)圆形按钮普通按钮 二、添加事件2.1 .onClick事件添加事件 三、什么时候使用…

【十四】记一次MySQL宕机恢复过程,MySQL INNODB 损坏恢复

记一次MySQL宕机恢复过程 简介:一个业务数据库疏于运维管理,突然在今天崩溃宕机了,真是让人抓狂,上面也不知道积累了多久的数据,平时也没有定期做好备份,这下岂不是瞎了啊,经过不断的收集信息和…

Base 编码家族:Base16 编码

文章目录 参考环境Base 编码Base 的含义计数系统编码系统 为什么需要 Base 编码?ASCII 编码 Base16 编码概念Base16 字符集 Base16 编码原理编码 Base16 编码特点体积膨胀 参考 项目描述搜索引擎Bing、GoogleAI 大模型文心一言、通义千问、讯飞星火认知大模型、Cha…

Git Bash(一)Windows下安装及使用

目录 一、简介1.1 什么是Git?1.2 Git 的主要特点1.3 什么是 Git Bash? 二、下载三、安装3.1 同意协议3.2 选择安装位置3.3 其他配置(【Next】 即可)3.4 安装完毕3.5 打开 Git Bash 官网地址: https://www.git-scm.com/…

【C++】特殊类实现

一、请设计一个类,不能被拷贝 拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝, 只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 C98 将拷贝构造函数与赋值运算符重载只声明不定义…

聚类分析 | Python密度聚类(DBSCAN)

密度聚类是一种无需预先指定聚类数量的聚类方法,它依赖于数据点之间的密度关系来自动识别聚类结构。 本文中,演示如何使用密度聚类算法,具体是DBSCAN(Density-Based Spatial Clustering of Applications with Noise)来…