昇腾Ascend C算子性能优化
流水优化、搬运优化、内存优化、API使用优化以及Tiling优化
之
流水优化
- AI Core内流水并行
- double buffer将待处理的数据一分为二,提高Vector单元利用效率
- Iterate异步接口,避免AIC/AIV同步依赖
1、AI Core内流水并行
AI Core内部执行单元异步并行地执行接收到的指令。每一个执行单元都可以看成是流水线上的节点,通过流水线并行的方式来提高计算效率。从输入数据到输出数据需要经过3个阶段任务的处理,多个执行单元并行处理,每个执行单元只会专注于一个任务的处理,会处理所有的数据分片。
基于Ascend C编程范式进行代码编写,实际上就是应用这种流水线式的编程范式,把算子核内的处理程序,分成多个流水任务,通过队列(Queue)完成任务间通信和同步,并通过统一的资源管理模块(Pipe)来统一管理内存、事件等资源。
Ascend C流水编程范式将单核算子处理逻辑划分为多个流水任务,CopyIn搬入,Compute计算,CopyOut搬出,基于该编程范式,可快速搭建算子实现的代码框架。
以Vector编程范式为例:
CopyIn负责搬入操作:将输入数据从Global Memory搬运到Local Memory(VECIN用于表达矢量计算搬入数据的存放位置),完成搬运后执行入队列操作;
Compute负责矢量指令计算操作:完成队列出队后,从Local Memory获取数据并计算,计算完成后执行入队操作;
CopyOut负责搬出操作:完成队列出队后,将计算结果从Local Memory(VECOUT用于表达矢量计算搬出数据的存放位置)搬运到GM。
伪代码
TPipe pipe; //创建全局的资源管理
TQue<VecIn, 1