Ascend C算子性能优化实用技巧01——流水优化

Ascend C是CANN针对算子开发场景推出的编程语言,原生支持C和C++标准规范,兼具开发效率和运行性能。使用Ascend C,开发者可以基于昇腾AI硬件,高效的实现自定义的创新算法。


目前已经有越来越多的开发者使用Ascend C,我们将通过几期“Ascend C算子性能优化”专题分享,围绕开发者最为关心的算子性能优化环节,介绍Ascend C算子常用的优化技巧,帮助开发者自主构建出更优性能的算子。专题内容将围绕流水优化、搬运优化、内存优化、API使用优化以及Tiling优化等优化技巧,从方案讲解、优化案例、性能对比等多角度展开介绍。下面进入第一期内容:Ascend C流水优化,您将了解到以下流水优化技巧:

  • 基于Ascend C编程范式快速高效实现AI Core内流水并行
  • 使能double buffer将待处理的数据一分为二,提高Vector单元利用效率
  • 使能Iterate异步接口,避免AIC/AIV同步依赖

基于Ascend C编程范式实现AI Core内流水并行

AI Core内部的执行单元异步并行地执行接收到的指令。每一个执行单元都可以看成是流水线上的节点,通过流水线并行的方式来提高计算效率。如下图所示,从输入数据到输出数据需要经过3个阶段任务的处理(T1、T2、T3),多个执行单元并行处理,每个执行单元只会专注于一个任务的处理,会处理所有的数据分片。

流水线并行示意图

这里的流水线并行和工业生产中的流水线是类似的,执行单元1完成对某个数据分片的处理后,将其加入到通信队列,执行单元2空闲时就会从队列中取出数据继续处理;可以类比为生产流水线中的工人只完成某一项固定工序,完成后就交由下一项工序负责人继续处理。


基于Ascend C编程范式进行代码编写,实际上就是应用这种流水线式的编程范式,把算子核内的处理程序,分成多个流水任务,通过队列(Queue)完成任务间通信和同步,并通过统一的资源管理模块(Pipe)来统一管理内存、事件等资源。


Ascend C流水编程范式将单核算子处理逻辑划分为多个流水任务,CopyIn搬入,Compute计算,CopyOut搬出,基于该编程范式,可快速搭建算子实现的代码框架。以Vector编程范式为例:

  • CopyIn负责搬入操作:将输入数据从Global Memory搬运到Local Memory(VECIN用于表达矢量计算搬入数据的存放位置),完成搬运后执行入队列操作;
  • Compute负责矢量指令计算操作:完成队列出队后,从Local Memory获取数据并计算,计算完成后执行入队操作;
  • CopyOut负责搬出操作:完成队列出队后,将计算结果从Local Memory(VECOUT用于表达矢量计算搬出数据的存放位置)搬运到GM。


从编程的角度来讲,具体流程如下所示:

Vector编

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值