体验昇腾Ascend C 编程语言极简易用的算子开发
摘要:昇腾Ascend C编程语言,让基于昇腾AI的算法创新更加简单。
本文分享自华为云社区《CANN黑科技解密|昇腾Ascend C编程语言 — 极简易用的算子开发体验》,作者:昇腾CANN 。
AI应用的大脑是神经网络,而构成神经网络的基石是一个个算子。为了让开发者的网络在昇腾硬件上高效运行,昇腾异构计算架构CANN(Compute Architecture for Neural Networks)提供了丰富的高性能算子库,包括神经网络库、线性代数计算库等,高性能算子数量达到1400+。有了高性能算子库的支撑,主流神经网络可轻松在昇腾硬件上高效运行。

但随着人工智能的爆发式增长,算法更新层出不穷,固定的高性能算子库可能无法完全满足开发者的多样化创新需求,为了让开发者提出的创新算法能够在硬件上运行起来,自定义算子开发的能力必不可少。
但算子开发是个复杂的工程,需要考虑众多因素,包括语言学习成本、功能逻辑的实现、硬件指令的适配、以及算子运行精度与性能的达标等等。往往一个经验丰富的算法专家开发一个高性能的算子都要耗时数周甚至更长的时间。

算子开发总体流程
为提升算子开发效率,降低算子开发成本,昇腾推出了面向算子开发场景的昇腾Ascend C编程语言。昇腾Ascend C编程语言原生支持C和C++标准规范,最大化匹配用户开发习惯;通过多层接口抽象,屏蔽了底层硬件差异;通过自动并行计算等关键技术,在保证性能的同时大大降低算子开发门槛。另外,昇腾Ascend C提供了孪生调试功能,大大缩短了算子调测时间。

Ascend C编程语言在异构计算架构CANN中的位置
多层级高性能类库接口
工欲善其事,必先利其器。为简化开发逻辑,昇腾Ascend C支持结构化核函数编程,提供了面向不同场景的高性能类库接口。开发者仅需通过类库接口的组装调用,即可轻松实现高性能算子。

Ascend C提供的类库接口
AI应用领域广泛,开发者的背景与需求也各不相同。为满足不同层级开发者的诉求,昇腾Ascend C针对计算接口和数据搬移接口,进行了分层分级,让开发者可以根据自身需求选择合适的接口。
针对计算类接口,当前Ascend C支持三个层级,其中级数越低,自由度越高,更易于表达复杂场景所需功能;级数越高,接口的封装度越高,更易于表达常用语义,使用起来也更简单。

计算接口分层分级与示例
针对搬移类接口,Ascend C将不同类型物理内存间的数据搬移抽象为一个统一的数据搬运接口,通过参数控制不同的搬运级别,从而满足不同数据搬运场景的需求。

数据搬运接口分层分级与示例
另外,多层级的类库接口封装,可以更好地屏蔽不同型号硬件间的差异,轻松实现算子代码对不同硬件的兼容。
自动并行计算
多层级的类库接口可以让开发者轻松实现算子的算法逻辑,达成预期功能。但一个好的算子,计算效率也是必须考虑的重要指标。众所周知,将任务并行处理是提高计算效率的关键手段,但AI处理器的内存层次结构比较复杂、数据通路多,数据之间的依赖关系复杂,这种场景下,并行计算之间的流水如何排布,各任务间的数据同步如何实现,往往是比较困难的。
为了方便开发者实现高效的并行计算,昇腾Ascend C采用SPMD(Single-Program Multiple-Data)并行模式,开发者仅需关注一个计算核心上的算子程序实现,程序调用时,可自动启动N个运行实例(我们称之为Block),每个实例都可部署到不同的计算核心上执行。由此,大大简化了开发者在多个计算核心上的并行编程逻辑。

单程序多数据SPMD并行计算
在算子逻辑实现上,Ascend C基于流水线并行的编程范式,将算子核心逻辑划分为“搬入、计算、搬出”,开发者只需聚焦实现“搬入、计算、搬出”内容,程序运行时,系统会自动将核内数据进行分片,每一片数据都专注完成单一功能,实现计算性能最大化。

核内多片数据流水线并行调度
孪生调试
昇腾Ascend C提供的多层级类库接口以及自动并行计算功能,给开发者提供了轻松高效的编码体验。但在上一代算子开发的整个流程中,代码编写的时间往往仅占不到30%,剩下70%多的时间都在进行功能与性能调试,好的调试能力对提升端到端开发效率的重要性不言而喻。

开发时间占比示例
那为什么算子调试如此耗时呢?究其主要原因,一方面是由于NPU环境下本身调试困难;另一方面是因为编程过程隐藏了并行细节,导致同步死锁、地址越界、数据溢出等问题难定位。
为提升算子调试效率,Ascend C提供了孪生调试能力,开发者既可以在CPU域进行调试调优,又可以在NPU侧进行调优验证,通过CPU域与NPU域相结合的方式,降低调试难度,提升调试效率。
在CPU域,开发者可通过业界标准C++工具GCC编译器进行编译,并通过GDB通用调试工具进行单步调试,精准验证程序执行流程是否符合预期。另外,昇腾Ascend C还提供了主动Bug分析工具,方便开发者快速进行问题定位;在NPU域,昇腾Ascend C提供了仿真调试能力与上板调试能力,开发者可以通过仿真调试的Profiling流水图、指令日志以及数据日志,精准进行性能调优,也可以通过上板调试进行真实行为的验证。孪生调试的能力,在提升算子调试效率的同时又可保证精度与性能的达标。

Ascend C孪生调试

人工智能蓬勃发展,算法创新层出不穷。昇腾提供的Ascend C编程语言,通过易上手、高性能、易调测的优势,为开发者的创新算法更轻松高效地在昇腾平台运行奠定了基石,让基于昇腾平台的AI创新更加简单。
点击如下链接,快速体验Ascend C算子开发
体验昇腾Ascend C 编程语言极简易用的算子开发的更多相关文章
- Git可视化极简易教程 — Git GUI使用方法
Git可视化极简易教程 — Git GUI使用方法 学习了:http://www.runoob.com/w3cnote/git-gui-window.html
- 逻辑式编程语言极简实现(使用C#) - 2. 一道逻辑题:谁是凶手
本系列前面的文章: 逻辑式编程语言极简实现(使用C#) - 1. 逻辑式编程语言介绍 这是一道Prolog经典的练习题,中文翻译版来自阮一峰的文章<Prolog 语言入门教程>. 问题 B ...
- 逻辑式编程语言极简实现(使用C#) - 3. 运行原理
本系列前面的文章: 逻辑式编程语言极简实现(使用C#) - 1. 逻辑式编程语言介绍 逻辑式编程语言极简实现(使用C#) - 2. 一道逻辑题:谁是凶手 第二天,好为人师的老明继续开讲他的私人课堂. ...
- 逻辑式编程语言极简实现(使用C#) - 4. 代码实现(完结)
本文是本系列的完结篇.本系列前面的文章: 逻辑式编程语言极简实现(使用C#) - 1. 逻辑式编程语言介绍 逻辑式编程语言极简实现(使用C#) - 2. 一道逻辑题:谁是凶手 逻辑式编程语言极简实现( ...
- EditPlus+MinGW搭建简易的C/C++开发环境
EditPlus+MinGW搭建简易的C/C++开发环境 有时候想用C编点小程序,但是每次都要启动那难用又难看的VC实在是不情愿,而且老是会生成很多没用的中间文件,很讨厌,后来看到网上有很多人用Edi ...
- [麻雀虽小]记 简易Markdown阅读器 开发全过程
[麻雀虽小]记 简易Markdown阅读器 开发全过程 [TOC] 序言 项目地址: https://github.com/didikee/MDReader 测试文章地址: 2017 Android ...
- Kotlin 编程语言成为其 Android 应用程序开发人员的首选语言
今年 5 月,谷歌在 I/O 大会上宣布,Kotlin 编程语言成为其 Android 应用程序开发人员的首选语言. Kotlin 是一种面向现代多平台应用程序的编程语言,成为谷歌开发 Android ...
- 第十八篇:简易版web服务器开发
在上篇有实现了一个静态的web服务器,可以接收web浏览器的请求,随后对请求消息进行解析,获取客户想要文件的文件名,随后根据文件名返回响应消息:那么这篇我们对该web服务器进行改善,通过多任务.非阻塞 ...
- Swift初体验之HelloWord+苹果Swift编程语言新手教程【中文版】
AppDelegate.swift : <span style="font-size:24px;"><strong>// // AppDelegate.sw ...
- 逻辑式编程语言极简实现(使用C#) - 1. 逻辑式编程语言介绍
相信很多朋友对于逻辑式编程语言,都有一种最熟悉的陌生人的感觉.一方面,平时在书籍.在资讯网站,偶尔能看到一些吹嘘逻辑式编程的话语.但另一方面,也没见过周围有人真正用到它(除了SQL). 遥记当时看&l ...
随机推荐
- dark room - 2020 年苹果设计奖得主,一个足够强大的照片视频编辑器
2020年苹果设计奖得主 2015年App Store最佳应用 Darkroom 是一个高级照片和视频编辑器.它对业余摄影师来说很容易操作,但对专业摄影师来说足够强大. 下载 ➤ Darkroom 下 ...
- 动手造轮子自己实现人工智能神经网络(ANN),解决鸢尾花分类问题Golang1.18实现
人工智能神经网络( Artificial Neural Network,又称为ANN)是一种由人工神经元组成的网络结构,神经网络结构是所有机器学习的基本结构,换句话说,无论是深度学习还是强化学习都是基 ...
- 二进制安装Kubernetes(k8s) v1.23.4
1.环境 网段 物理主机:192.168.1.0/24 service:10.96.0.0/12 pod:172.16.0.0/12 如果有条件建议k8s集群与etcd集群分开安装 1.1.k8s基础 ...
- Java设计模式 —— 面向对象设计原则
1 设计模式概述 1.1 设计模式的定义与分类 设计模式的定义 Design patterns are descriptions of communicating objects and classe ...
- Restless API 与 Restful API
Restful API: 1.CURD(增删改查) 由请求方式决定 2.请求方式有:get/post/delete/put 3.同一个路径可以进行多个操作 Restless API 1.CURD(增 ...
- RDIFramework.NET Web版报表管理-助力企业高效智能图表
功能描述 在RDIFramework.NET Web版本中全新的报表管理功能模块,非常实用的功能,重量级推荐.主要用于对日常常用的报表做定制展示.可以自动发布到模块(就可授权给指定资源访问),在报表定 ...
- C++核心知识回顾(自定义数据类型)
复习C++ 类 自定义数据类型最灵活的方式就是使用C++的类结构 现在定义一个货币类型Currency: enum signType{PLUS,MINUS}; class Currency { pub ...
- 1778D Flexible String Revisit
1778D Flexible String Revisit 目录 1778D Flexible String Revisit 题目大意: 做法: dp 注意 code 题目大意: 给你两个长度均为\( ...
- 从原理聊JVM(二):从串行收集器到分区收集开创者G1
作者:京东科技 康志兴 1 前言 随着Java的进化过程,涌现出各种不同的垃圾回收器,从串行执行到并行执行,从高吞吐到低延迟,终极目标就是让开发人员专注于程序的代码书写而无需关注内存管理. JDK早期 ...
- xcode历史版本下载
一.背景 较早之前做过一个项目,当时使用swift 3.x开发. 项目结束后就没再有新需求与更新. 但最近呢需要对项目的某些功能进行调整,项目又重新被拾了起来. 我们知道现在的swift 版本已经到了 ...