Ascend C API列表
Ascend C提供一组类库API,开发者使用标准C++语法和类库API进行编程。Ascend C编程类库API示意图如下所示,分为:
- 基础数据结构:kernel API中使用到的基础数据结构,比如GlobalTensor和LocalTensor。
- 语言拓展层C API:纯C接口,开放芯片完备编程能力,支持数组分配内存,一般基于指针编程,提供与业界一致的C语言编程体验。
- 基础API:实现对硬件能力的抽象,开放芯片的能力,保证完备性和兼容性。标注为ISASI(Instruction Set Architecture Special Interface,硬件体系结构相关的接口)类别的API,不能保证跨硬件版本兼容。
- 高阶API:实现一些常用的计算算法,用于提高编程开发效率,通常会调用多种基础API实现。高阶API包括数学库、Matmul、Softmax等API。高阶API可以保证兼容性。
- SIMT API:单指令多线程API。以单条指令多个线程的形式来实现并行计算。SIMT编程主要用于向量计算,特别适合处理离散访问、复杂控制逻辑等场景。
- Utils API(公共辅助函数):丰富的通用工具类,涵盖标准库、平台信息获取、运行时编译及日志输出等功能,支持开发者高效实现算子开发与性能优化。

基础数据结构
表 1 基础数据结构列表
LocalTensor用于存放AI Core中Local Memory(内部存储)的数据,支持逻辑位置TPosition为VECIN、VECOUT、VECCALC、A1、A2、B1、B2、CO1、CO2。 |
|
Layout<Shape, Stride>数据结构是描述多维张量内存布局的基础模板类,通过编译时的形状(Shape)和步长(Stride)信息,实现逻辑坐标空间到一维内存地址空间的映射,为复杂张量操作和硬件优化提供基础支持。 |
|
TensorTrait数据结构是描述Tensor相关信息的基础模板类,包含Tensor的数据类型、逻辑位置和Layout内存布局。 |
基础API
表 2 标量计算API列表
表 3 Memory矢量计算API列表
按元素将src0Local和dstLocal相乘并加上src1Local,将结果和0作比较,取较大值,最终结果存放进dstLocal中。 |
||
逐元素比较两个tensor大小,如果比较后的结果为真,则输出结果的对应比特位为1,否则为0。Compare接口需要mask参数时,可以使用此接口。计算结果存放入寄存器中。 |
||
逐元素比较一个tensor中的元素和另一个Scalar的大小,如果比较后的结果为真,则输出结果的对应比特位为1,否则为0。 |
||
给定两个源操作数src0和src1,根据selMask(用于选择的Mask掩码)的比特位值选取元素,得到目的操作数dst。选择的规则为:当selMask的比特位是1时,从src0中选取,比特位是0时从src1选取。 |
||
以内置固定模式对应的二进制或者用户自定义输入的Tensor数值对应的二进制为gather mask(数据收集的掩码),从源操作数中选取元素写入目的操作数中。 |
||
每个repeat内所有数据求和。和WholeReduceSum接口相比,不支持mask逐bit模式。建议使用功能更全面的WholeReduceSum接口。 |
||
给定一个输入张量,每一次取输入张量中的8个数填充到结果张量的8个datablock(32Bytes)中去,每个数对应一个datablock。 |
||
设置mask模式为Counter模式。该模式下,不需要开发者去感知迭代次数、处理非对齐的尾块等操作,可直接传入计算数据量,实际迭代次数由Vector计算单元自动推断。 |
||
表 4 数据搬运API列表
表 5 资源管理API列表
表 6 同步控制API列表
当不同核之间操作同一块全局内存且可能存在读后写、写后读以及写后写等数据依赖问题时,通过调用该函数来插入同步语句来避免上述数据依赖时可能出现的数据读写错误问题。调用IBSet设置某一个核的标志位,与IBWait成对出现配合使用,表示核之间的同步等待指令,等待某一个核操作完成。 |
|
当不同核之间操作同一块全局内存且可能存在读后写、写后读以及写后写等数据依赖问题时,通过调用该函数来插入同步语句来避免上述数据依赖时可能出现的数据读写错误问题。IBWait与IBSet成对出现配合使用,表示核之间的同步等待指令,等待某一个核操作完成。 |
|
当不同核之间操作同一块全局内存且可能存在读后写、写后读以及写后写等数据依赖问题时,通过调用该函数来插入同步语句来避免上述数据依赖时可能出现的数据读写错误问题。目前多核同步分为硬同步和软同步,硬件同步是利用硬件自带的全核同步指令由硬件保证多核同步,软件同步是使用软件算法模拟实现。 |
|
初始化GM共享内存的值,完成初始化后才可以调用WaitPreBlock和NotifyNextBlock。 |
|
表 7 缓存处理API列表
表 8 系统变量访问API列表
表 9 原子操作接口列表
设置接下来从VECOUT到GM,L0C到GM,L1到GM的数据传输是否进行原子累加,可根据参数不同设定不同的累加数据类型。 |
|
调用该接口后,可在指定GM地址上进行原子比较,如果和value1相等,则把value2的值赋值到GM上;如果和value1不相等,则GM上的值不变。 |
|
表 10 调试接口列表
ascendc_assert提供了一种在CPU/NPU域实现断言功能的接口。当断言条件不满足时,系统会输出断言信息并格式化打印在屏幕上。 |
|
CPU调测时,设置内核模式为单AIV模式,单AIC模式或者MIX模式,以分别支持单AIV矢量算子,单AIC矩阵算子,MIX混合算子的CPU调试。 |
|
通过CAModel进行算子性能仿真时,可对算子任意运行阶段打点,从而分析不同指令的流水图,以便进一步性能调优。 用于表示起始位置打点,一般与TRACE_STOP配套使用。 |
|
通过CAModel进行算子性能仿真时,可对算子任意运行阶段打点,从而分析不同指令的流水图,以便进一步性能调优。 用于表示终止位置打点,一般与TRACE_START配套使用。 |
|
用于设置性能数据采集信号启动,和MetricsProfStop配合使用。使用工具进行算子上板调优时,可在kernel侧代码段前后分别调用MetricsProfStart和MetricsProfStop来指定需要调优的代码段范围。 |
|
设置性能数据采集信号停止,和MetricsProfStart配合使用。使用工具进行算子上板调优时,可在kernel侧代码段前后分别调用MetricsProfStart和MetricsProfStop来指定需要调优的代码段范围。 |
表 11 工具函数接口列表
Async提供了一个统一的接口,用于在不同模式下(AIC或AIV)执行特定函数,从而避免代码中直接的硬件条件判断(如使用ASCEND_IS_AIV或ASCEND_IS_AIC)。 |
|
表 12 Kernel Tiling接口列表
用于获取算子kernel入口函数传入的tiling信息,并填入注册的Tiling结构体中,此函数会以宏展开的方式进行编译。如果用户注册了多个TilingData结构体,使用该接口返回默认注册的结构体。 |
|
使用该接口指定结构体名称,可获取指定的tiling信息,并填入对应的Tiling结构体中,此函数会以宏展开的方式进行编译。 |
|
在核函数中判断本次执行时的tiling_key是否等于某个key,从而标识tiling_key==key的一条kernel分支。 |
|
用于在kernel侧注册与TilingKey相匹配的TilingData自定义结构体;该接口需提供一个逻辑表达式,逻辑表达式以字符串“TILING_KEY_VAR”代指实际TilingKey,表达TIlingKey所满足的范围。 |
|
在Kernel侧使用标准C++语法自定义的TilingData结构体时,若用户不确定需要注册哪些结构体,可使用该接口告知框架侧需使用未注册的标准C++语法来定义TilingData,并配套GET_TILING_DATA_WITH_STRUCT,GET_TILING_DATA_MEMBER,GET_TILING_DATA_PTR_WITH_STRUCT来获取对应的TilingData。 |
|
表 13 ISASI接口列表
获取Compare(结果存入寄存器)指令的比较结果。 |
||
为Select不传入mask参数的接口设置比较寄存器。 |
||
获取ReduceSum(针对tensor前n个数据计算)接口的计算结果。 |
||
将连续元素合入Region Proposal内对应位置,每次迭代会将16个连续元素合入到16个Region Proposals的对应位置里。 |
||
与ProposalConcat功能相反,从Region Proposals内将相应位置的单个元素抽取后重排,每次迭代处理16个Region Proposals,抽取16个元素后连续排列。 |
||
根据Region Proposals中的score域对其进行排序(score大的排前面),每次排16个Region Proposals。 |
||
获取MrgSort或MrgSort4已经处理过的队列里的Region Proposal个数,并依次存储在四个List入参中。 |
||
给定一个连续的输入张量和一个目的地址偏移张量,Scatter指令根据偏移地址生成新的结果张量后将输入张量分散到结果张量中。 |
||
源操作数src0大于0的情况下直接将src0写入目的操作数dst,否则将源操作数src0 * src1的结果写入dst。 |
||
对前count个输入数据src0、src1按元素相乘操作,将结果写入dst0Local,溢出部分写入dst1Local。 |
||
将矢量源操作数前count个数据与标量相乘再按照CAST_ROUND模式转换成half类型, 并将计算结果写入dst,此接口支持标量在前和标量在后两种场景。 |
||
此接口同SetHF32TransMode、SetMMRowMajor以及SetMMColumnMajor一样,都用于设置寄存器的值。SetHF32Mode接口用于设置MMAD的HF32模式。 |
||
此接口同SetHF32Mode、SetMMRowMajor以及SetMMColumnMajor一样,都用于设置寄存器的值。SetHF32TransMode用于设置MMAD的HF32取整模式,仅在MMAD的HF32模式生效时有效。 |
||
此接口同SetHF32Mode、SetHF32TransMode一样,都用于设置寄存器的值,本接口用于设置MMAD计算时优先通过M方向。 |
||
此接口同SetHF32Mode、SetHF32TransMode一样,都用于设置寄存器的值,本接口用于设置MMAD计算时优先通过N方向。 |
||
DataCopy(CO1->GM、CO1->A1)过程中进行随路量化时,通过调用该接口设置量化流程中tensor量化参数。 |
||
DataCopy(CO1->GM、CO1->A1)过程中进行随路格式转换(NZ2ND)时,通过调用该接口设置NZ2ND相关配置。 |
||
DataCopy(CO1->GM、CO1->A1)过程中进行随路量化时,通过调用该接口设置量化流程中scalar量化参数。 |
||
DataCopy(CO1->GM)过程中进行随路量化后,通过调用该接口设置ClipRelu操作的最大值。 |
||
DataCopy(CO1->GM)过程中进行随路量化后,通过调用该接口设置element-wise操作时LocalTensor的地址。 |
||
将图像数据从GM搬运到A1/B1。 搬运过程中可以完成图像预处理操作:包括图像翻转,改变图像尺寸(抠图,裁边,缩放,伸展),以及色域转换,类型转换等。 |
||
用于调用Load3Dv1/Load3Dv2时设置FeatureMap的属性描述。 |
||
设置Load3D时A1/B1边界值。 |
||
用于设置Load3Dv2接口的repeat参数。设置repeat参数后,可以通过调用一次Load3Dv2接口完成多个迭代的数据搬运。 |
||
Mutex用于核内异步流水指令之间的同步处理,其功能类似于传统CPU中的锁机制。通过锁定指定流水再释放流水来完成流水间的同步依赖。每个锁有固定的一个MutexID,该ID可通过用户自定义(范围为0-27)或者通过AllocMutexID/ReleaseMutexID进行申请释放。 |
||
从框架获取并占用一个MutexID,与ReleaseMutexID配合使用,管理MutexID的获取和释放。 |
||
从框架释放一个MutexID,与AllocMutexID配合使用。 |
||
获取当前系统cycle数,若换算成时间需要按照50MHz的频率,时间单位为us,换算公式为:time = (cycle数/50) us 。 |
||
原子操作函数,设置后续从VECOUT传输到GM的数据是否执行原子比较,将待拷贝的内容和GM已有内容进行比较,将最大值写入GM。 |
||
原子操作函数,设置后续从VECOUT传输到GM的数据是否执行原子比较,将待拷贝的内容和GM已有内容进行比较,将最小值写入GM。 |
||
监视设定范围内的UB读写行为,如果监视到有设定范围的读写行为则会出现EXCEPTION报错,未监视到设定范围的读写行为则不会报错。 |
||
CubeResGroupHandle用于在分离模式下通过软同步控制AIC和AIV之间进行通讯,实现AI Core计算资源分组。 |
||
当同一个CubeResGroupHandle中的两个AIV任务之间存在依赖关系时,可以使用GroupBarrier控制同步。 |
||
KfcWorkspace为通信空间描述符,管理不同CubeResGroupHandle的消息通信区划分,与CubeResGroupHandle配合使用。KfcWorkspace的构造函数用于创建KfcWorkspace对象。 |
高阶API
表 14 数学计算API列表
将srcTensor中大于scalar的数替换为scalar,小于等于scalar的数保持不变,作为dstTensor输出。 |
|
将srcTensor中小于scalar的数替换为scalar,大于等于scalar的数保持不变,作为dstTensor输出。 |
|
表 15 量化操作API列表
表 16 归一化操作API列表
LayerNorm中,已知均值和方差,计算shape为[A,R]的输入数据的标准差的倒数rstd和归一化输出y。 |
|
表 17 激活函数API列表
SoftMax增强版本,除了可以对输入tensor做softmaxflash计算,还可以根据上一次softmax计算的sum和max来更新本次的softmax计算结果。 |
|
表 18 归约操作API列表
表 19 排序操作API列表
对数据进行预处理,将要排序的源操作数srcLocal一一对应的合入目标数据concatLocal中,数据预处理完后,可以进行Sort。 |
|
表 20 数据过滤API列表
表 21 张量变换API列表
表 22 索引计算API列表
表 23 矩阵计算API列表
表 24 HCCL通信类API列表
表 25 卷积计算API列表
表 26 随机函数API列表
SIMT API
表 27 核函数定义API
表 28 同步函数
表 29 数学函数
获取输入数据x除以y的余数。求余数时,商取最接近x除以y浮点数结果的整数,当x除以y的浮点数结果与左右最接近的整数距离相等时,商取偶数,同时将商赋值给指针变量quo。 |
|
获取输入数据x除以y的余数。求余数时,商取最接近x除以y浮点数结果的整数,当x除以y的浮点数结果与左右最接近的整数距离相等时,商取偶数。 |
|
如果y大于x,返回比x大的下一个可表示的浮点值,即浮点数二进制最低位加1。 |
|
表 30 精度转换
表 31 比较函数
表 32 Atomic函数
表 33 Warp函数
获取Warp内当前线程LaneId与输入laneMask做异或操作(LaneId^laneMask)得到的dstLaneId对应线程输入的用于交换的var值。 |
|
表 34 类型转换
表 35 向量类型构造函数
表 36 使能Cache Hints的Load/Store函数
Utils API
表 37 C++标准库API列表
表 38 平台信息获取API列表
表 39 Tiling调测API列表
OpTilingRegistry类属于context_ascendc命名空间,主要用于加载Tiling实现的动态库,并获取算子的Tiling函数指针以进行调试和验证。 |
|
ContextBuilder类提供一系列的API接口,支持手动构造类来验证Tiling函数以及KernelContext类用于TilingParse函数的验证。 |
表 40 Tiling模板编程API列表
通过该类接口进行模板参数ASCENDC_TPL_ARGS_DECL和模板参数组合ASCENDC_TPL_ARGS_SEL(即可使用的模板)的定义。 |
|
Tiling模板编程时,开发者通过调用此接口自动生成TilingKey。该接口将传入的模板参数通过定义的位宽,转成二进制,按照顺序组合后转成uint64数值,即TilingKey。 |
|
表 41 RTC API列表
获取编译的二进制数据大小。用于在aclrtcGetBinData获取二进制数据时分配对应大小的内存空间。 |
|
获取编译日志的大小。用于在aclrtcGetCompileLog获取日志内容时分配对应大小的内存空间。 |
|
表 42 log API列表
提供Host侧打印Log的功能。开发者可以在算子的TilingFunc代码中使用ASC_CPU_LOG_XXX接口来输出相关内容。 |
表 43 调测接口列表
本接口提供SIMT VF调试场景下的格式化输出功能。在算子Kernel侧的SIMT VF实现代码中,需要输出日志信息时,调用printf接口打印相关内容。 |
|
本接口在SIMT VF调试场景下提供assert断言功能。在算子Kernel侧的SIMT VF实现代码中,如果assert的内部条件判断不为真,则会输出assert条件,并将输入的信息格式化打印在屏幕上。 |
|
AI CPU API
表 44 AI CPU API列表