Ascend 算子开发学习笔记

达芬奇架构

主要部分

  • 计算单元:三种计算单元(矩阵,向量,标量)
  • 存储系统:存储单元与数据通路构成了存储系统
  • 控制单元:提供指令控制

AI Core

昇腾ai处理器计算核心,采用达芬奇架构。一个ai处理器包含多个ai core,ai core包含计算单元存储单元控制单元

存储单元为各个计算单元提供转置过并符合要求的数据,计算单元返回运算的结果给存储单元,控制单元为计算单元和存储单元提供指令控制,三者相互协调合作完成计算任务。

算子

基本概念

算子名称:标识某个算子,同一网络中算子名称需要保持唯一

算子类型:网络中每一个算子根据算子类型进行算子实现的匹配,相同类型的算子的实现逻辑相同。

张量(Tensor):名称,形状,类型

形状(Shape):N张彩色照片,三通道,(N, C, H, W)是它的shape

轴(axis):axis=0表示是张量中的第一维,axis=1表示是张量中的第二维,axis=-1

核函数

使用__global__与__aicore__类型限定符来标识一个核函数。

核函数使用**内核调用符<<<…>>>**这种语法形式,来规定核函数的执行配置:

  • blockDim,规定了核函数将会在几个核上执行,每个执行该核函数的核会被分配一个逻辑ID,表现为内置变量block_idx,编号从0开始,可为不同的逻辑核定义不同的行为,可以在算子实现中使用
  • I2ctrl,保留参数,暂时设置为固定值nullptr
  • stream,类型为aclrtStream , stream是一个任务队列,应用程序通过stream来管理任务的并行

编程模型

SPMD编程模型,将需要处理的数据拆分并分布在多个计算核心上运行

多个AI Core共享相同的指令代码,每个核上的运行实例的唯一区别是block_idx不同

block类似于进程,block_idx就是表示进程唯一性的进程ID

Ascend C编程

语法

采用标准cpp语法和一组类库api编程,例如整个tensor的计算:dst = src1 + src2;tensor前n个数据计算Add(dst, src1, src2, n)(今天只用这种)

编程范式

流水的三大基本任务:

  1. CopyIn任务:将Global Memory上的输入Tensor xGm和yGm搬运至Local Memory,分别存储在xLocal, yLocal
  2. Compute任务:对xLocal, yLocal执行加法操作,计算结果存储在zLocal中
  3. CopyOut任务:将输出数据从zLocal搬运至Global Memory上的输出Tensor zGm中
    在这里插入图片描述

矢量编程过程中三个任务是乱序的,但是Deque是阻塞的,保障顺序。

API

单向量操作:单目指令

双向量操作:双目指令

向量与标量操作:标量双目指令

举例,将z = sinh(x)通过相关指令实现

        half scaler=0.5;
        // x = e^x        
        Exp(xLocal, xLocal, TILE_LENGTH);
        // y = e^-x
        Reciprocal(yLocal, xLocal, TILE_LENGTH);
        // z = e^x - e^-x
        Sub(zLocal, xLocal,yLocal, TILE_LENGTH);
        // z = (e^x - e^-x) * 0.5 the same as sinh(x)
        // sinh(x) = (e^x - e^-x) / 2
        Muls(zLocal,zLocal,scaler,TILE_LENGTH);    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值