首页 > 其他分享 >【2023 · CANN训练营第一季】——Ascend C算子背后的魔法

【2023 · CANN训练营第一季】——Ascend C算子背后的魔法

时间:2023-05-29 22:01:25浏览次数:46  
标签:CANN Ascend AI flag 指令 计算 2023 数据 单元

前言:TIK C++,2023年CANN的一个神奇魔法,得益于TIK C++算子的孪生调试技术,我们可以了解到更多的技术细节,本文试图对隐藏在多核并行,流水计算、dobule buffer背后的CANN Ascend C算子魔法进行摸索和理解,是什么样的技术让用户编写的简单代码可以先实现上述神奇的功能。本文没有请专业人士审查,分析的结果未必正确,只是个人的一种理解,如有错漏,欢迎大家指正!!!

一、硬件基础——向量单元,矩阵单元,数据搬运DMA并行是基础 

        昇腾AI处理器(NPU),可以实现大规模神经网络的计算加速,如下图所示,昇腾AI处理器的计算核心是1个或若干个AI Core,负责执行矩阵、向量、标量计算。TIC C++算子就是运行在AiCore上的。

【2023 · CANN训练营第一季】——Ascend C算子背后的魔法_CANN

一)、AICore的架构

        如下图所示,单个AICore内,包括:标量计算单元、向量计算单元、矩阵计算单元、本地数据存储单元Local Memory,以及负责数据搬运的DMA单元。

        标量计算单元任务是进行计算流程控制和地址计算,向量计算单元负责执行向量运算,矩阵计算单元负责执行矩阵运算;运算单元计算的输入数据,是DMA从Global Mem上搬运到Local Mem上;计算结果也存储在Local Mem上,并由DMA负责将计算结果搬运到Global Mem上。

【2023 · CANN训练营第一季】——Ascend C算子背后的魔法_Ascend C算子_02

二)AICore计算能力

        AICore的三个核心计算单元:

        1、标量计算单元:执行标量计算

        2、标量计算单元:1cycle可以执行128个FP16的加法;

        3、向量计算单元:1cycle可以完成两个16*16 FP16的矩阵乘。

【2023 · CANN训练营第一季】——Ascend C算子背后的魔法_Ascend C算子_03

二、技术分析

        课上,老师讲述的一个ADD算子的实现。其定义如下:

【2023 · CANN训练营第一季】——Ascend C算子背后的魔法_CANN_04

        数据整体长度TOTAL_LENGTH为8 * 2048,定义逻辑核熟练USE_CORE_NUM=8(即8个逻辑核),每个核上处理的数据大小BLOCK_LENGTH为2048。

【2023 · CANN训练营第一季】——Ascend C算子背后的魔法_CANN_05

        从硬件部分知识,我们知道,单核的向量计算单元一个指令周期能处理128个FP16,所以还需要对单核数据进行切分,切分成16块,每块128个FP16。

【2023 · CANN训练营第一季】——Ascend C算子背后的魔法_CANN_06

        然后通过TPIPE流水线范式,简单的代码就可以让CopyIn、Compute、CopyOut这三个阶段实现流水线工作。

【2023 · CANN训练营第一季】——Ascend C算子背后的魔法_Ascend C算子_07

        还可以启动double buffer,进行优化,提供流水线的执行效率。

        开发者只需要编写简单的代码,就可以的这样高效、并行的能力。背后的黑科技令人神往,下面将结合代码和CPU侧调试获取的信息,做技术分析。

一)、多核并行:

1、开发者需要编写的代码:

        在核函数定义里,通过block_idx,计算出输入、输出数据在Global Memory上的偏移地址。

【2023 · CANN训练营第一季】——Ascend C算子背后的魔法_CANN_08

2、背后的黑科技:

        2023年昇腾开发者峰会上,CANN首席架构师闫老师说:“芯片内部有多个AI核,AI核是同构的。写一个AI核的计算程序,实际部署时,会启动多个AI核实例,每个实例称之为一个block,所有block运行的程序代码端是完全一样的,入参也是完全一样的。唯一的区别是block_id不同,block_id是个内嵌变量,不是入参。block_id对应逻辑核的数量,按0,1,2...的顺序去排,因此实现了对数据的切分。”

       本例在CPU调试模式下,会生成8个CCE文件,代表1个逻辑核的实际指令,我们可以看到2048个fp16,对应4096字节(十六进制0x1000),可以看出相邻2个CCE文件的偏移地址正好是0x1000(4096字节)。

【2023 · CANN训练营第一季】——Ascend C算子背后的魔法_Ascend C算子_09

【2023 · CANN训练营第一季】——Ascend C算子背后的魔法_CANN_10

二)、单核流水线:

1、开发者需要编写的代码:

        仅一个循环,加3行代码实现了流水线。

【2023 · CANN训练营第一季】——Ascend C算子背后的魔法_Ascend C算子_11

2、背后的魔法:

        昇腾AI处理器使用set_flag/wait_flag两条指令组成的指令对,保证队列内部以及队列之间按照逻辑关系执行。set_flag/wait_flag为两条指令,在set_flag/wait_flag的指令中,可以指定一对指令队列的关系,表示两个队列之间完成一组“锁”机制,其作用方式为:

set_flag:当前序指令的所有读写操作都完成之后,当前指令开始执行,并将硬件中的对应标志位设置为1。

wait_flag:当执行到该指令时,如果发现对应标志位为0,该队列的后续指令将一直被阻塞;如果发现对应标志位为1,则将对应标志位设置为0,同时后续指令开始执行。

【2023 · CANN训练营第一季】——Ascend C算子背后的魔法_Ascend C算子_12

       COPYIN单元和COMPUTE单元,通过set_flag/和wait_flag指令对,如上图的绿色箭头,确保COPYIN单元数据拷贝完成后,再由COMPUTE单元执行运算。

        COPYOUT单元和COMPUTE单元,通过set_flag/和wait_flag指令对,如上图的绿色箭头,确保COMPUTE单元运算完成后,再由COPYOUT单元搬运计算结果。

       这个机制,实现了流水线操作,前序操作完成后,自动执行有关联的后续操作。

       不同分块数据(i)之间也是通过set_flag/和wait_flag指令对,实现流水操作的。如下图所示,右侧为不使用double buffer的情况,我们看到在做完第i次ADD后,通过set_flag操作,可以触发第i+1次的COPYIN操作。完成第i次ADD操作后,第i次的输入数已经不再需要了,可以执行第i+1次的COPYIN操作,把数据拷贝入Local Memory。下图,左侧部分是有double bu

ffer的情况,基本原理类似,double buffer背后的技术实现,在下一章节描述。

【2023 · CANN训练营第一季】——Ascend C算子背后的魔法_Ascend C算子_13

三)、Double Buffer

 1、开发者需要编写的代码:

        开启dobule buffer,只需要引入BUFFER_NUM变量,并修改2处代码即可,见下图。

【2023 · CANN训练营第一季】——Ascend C算子背后的魔法_Ascend C算子_14

2、背后的魔法:

       “话越少,事越大”,double buffer这个概念困惑了我很久,直到在2023年昇腾开发者峰会上看到下面的两张截图。这两张图很好的讲述了double buffer的作用,先上图,后面再分析。

【2023 · CANN训练营第一季】——Ascend C算子背后的魔法_CANN_15

截图于2023年昇腾AI开发者峰会算子演示

【2023 · CANN训练营第一季】——Ascend C算子背后的魔法_Ascend C算子_16

截图于2023年昇腾AI开发者峰会算子演示

        我们知道,数据先要从global memory搬运到local memory里(buff1或buff2)里,然后计算单元会对数据进行计算,计算结果存到local memory,然后再把结果搬出到global memory里。我们需要注意到,当计算单元完成计算后,输入数据buff的数据已经没有用了,此时搬运单元会将下一个数据搬入buff,这是流水线的原理,不是double buffer的魔法。这个数据搬入,然后计算的过程,我在第2副图的用蓝色的线进行表示。

        从上面的分析我们知道,搬运单元需要等待计算完成后,才能搬入下一组数据。而Double Buffer要优化的是数据搬入单元在等待当前数据计算完成的时间。做法就是在开辟一个存储单元buffer2,当运算单元计算当前buffer1数据时,往buffer2里搬运数据,等计算单元完成buffer1数据计算时,等buffer2数据搬运完成后,开始计算buffer2的数据,此时由于buffer1的数据已经完成计算,所以搬运单元又可以立即往buffer1中搬运新的数据。

标签:CANN,Ascend,AI,flag,指令,计算,2023,数据,单元
From: https://blog.51cto.com/u_15485447/6374053

相关文章

  • 2023年一级建造师考试教材最新版电子教程
    2023年一级建造师考试教材已正式发布,教材相对于去年有不小的改动,一级建造师考试教材频道为您整理2023年一级建造师教材汇总,希望能够帮助到大家!包含:2023国家一级建造师【公路实务】电子版教材PDF2023国家一级建造师【工程经济】电子版教材PDF2023国家一级建造师【水利实务】电子版教......
  • 基于QT的空闲教室预约系统[2023-05-29]
    基于QT的空闲教室预约系统[2023-05-29][课程设计选题十]空闲教室预约系统课程设计内容利用QtCreater等工具和Linux环境下时间日期API实现一个基于图形界面的空闲教室预约系统,自行构建界面,可以实现选择日期、教学楼、教室座位数,查询相应空闲教室情况,录用申请信息,教室管理员......
  • 2023ciscn-misc-国粹复现
    说明:此题给出的两个图片,a.png及k.png是分别表示的x坐标和y坐标。然后再用此坐标对题目进行画图,从而得出flag但是由于本人的代码技术有限只能借鉴大佬们的代码然后对其进行分析学习。importnumpyasnpfromPILimportImage classtest():   def__init__(self):......
  • 2023盘古石决赛 物联网 Robot
    其实是一道非常简单的IoT分析题,甚至没有分析的成分,但是比赛过程中出的意外太多了,思路偏了,导致没能出题,而赛后复盘一下就明白了,完全是个简单题,所以写个博客警醒一下自己。个人感觉这道题完全算不上物联网的题,靠搜就可以做出来,只是当时做出来第一道题之后,以为要靠解包才能做,加上st......
  • 20230529 模拟赛订正
    A.xorontree在一棵\(n\)个点的树上,第\(i\)个点初始点权\(w_i\),有\(q\)次操作:0uv:\(v\tow_u\)1x:查询\(w_x\operatorname{xor}w_y\)的最大值,其中\(y\)是\(x\)的祖先(包括\(x\))\(n,q\le10^5\),TL=2s,ML=128MB.在考场上先是绞尽脑汁想到一个时间复杂度......
  • C/C++家谱管理系统[2023-05-29]
    C/C++家谱管理系统[2023-05-29]题目8:家谱管理系统(1~3人)[问题描述]实现具有下列功能的家谱管理系统1).输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。2).......
  • AI2023更新了,最新illustrator 2023新功能
    AI2023更新了,最新illustrator2023新功能有哪些呢?体验从Web和移动图形到徽标、图标、插图、包装设计和广告牌的一切。享受Illustrator的创作自由。Illustrator2023是一款矢量设计应用程序,可让您创建用于大幅面打印(例如广告牌)的数字图形或图像,无论在何处使用,它们看起来都清晰......
  • 2023创建谷歌账号显示此号码无法用于验证_国内手机无法注册谷歌Gmail账号的解决办法
    为什么经常出现国内手机号码无法验证注册谷歌账号的问题呢?来回注册每次都显示网络正在核验中,请重试,返回上一步注册谷歌账号,还是显示此电话号码无法用于验证。注册谷歌账号手机号验证成功个人认为最主要的原因有两点:注册IP和手机所在国家不一致,导致国内手机无法用于谷歌账号注册的......
  • 艾媒金榜|2023年中国信创数据库企业TOP15
    数据库是一种用于存储和管理拥有固定格式和结构数据的仓库型数据管理系统。数据库处于IT架构的核心位置,是连接上层应用和底层基础资源的重要枢纽,向上是各种应用的支撑引擎,向下调动计算、网络、存储等基础资源。在信息化时代,数据库已经逐渐应用于各行各业。本次上榜的企业分别为:人......
  • C语言课程设计题目[2023-05-29]
    C语言课程设计题目[2023-05-29]C语言课程设计题目一、设计要求与设计报告设计要求1.任意选定以下一个题目完成2.模块化程序设计3.锯齿型程序书写格式4.必须上机调试通过设计报告格式1.设计目的2.总体设计(程序设计组成框图、流程图)3.详细设计(模块功能说明(如函数功能、入......