当前位置: 首页 > news >正文

2024鲲鹏昇腾创新大赛集训营Ascend C算子学习笔记

 异构计算架构(CANN)

对标英伟达的CUDA + CuDNN的核心软件层,向上支持多种AI框架,向下服务AI处理器,发挥承上启下的关键作用,是提升昇腾AI处理器计算效率的关键平台。主要包括有各种引擎、编译器、执行器、算子库等。

67f980fd1a704beb84350b946de1a3c9.jpg

 MindSpore AI框架

MindSpore是面向“端-边-云”全场景设计的AI框架,旨在弥合AI算法研究与生产部署之间的鸿沟。在算法研究阶段,为开发者提供动静统一的编程体验以提升算法的开发效率;在生产阶段,自动并行可以极大加快分布式训练的开发和调试效率,同时充分挖掘异构硬件的算力;在部署阶段,基于“端-边-云”统一架构,应对企业级部署和安全可信方面的挑战。

算子基本概念

(1)算子名称(Name)

算子的名称,用于标志网络中的某个算子,同一网络中算子的名称需要保持唯一。如右图所示Conv1,Pool1,Conv2都是此网络中的算子名称,其中Conv1与Conv2算子的类型为Convolution,表示分别做一次卷积运算。(2)(2)算子类型(Type)

网络中每一个算子根据算子类型进行算子实现的匹配,相同类型的算子的实现逻辑相同。在一个网络中同一类型的算子可能存在多个,例如右图中名称为Conv1的算子与Conv2算子的类型都为Convolution。

(3)数据容器(Tensor)

前面介绍了算子的类型与算子的名称。我们再看下网络中的算子,如右图所示,算子在网络中执行时,还需要一个重要的输入:数据,算子执行完后,也会有对应的数据输出。这种承载算子数据的容器定义为:张量(Tensor)。

张量(Tensor)

  • 张量是算子计算数据的容器,包括输入数据与输出数据。
  • 张量描述符(TensorDesc)是对输入数据与输出数据的描述,主要包含如下属性:5d7fc4e417694253a0eb4b5bd2ea6121.png

 形状(Shape)

张量的形状,比如形状(3,4)表示第一维有3个元素,第二维有4个元素,是一个3行4列的矩阵数组。在形状中有多少个数字,就代表这个张量有多少维。形状的第一个元素要看张量最外层的中括号中有几个元素,形状的第二个元素要看张量中从左边开始数第二个中括号中有几个元素,依此类推。1acbdac279304e0dbc5bd59ec7b85ec7.png

 

什么是Ascend C?

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

使用Ascend C开发自定义算子的优势

  • C/C++原语编程,最大化匹配用户的开发习惯
  • 编程模型屏蔽硬件差异,编程范式提高开发效率
  • 多层级API封装,从简单到灵活,兼顾易用与高效
  • 孪生调试,CPU侧模拟NPU侧的行为,可优化在CPU侧调试

SPMD编程模型介绍

Ascend C算子编程是SPMD的编程,将需要处理的数据拆分并行分布在多个计算核心上运行多个AI Core共享相同的指令代码,每个核上的运行实例唯一的区别是block_idx不同block的类似于进程,block_idx就是标识进程唯一性的进程ID,编程中使用函数GetBlockIdx()获取ID

核函数编写及调用

核函数(Kernel Function)是Acend C算子设备侧的入口。Ascend C允许用户使用核函数这种C/C++函数的语法扩展来管理设备侧的运行代码,用户在核函数中实现算子逻辑的编写,例如自定义算子类及其成员函数以实现该算子的所有功能。核函数是主机侧和设备侧连接的桥梁。

Ascend C编程范式

Ascend C采用矢量编程范式,将算子的实现流程分为三个基本任务:CopyIn、Compute和CopyOut。CopyIn负责数据搬入操作,Compute负责矢量计算操作,CopyOut负责数据搬出操作。通过并行计算和流水线式的编程范式,Ascend C可以实现算子的高效运行。此外,Ascend C还提供了多层接口抽象,使开发者可以更方便地进行算子开发。开发者只需关注算子核函数的实现,而底层的指令同步和并行调度由Ascend C框架自动完成。这样,开发者可以更专注于算子的逻辑实现,而无需过多关注底层细节,从而提高开发效率。d825a94edcdf456091483c6e241171b0.webp

 矢量算子开发一般开发流程如下:

6f0f8586edb648b3aae17fab910ed56d.webp

 

 

相关文章:

  • docker k8s
  • CentOS 7 内存占用过大导致 OOM Killer 杀掉了 Java 进程
  • AI是在帮助开发者还是取代他们?
  • 2024.06.30 刷题日记
  • 解决 VM 虚拟机网络连接异常导致的 Finalshell 无法连接及 ifconfig 中 ens33 丢失问题
  • 基于C++实现的EventLoop与事件驱动编程
  • 【Hive中常见的优化手段----数据采集!Join 优化!Hive索引!数据倾斜!mapreduce本地模式!map和reduce数量调整!】
  • 【大模型LLM面试合集】大语言模型基础_llm概念
  • 由监官要求下架docker hub镜像导致无法正常拉取镜像
  • qt QTreeView的简单使用(多级子节点)
  • SpringCloud分布式微服务链路追踪方案:Skywalking
  • 从0开始学习pyspark--pyspark的核心概念[第0节]
  • DFS,BFS最短路,树与图的深度/广度优先遍历,拓扑排序
  • 为什么Vim是程序员最喜欢的文本编辑器之一?
  • 对象被优化以后才是高效的C++编程
  • Android组件 - 收藏集 - 掘金
  • C++类的相互关联
  • miaov-React 最佳入门
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Vue.js 移动端适配之 vw 解决方案
  • 从0实现一个tiny react(三)生命周期
  • 开源SQL-on-Hadoop系统一览
  • 我有几个粽子,和一个故事
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • ionic异常记录
  • 阿里云移动端播放器高级功能介绍
  • 回归生活:清理微信公众号
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • #在 README.md 中生成项目目录结构
  • %@ page import=%的用法
  • (C语言)字符分类函数
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (HAL库版)freeRTOS移植STMF103
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (二)fiber的基本认识
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (全注解开发)学习Spring-MVC的第三天
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)Sql Server 保留几位小数的两种做法
  • (转)用.Net的File控件上传文件的解决方案
  • *Django中的Ajax 纯js的书写样式1
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET处理HTTP请求
  • .NET是什么