本文分享自华为云社区《CANN黑科技解密|昇腾Ascend C编程言语 — 极简易用的算子开发体验》,作者:昇腾CANN 。

AI运用的大脑是神经网络,而构成神经网络的柱石是一个个算子。为了让开发者的网络在昇腾硬件上高效运转,昇腾异构核算架构CANN(Compute Architecture for Neural Networks)供给了丰厚的高功用算子库,包含神经网络库、线性代数核算库等,高功用算子数量达到1400+。有了高功用算子库的支撑,主流神经网络可轻松在昇腾硬件上高效运转。

体验昇腾Ascend C 编程语言极简易用的算子开发

但随着人工智能的爆发式增长,算法更新层出不穷,固定的高功用算子库可能无法彻底满意开发者的多样化立异需求,为了让开发者提出的立异算法能够在硬件上运转起来,自定义算子开发的才能必不可少。

但算子开发是个复杂的工程,需要考虑很多要素,包含言语学习成本、功用逻辑的完结、硬件指令的适配、以及算子运转精度与功用的达标等等。往往一个经验丰厚的算法专家开发一个高功用的算子都要耗时数周乃至更长的时刻。

体验昇腾Ascend C 编程语言极简易用的算子开发

算子开发总体流程

为提高算子开发功率,下降算子开发成本,昇腾推出了面向算子开发场景的昇腾Ascend C编程言语。昇腾Ascend C编程言语原生支撑C和C++规范规范,最大化匹配用户开发习惯;经过多层接口抽象,屏蔽了底层硬件差异;经过主动并行核算等要害技术,在保证功用的一起大大下降算子开发门槛。别的,昇腾Ascend C供给了孪生调试功用,大大缩短了算子调测时刻。

体验昇腾Ascend C 编程语言极简易用的算子开发

Ascend C编程言语在异构核算架构CANN中的位置

多层级高功用类库接口

工欲善其事,必先利其器。为简化开发逻辑,昇腾Ascend C支撑结构化核函数编程,供给了面向不同场景的高功用类库接口。开发者仅需经过类库接口的拼装调用,即可轻松完结高功用算子。

体验昇腾Ascend C 编程语言极简易用的算子开发

Ascend C供给的类库接口

AI运用领域广泛,开发者的布景与需求也各不相同。为满意不同层级开发者的诉求,昇腾Ascend C针对核算接口和数据搬移接口,进行了分层分级,让开发者能够根据自身需求选择适宜的接口。

针对核算类接口,当前Ascend C支撑三个层级,其间级数越低,自由度越高,更易于表达复杂场景所需功用;级数越高,接口的封装度越高,更易于表达常用语义,运用起来也更简单。

体验昇腾Ascend C 编程语言极简易用的算子开发

核算接口分层分级与示例

针对搬移类接口,Ascend C将不同类型物理内存间的数据搬移抽象为一个统一的数据转移接口,经过参数控制不同的转移等级,然后满意不同数据转移场景的需求。

体验昇腾Ascend C 编程语言极简易用的算子开发

数据转移接口分层分级与示例

别的,多层级的类库接口封装,能够更好地屏蔽不同类型硬件间的差异,轻松完结算子代码对不同硬件的兼容。

主动并行核算

多层级的类库接口能够让开发者轻松完结算子的算法逻辑,达到预期功用。但一个好的算子,核算功率也是必须考虑的重要目标。众所周知,将使命并行处理是提高核算功率的要害手段,但AI处理器的内存层次结构比较复杂、数据通路多,数据之间的依靠关系复杂,这种场景下,并行核算之间的流水怎么排布,各使命间的数据同步怎么完结,往往是比较困难的。

为了方便开发者完结高效的并行核算,昇腾Ascend C采用SPMD(Single-Program Multiple-Data)并行模式,开发者仅需重视一个核算核心上的算子程序完结,程序调用时,可主动发动N个运转实例(咱们称之为Block),每个实例都可布置到不同的核算核心上履行。由此,大大简化了开发者在多个核算核心上的并行编程逻辑。

体验昇腾Ascend C 编程语言极简易用的算子开发

单程序多数据SPMD并行核算

在算子逻辑完结上,Ascend C基于流水线并行的编程范式,将算子核心逻辑划分为“搬入、核算、搬出”,开发者只需聚集完结“搬入、核算、搬出”内容,程序运转时,系统会主动将核内数据进行分片,每一片数据都专心完结单一功用,完结核算功用最大化。

体验昇腾Ascend C 编程语言极简易用的算子开发

核内多片数据流水线并行调度

孪生调试

昇腾Ascend C供给的多层级类库接口以及主动并行核算功用,给开发者供给了轻松高效的编码体验。但在上一代算子开发的整个流程中,代码编写的时刻往往仅占不到30%,剩余70%多的时刻都在进行功用与功用调试,好的调试才能对提高端到端开发功率的重要性显而易见。

体验昇腾Ascend C 编程语言极简易用的算子开发

开发时刻占比示例

那为什么算子调试如此耗时呢?究其主要原因,一方面是因为NPU环境下自身调试困难;另一方面是因为编程过程隐藏了并行细节,导致同步死锁、地址越界、数据溢出等问题难定位。

为提高算子调试功率,Ascend C供给了孪生调试才能,开发者既能够在CPU域进行调试调优,又能够在NPU侧进行调优验证,经过CPU域与NPU域相结合的方式,下降调试难度,提高调试功率。

在CPU域,开发者可经过业界规范C++东西GCC编译器进行编译,并经过GDB通用调试东西进行单步调试,精准验证程序履行流程是否契合预期。别的,昇腾Ascend C还供给了主动Bug剖析东西,方便开发者快速进行问题定位;在NPU域,昇腾Ascend C供给了仿真调试才能与上板调试才能,开发者能够经过仿真调试的Profiling流水图、指令日志以及数据日志,精准进行功用调优,也能够经过上板调试进行真实行为的验证。孪生调试的才能,在提高算子调试功率的一起又可保证精度与功用的达标。

体验昇腾Ascend C 编程语言极简易用的算子开发

Ascend C孪生调试

体验昇腾Ascend C 编程语言极简易用的算子开发

人工智能蓬勃发展,算法立异层出不穷。昇腾供给的Ascend C编程言语,经过易上手、高功用、易调测的优势,为开发者的立异算法更轻松高效地在昇腾平台运转奠定了柱石,让基于昇腾平台的AI立异愈加简单。

点击如下链接,快速体验Ascend C算子开发

Ascend C算子开发快速体验

点击重视,第一时刻了解华为云新鲜技术~

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。