AscendC算子
收藏回复举报
AscendC算子
新人帖
发表于2024-07-03 14:29:42
0 查看

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

       一、Ascend C编程范式

Ascend C编程范式把算子内部的处理程序,分成多个流水任务( stage ),以张量( Tensor)为数据载体,以队列 ( Queue ) 进行任务之间的通信与同步,以内存管理模块( Pipe ) 管理任务间的通信内存。

        1、流水任务

流水任务指的是单核处理程序中主程序调度的并行任务。在核函数内部,可以通过流水任务实现数据的并行处理,进一步提升性能。cke_7477.png

2、任务间通信与同步

不同的流水任务之间存在数据依赖,需要进行数据传递。Ascend C中使用Queue队列完成任务之间的数据通信和同步,提供EnQueDeQue等基础APIQueue队列管理NPU上不同层级的物理内存时,用一种抽象的逻辑位置(QuePosition)来表达各级别的存储,代替了片上物理存储的概念,开发者无需感知硬件架构。

        3、内存管理机制

任务间数据传递使用到的内存统一由内存管理模块Pipe进行管理。Pipe作为片上内存管理者,通过InitBuffer接口对外提供Queue内存初始化功能,开发者可以通过该接口为指定的Queue分配内存。

1、算子分析

分析算子的数学表达式、输入、输出以及计算逻辑的实现,明确需要调用的Ascend C接口。

2、核函数定义

add_custom核函数的实现中实例化kernelAdd算子类,调用Init()数完成内存初始化,调用Process()函数完成核心逻辑。

3、根据矢量编程范式实现算子类

根据前面的知识,算子实现三个流水任务CopyInComputeCopyOut。任务间通过队列VECINVECOUT进行通信和同步,由pipe内存管理对象对任务间交互使用到的内存、临时变量使用到的内存统一进行管理。

我要发帖子