基础API列表
标量计算
接口名 |
功能描述 |
---|---|
获取一个uint64_t类型数字的二进制中0或者1的个数。 |
|
计算一个uint64_t类型数字前导0的个数(二进制从最高位到第一个1一共有多少个0)。 |
|
将一个scalar的类型转换为指定的类型。 |
|
计算一个uint64_t类型数字的二进制中,从最高数值位开始与符号位相同的连续比特位的个数。 |
|
获取一个uint64_t类型数字的二进制中第一个0或1出现的位置。 |
|
float类型标量数据转换成bfloat16_t类型标量数据。 |
|
bfloat16_t类型标量数据转换成float类型标量数据。 |
矢量计算
分类 |
接口名 |
功能描述 |
---|---|---|
单目指令 |
按元素取自然指数。 |
|
按元素取自然对数。 |
||
按元素取绝对值。 |
||
按元素取倒数。 |
||
按元素做开方。 |
||
按元素做开方后取倒数。 |
||
按元素做按位取反。 |
||
按元素做线性整流Relu。 |
||
双目指令 |
按元素求和。 |
|
按元素求差。 |
||
按元素求积。 |
||
按元素求商。 |
||
按元素求最大值。 |
||
按元素求最小值。 |
||
针对每对元素执行按位与运算。 |
||
针对每对元素执行按位或运算。 |
||
按元素求和,结果和0对比取较大值。 |
||
按元素求和,结果和0对比取较大值,并根据源操作数和目的操作数Tensor的数据类型进行精度转换。 |
||
依次计算按元素求和、结果进行deq量化后再进行relu计算(结果和0对比取较大值)。 |
||
按元素求差,结果和0对比取较大值。 |
||
按元素求差,结果和0对比取较大值,并根据源操作数和目的操作数Tensor的数据类型进行精度转换。 |
||
按元素将src0Local和src1Local相乘并和dstLocal相加,将最终结果存放进dstLocal中。 |
||
按元素将src0Local和dstLocal相乘并加上src1Local,最终结果存放入dstLocal。 |
||
按元素将src0Local和dstLocal相乘并再加上src1Local,将结果和0作比较,取较大值,最终结果存放进dstLocal中。 |
||
标量双目指令 |
矢量内每个元素与标量求和。 |
|
矢量内每个元素与标量求积。 |
||
源操作数矢量内每个元素与标量相比,如果比标量大,则取源操作数值,比标量的值小,则取标量值。 |
||
源操作数矢量内每个元素与标量相比,如果比标量大,则取标量值,比标量的值小,则取源操作数。 |
||
源操作数内每个元素做逻辑左移,逻辑左移的位数由输入参数scalar决定。 |
||
源操作数内每个元素做右移,右移的位数由输入参数scalar决定。 |
||
按元素做带泄露线性整流Leaky ReLU。 |
||
标量三目指令 |
源操作数(srcLocal)中每个元素与标量求积后和目的操作数(dstLocal)中的对应元素相加。 |
|
比较指令 |
逐元素比较两个tensor大小,如果比较后的结果为真,则输出结果的对应比特位为1,否则为0。 |
|
逐元素比较两个tensor大小,如果比较后的结果为真,则输出结果的对应比特位为1,否则为0。Compare接口需要mask参数时,可以使用此接口。计算结果存放入寄存器中。 |
||
逐元素比较一个tensor中的元素和另一个Scalar的大小,如果比较后的结果为真,则输出结果的对应比特位为1,否则为0。 |
||
选择指令 |
给定两个源操作数src0和src1,根据selMask(用于选择的Mask掩码)的比特位值选取元素,得到目的操作数dst。选择的规则为:当selMask的比特位是1时,从src0中选取,比特位是0时从src1选取。 |
|
以内置固定模式对应的二进制或者用户自定义输入的Tensor数值对应的二进制为gather mask(数据收集的掩码),从源操作数中选取元素写入目的操作数中。 |
||
精度转换指令 |
根据源操作数和目的操作数Tensor的数据类型进行精度转换。 |
|
对输入做量化并进行精度转换。 |
||
归约指令 |
在所有的输入数据中找出最大值及最大值对应的索引位置。 |
|
在所有的输入数据中找出最小值及最小值对应的索引位置。 |
||
对所有的输入数据求和。 |
||
每个repeat内所有数据求最大值以及其索引index。 |
||
每个repeat内所有数据求最小值以及其索引index。 |
||
每个repeat内所有数据求和。 |
||
对每个datablock内所有元素求最大值。 |
||
对每个datablock内所有元素求最小值。 |
||
对每个datablock内所有元素求和。源操作数相加采用二叉树方式,两两相加。 |
||
PairReduceSum:相邻两个(奇偶)元素求和。 |
||
数据填充 |
将一个变量或一个立即数,复制多次并填充到向量。 |
|
给定一个输入张量,每一次取输入张量中的8个数填充到结果张量的8个datablock(32Bytes)中去,每个数对应一个datablock。 |
||
数据分散/数据收集 |
给定输入的张量和一个地址偏移张量,Gather指令根据偏移地址将输入张量按元素收集到结果张量中。 |
|
掩码操作 |
设置mask模式为Counter模式。该模式下,不需要开发者去感知迭代次数、处理非对齐的尾块等操作,可直接传入计算数据量,实际迭代次数由Vector计算单元自动推断。 |
|
设置mask模式为Normal模式。该模式为系统默认模式,支持开发者配置迭代次数。 |
||
用于在矢量计算时设置mask。 |
||
恢复mask的值为默认值(全1),表示矢量计算中每次迭代内的所有元素都将参与运算。 |
||
量化设置 |
设置DEQSCALE寄存器的值。 |
数据搬运
内存管理与同步控制
接口名 |
功能描述 |
---|---|
TPipe是用来管理全局内存等资源的框架。通过TPipe类提供的接口可以完成内存等资源的分配管理操作。 |
|
获取框架当前管理全局内存的TPipe指针,用户获取指针后,可进行TPipe相关的操作。 |
|
TPipe可以管理全局内存资源,而TBufPool可以手动管理或复用Unified Buffer/L1 Buffer物理内存,主要用于多个stage计算中Unified Buffer/L1 Buffer物理内存不足的场景。 |
|
提供入队出队等接口,通过队列(Queue)完成任务间通信和同步。 |
|
TQueBind绑定源逻辑位置和目的逻辑位置,根据源位置和目的位置,来确定内存分配的位置 、插入对应的同步事件,帮助开发者解决内存分配和管理、同步等问题。 |
|
使用Ascend C编程的过程中,可能会用到一些临时变量。这些临时变量占用的内存可以使用TBuf数据结构来管理。 |
|
初始化SPM Buffer。 |
|
将需要溢出暂存的数据拷贝到SPM Buffer中。 |
|
从SPM Buffer读回到local数据中。 |
|
获取用户使用的workspace指针。 |
|
在进行融合算子编程时,由于框架通信机制需要使用到workspace,也就是系统workspace,所以在该场景下,开发者要调用该接口,设置系统workspace的指针。 |
|
获取系统workspace指针。 |
|
从源地址所在的特定DDR地址预加载数据到data cache中。 |
|
该接口用来刷新Cache,保证Cache的一致性。 |
系统变量访问
接口名 |
功能描述 |
---|---|
获取当前任务配置的Block数,用于代码内部的多核逻辑控制等。 |
|
获取当前core的index,用于代码内部的多核逻辑控制及多核偏移量计算等。 |
|
获取当前芯片版本一个datablock的大小,单位为byte。开发者根据datablock的大小来计算API指令中待传入的repeatTimes 、dataBlockStride,repeatStride等参数值。 |
|
获取当前AI处理器架构版本号。 |
|
适用于Cube/Vector分离架构,用来获取Cube/Vector的配比。 |
调测接口
接口名 |
功能描述 |
---|---|
基于算子工程开发的算子,可以使用该接口Dump指定Tensor的内容。 |
|
基于算子工程开发的算子,可以使用该接口实现CPU侧/NPU侧调试场景下的格式化输出功能。 |
|
基于算子工程开发的算子,可以使用该接口实现CPU/NPU域assert断言功能。 |
|
基于算子工程开发的算子,可以使用该接口Dump指定Tensor的内容。该接口可以支持指定偏移位置的Tensor打印。 |
|
当软件产生异常后,使用该指令使kernel中止运行。 |
ISASI接口
分类 |
接口名 |
功能描述 |
---|---|---|
矢量计算 |
双线性插值操作,分为垂直迭代和水平迭代。 |
|
获取Compare(结果存入寄存器)指令的比较结果。 |
||
获取ReduceSum(针对tensor前n个数据计算)接口的计算结果。 |
||
将连续元素合入Region Proposal内对应位置,每次迭代会将16个连续元素合入到16个Region Proposals的对应位置里。 |
||
与ProposalConcat功能相反,从Region Proposals内将相应位置的单个元素抽取后重排,每次迭代处理16个Region Proposals,抽取16个元素后连续排列。 |
||
根据Region Proposals中的score域对其进行排序(score大的排前面),每次排16个Region Proposals。 |
||
将已经排好序的最多4 条region proposals队列,排列并合并成1条队列,结果按照score域由大到小排序。 |
||
排序函数,一次迭代可以完成32个数的排序。 |
||
将已经排好序的最多4 条队列,合并排列成 1 条队列,结果按照score域由大到小排序。 |
||
给定一个输入的张量和一个地址偏移张量,Gatherb指令根据偏移地址将输入张量收集到结果张量中。 |
||
给定一个连续的输入张量和一个目的地址偏移张量,Scatter指令根据偏移地址生成新的结果张量后将输入张量分散到结果张量中。 |
||
矩阵计算 |
初始化LocalTensor(TPosition为A1/A2/B1/B2)为某一个具体的数值。 |
|
LoadData包括Load2D和Load3D数据加载功能。 |
||
该接口实现带转置的2D格式数据从A1/B1到A2/B2的加载。 |
||
用于调用Load3Dv1/Load3Dv2时设置FeatureMap的属性描述。 |
||
设置Load3D时A1/B1边界值。 |
||
用于设置Load3Dv2接口的repeat参数。设置repeat参数后,可以通过调用一次Load3Dv2接口完成多个迭代的数据搬运。 |
||
设置padValue,用于Load3Dv1/Load3Dv2。 |
||
完成矩阵乘加操作。 |
||
矩阵计算完成后,对结果进行处理,例如对计算结果进行量化操作,并把数据从CO1搬迁到Global Memory中。 |
||
在Fixpipe的流程中,会涉及到relu (通过将FixpipeParams.reluEn设置为true)和quant(FixpipeParams.QuantParams设置为非NoQuant)的流程,分别用于relu和quant计算。通过该接口设置relu和quant的源操作数。 |
||
在Fixpipe的流程中,会涉及到nz2nd的流程(FixpipeParams.Nz2NdParams.nz2ndEn设置为true)该接口用于设置FixpipeNz2nd相关的配置。 |
||
在Fixpipe的流程中,会涉及到quant量化流程,该接口用于设置量化流程中deq scalar(量化参数)。 |
||
此接口同SetHF32TransMode与SetMMLayoutTransform一样,都用于设置寄存器的值。SetHF32Mode接口用于设置MMAD的HF32模式。 |
||
此接口同SetHF32Mode与SetMMLayoutTransform一样,都用于设置寄存器的值。SetHF32TransMode用于设置MMAD的HF32取整模式,仅在MMAD的HF32模式生效时有效。 |
||
此接口同SetHF32Mode与SetHF32TransMode一样,都用于设置寄存器的值,其中SetMMLayoutTransform接口用于设置MMAD的M/N方向。 |
||
监视设定范围内的UB读写行为,如果监视到有设定范围的读写行为则会出现EXCEPTION报错,未监视到设定范围的读写行为则不会报错。 |
||
计算给定输入张量和权重张量的2-D卷积,输出结果张量。Conv2d卷积层多用于图像识别,使用过滤器提取图像中的特征。 |
||
根据输入的切分规则,将给定的两个输入张量做矩阵乘,输出至结果张量。将A和B两个输入矩阵乘法在一起,得到一个输出矩阵C。 |
||
数据搬运 |
该接口提供数据非对齐搬运的功能。 |
|
设置DataCopyPad接口填充的数值。 |
||
同步控制 |
同一核内不同流水线之间的同步指令。具有数据依赖的不同流水指令之间需要插此同步。 |
|
阻塞相同流水,具有数据依赖的相同流水之间需要插此同步。 |
||
针对分离架构,AI Core上的Cube核(AIC)与Vector核(AIV)之间的同步设置指令。 |
||
针对分离架构,AI Core上的Cube核(AIC)与Vector核(AIV)之间的同步等待指令。 |
||
缓存处理 |
从指令所在DDR地址预加载指令到ICache中。 |
|
获取ICACHE的PreLoad的状态。 |
||
系统变量访问 |
获取程序计数器的指针,程序计数器用于记录当前程序执行的位置。 |
|
获取AI Core上Vector核的数量。 |
||
获取AI Core上Vector核的ID。 |
||
获取当前系统cycle数,若换算成时间需要按照50MHz的频率,时间单位为us,换算公式为:time = (cycle数/50) us 。 |
||
原子操作 |
原子操作函数,设置后续从VECOUT传输到GM的数据是否执行原子比较,将待拷贝的内容和GM已有内容进行比较,将最大值写入GM。 |
|
原子操作函数,设置后续从VECOUT传输到GM的数据是否执行原子比较,将待拷贝的内容和GM已有内容进行比较,将最小值写入GM。 |
||
设置原子操作使能位与原子操作类型。 |
||
获取原子操作使能位与原子操作类型的值。 |
其他接口
分类 |
接口名 |
功能描述 |
---|---|---|
数据转换 |
可实现16*16的二维矩阵数据块的转置和[N,C,H,W]与[N,H,W,C]互相转换。 |
|
数据格式转换,一般用于将NCHW格式转换成NC1HWC0格式。特别的,也可以用于二维矩阵数据块的转置。 |
||
多核控制 |
当不同核之间操作同一块全局内存且可能存在读后写、写后读以及写后写等数据依赖问题时,通过调用该函数来插入同步语句来避免上述数据依赖时可能出现的数据读写错误问题。 |
|
当不同核之间操作同一块全局内存且可能存在读后写、写后读以及写后写等数据依赖问题时,通过调用该函数来插入同步语句来避免上述数据依赖时可能出现的数据读写错误问题。 |
||
当不同核之间操作同一块全局内存且可能存在读后写、写后读以及写后写等数据依赖问题时,通过调用该函数来插入同步语句来避免上述数据依赖时可能出现的数据读写错误问题。 |
||
原子操作 |
设置接下来从VECOUT到GM,L0C到GM,L1到GM的数据传输是否进行原子累加,可根据参数不同设定不同的累加数据类型。 |
|
通过设置模板参数来设定原子操作不同的数据类型。 |
||
原子操作函数,清空原子操作的状态。 |
||
Kernel Tiling |
用于获取算子kernel入口函数传入的tiling信息,并填入注册的Tiling结构体中,此函数会以宏展开的方式进行编译。如果用户注册了多个TilingData结构体,使用该接口返回默认注册的结构体。 |
|
在核函数中判断本次执行时的tiling_key是否等于某个key,从而标识tiling_key==key的一条kernel分支。 |
||
设置全局默认的kernel type, 对所有的tiling key生效。 |
||
设置某一个具体的tiling key对应的kernel type。 |