C API
C API文档目录,整体使用时可以引入asc_simd.h,C API列表如下:
数据结构
| 结构名 | 说明 |
|---|---|
| asc_load3d_v2_config | Load3Dv2接口的repeat参数 |
| asc_store_atomic_config | 原子操作使能位与原子操作类型的值 |
| asc_fill_value_config | fill_value的初始化参数结构体,包含asc_fill_l0a/asc_fill_l0b/asc_fill_l1接口需要配置的各种初始化参数。 |
矢量计算
矢量计算类API,单独使用时可以引入vector_compute.h,此类API列表如下:
| API名称 | 说明 |
|---|---|
| asc_get_cmp_mask | 获取Compare操作的比较结果。 |
| asc_set_cmp_mask | 为Select操作设置用于选择的掩码。 |
| asc_get_rsvd_count | 获取GatherMask操作后剩余的元素数量。 |
| asc_set_mask_count | 设置Mask模式为Counter模式。 |
| asc_set_mask_norm | 设置Mask模式为Normal模式。 |
| asc_set_vector_mask | 设置Mask值。 |
| asc_add | 按元素求和。 |
| asc_add_scalar | 矢量内每个元素与标量求和。 |
| asc_sub | 按元素求差。 |
| asc_sub_scalar | 矢量内每个元素与标量求差。 |
| asc_mul | 按元素求积。 |
| asc_mul_scalar | 矢量内每个元素与标量求积。 |
| asc_div | 按元素求商。 |
| asc_exp | 按元素取自然指数。 |
| asc_relu | 按元素做线性整流Relu。 |
| asc_max | 按元素求最大值。 |
| asc_max_scalar | 矢量内每个元素与标量求最大值。 |
| asc_min | 按元素求最小值。 |
| asc_datablock_reduce_sum | 对每个DataBlock内所有元素求和。 |
| asc_datablock_reduce_max | 对每个DataBlock内所有元素求最大值。 |
| asc_datablock_reduce_min | 对每个DataBlock内所有元素求最小值。 |
| asc_repeat_reduce_sum | 对每个Repeat内所有元素求和。 |
| asc_repeat_reduce_max | 对每个Repeat内所有元素求最大值。 |
| asc_repeat_reduce_min | 对每个Repeat内所有元素求最小值。 |
| asc_brcb | 将源操作数中的每一个数填充到目的操作数的一个DataBlock中。 |
| asc_duplicate | 将一个变量或立即数填充到一个矢量中。 |
| asc_select | 根据掩码,从两个源操作数中选取元素,输出到目的操作数。 |
| asc_bfloat162float | 数据类型转换。将bfloat16_t类型的数据转换为float类型。 |
| asc_bfloat162int32 | 数据类型转换。将bfloat16_t类型的数据转换为int32_t类型。 |
| asc_float2bfloat16 | 数据类型转换。将float类型的数据转换为bfloat16_t类型。 |
| asc_float2float | 数据类型转换。将float类型的数据转换为float类型。 |
| asc_float2half | 数据类型转换。将float类型的数据转换为half类型。 |
| asc_half2float | 数据类型转换。将half类型的数据转换为float类型。 |
| asc_half2int4 | 数据类型转换。将half类型的数据转换为int4b_t类型。 |
| asc_half2int8 | 数据类型转换。将half类型的数据转换为int8_t类型。 |
| asc_half2int16 | 数据类型转换。将half类型的数据转换为int16_t类型。 |
| asc_half2int32 | 数据类型转换。将half类型的数据转换为int32_t类型。 |
| asc_int42half | 数据类型转换。将int4b_t类型的数据转换为half类型。 |
| asc_int82half | 数据类型转换。将int8_t类型的数据转换为half类型。 |
| asc_uint82half | 数据类型转换。将uint8_t类型的数据转换为half类型。 |
| asc_int162float | 数据类型转换。将int16_t类型的数据转换为float类型。 |
| asc_int322int16 | 数据类型转换。将int32_t类型的数据转换为int16_t类型。 |
| asc_int322int64 | 数据类型转换。将int32_t类型的数据转换为int64_t类型。 |
| asc_int642int32 | 数据类型转换。将int64_t类型的数据转换为int32_t类型。 |
| asc_deq_int162b8 | 将int16_t类型转换为int8_t或uint8_t类型,并将数据存放在每个DataBlock的上半块或下半块。 |
| asc_set_deq_scale | 设置DEQSCALAR寄存器的值。 |
| asc_eq | 比较src0与src1在对应索引位置的元素大小。若比较结果为真,则输出结果的对应比特位设为1,否则设为0。 |
| asc_transpose | 用于实现16*16的二维矩阵数据块转置。 |
| asc_sqrt | 对元素进行开方。 |
| asc_vaxpy | 源操作数中每个元素与标量求积后和目的操作数中的对应元素相加。 |
| asc_lt | 按元素判断src0 < src1是否成立,若成立则输出结果上的对应比特位为1,否则为0。 |
| asc_ne_scalar | 按元素判断是否不等于输入标量,若成立则输出结果上的对应比特位为1,否则为0。 |
| asc_gather_datablock | 根据偏移地址按照DataBlock的粒度将源操作数收集到目的操作数中。 |
| asc_int162half | 数据类型转换。将int16_t类型的数据转换为half类型。 |
| asc_rcp | 执行矢量的取倒数运算。 |
| asc_shiftright | 对源操作数中的每个元素执行右移。 |
| asc_mul_add | 执行矢量的乘加运算。 |
| asc_eq_scalar | 执行矢量与标量的比较运算,如果值相等则输出1,否则输出0。 |
| asc_gather | 将源操作数按照给定的偏移按元素收集到目的操作数中。 |
| asc_min_scalar | 源操作数矢量逐元素与标量相比,取较小值。 |
| asc_gt | 按元素比较两个矢量的大小关系,若比较后的结果为真,则输出结果的对应比特位为1,否则为0。 |
| asc_vdeq_int162b8 | 将int16_t类型转化为int8_t或uint8_t类型,并将数据存放在每个DataBlock的上半块或下半块。 |
| asc_int322float | 将int32_t类型数据转换为float类型。 |
| asc_abs | 按元素取绝对值 |
| asc_add_relu | 按元素求和,再进行Relu计算(结果和0对比取较大值),并提供转换最终结果的数据类型的功能(s162s8、f322f16、f162s8)。 |
| asc_and | 执行矢量与运算。 |
| asc_axpy | 源操作数src中每个元素与标量value求积后和目的操作数dst中的对应元素相加 |
| asc_bitsort | Score和Index分别存储在src0和src1中,按Score进行排序(Score大的元素排前面),排序后的Score与其对应的Index一起以(Score,Index)的结构存储在dst中。 |
| asc_deq_int322half | 对输入的int32_t类型的数据按元素做量化并转换为half类型 |
| asc_float2int16 | 将float类型数据转换为int16_t类型。 |
| asc_float2int32 | 将float类型数据转换为int16_t类型 |
| asc_float2int64 | 将float类型数据转换为int16_t类型 |
| asc_ge | Ge(greater than or equal to),逐元素比较src0 >= src1是否成立,成立则输出结果为1,否则输出结果为0,每个元素的比较结果占一个bit。 |
| asc_ge_scalar | 按元素判断src >= value是否成立,若成立则输出结果为1,否则为0。 |
| asc_gt_scalar | src中的每个元素逐个与标量value比较大小,如果某个位置上的元素大于value,则输出结果dst上的对应比特位为1,否则为0。 |
| asc_half2uint8 | 将half类型数据转换为uint8_t类型,支持多种舍入模式。 |
| asc_int642float | 将int64_t类型数据转换为float类型。 |
| asc_le | 按元素判断src0 <= src1是否成立,若成立则输出结果为1,否则为0。 |
| asc_leakyrelu | 执行矢量Leaky Relu运算。 |
| asc_le_scalar | 按元素判断src <= value是否成立,若成立则输出结果为1,否则为0。 |
| asc_log | 按元素取自然对数。 |
| asc_lt_scalar | 执行矢量中每个位置和标量比较,如果值小于标量值则为1,否则为0,结果为每个bit位按小端序排布 |
| asc_mrgsort4 | 将已经排好序的最多4条队列,合并排列成1条队列,结果按照score域由大到小排序。 |
| asc_fma | 按元素将src0和src1相乘并和dst相加,将最终结果存放进dst中。 |
| asc_mul_add_relu | 按元素将src0和dst相乘并加上src1,再进行Relu计算(结果和0对比取较大值),最终结果存放进dst中。 |
| asc_mul_cast_half2int8 | 按元素求积,并将结果转换为int8_t类型 |
| asc_mul_cast_half2uint8 | 按元素求积,并将结果转换为uint8_t类型。 |
| asc_ne | 按元素判断src0 != src1是否成立,若成立则输出结果为1,否则为0。 |
| asc_not | 按元素做按位取反,计算公式如下。 |
| asc_or | 每对元素按位或运算。 |
| asc_reduce | Reduce(归约)是将一组数据通过指定运算聚合(聚合指将将一组分散、多个的数据通过某种规则合并成一个或少数几个的操作)为单个、少量结果的核心操作,包括ReduceMax、ReduceMin和ReduceSum等。 |
| asc_rsqrt | 按元素进行开方后取倒数的计算。 |
| asc_set_va_reg | 用于设置transpose的地址,将操作数地址序列与地址寄存器关联。 |
| asc_shiftleft | 将所有元素左移distance位。 |
| asc_sub_relu | 按元素求差,再进行Relu计算(结果和0对比取较大值),并提供转换最终结果的数据类型的功能(s162s8、f322f16、f162s8)。 |
| asc_transto5hd | 数据格式转换,一般用于将NCHW格式转换成NC1HWC0格式。 |
数据搬运
数据搬运类API,单独使用时可以引入vector_datamove.h和cube_datamove.h,此类API列表如下:
| API名称 | 说明 |
|---|---|
| asc_copy_l0c2gm | 将L0C中的数据搬运到GM中。 |
| asc_set_l13d_rpt | 用于设置Load3Dv2接口的repeat参数。 |
| asc_fill_l0a | 将L0A Buffer的Local Memory初始化为某一具体数值。 |
| asc_fill_l0b | 将L0B Buffer的Local Memory初始化为某一具体数值。 |
| asc_fill_l1 | 将L1 Buffer的Local Memory初始化为某一具体数值。 |
| asc_set_l13d_size | 设置asc_copy_l12l0a/asc_copy_l12l0b的3D格式搬运接口在L1 Buffer的边界值。 |
| asc_load_image_to_cbuf | 将图像数据从Global Memory搬运到L1 Buffer。 |
| asc_copy_l12bt | 将数据从L1 Buffer搬运到BiasTable Buffer中,BiasTable Buffer用于存放矩阵计算中的Bias。 |
| asc_copy_l12fb | 将数据从L1 Buffer搬运到Fixpipe Buffer中,Fixpipe Buffer用于存放量化参数。 |
| asc_copy_l12l0a | 用于搬运存放在L1 Buffer里的512B大小的矩阵到L0A Buffer里。 |
| asc_copy_l12l0b | 用于搬运存放在L1 Buffer里的512B大小的矩阵到l0b Buffer里。 |
| asc_copy_l12l0b_sparse | 用于搬运存放在L1 Buffer里的512B大小的稠密权重矩阵到L0B Buffer里,同时读取128B大小的索引矩阵用于稠密矩阵的稀疏化。 |
| asc_copy_l12l0b_trans | 该接口实现带转置的2D格式数据从L1 Buffer到L0B Buffer的加载。 |
| asc_set_l0c_copy_params | DataCopy(CO1->GM、CO1->A1)过程中进行随路格式转换(NZ格式转换为ND格式)时,通过调用该接口设置格式转换的相关配置。 |
| asc_set_l0c_copy_prequant | 数据搬运过程中进行随路量化时,通过调用该接口设置量化流程中的标量量化参数。 |
| copy_gm2l1 | 将数据从Global Memory (GM) 搬运到 Level 1 cache (L1)。 |
| copy_gm2l1_nd2nz | 将数据从Global Memory (GM) 搬运到 Level 1 cache (L1),支持在数据搬运时进行ND格式到NZ格式的转换。 |
| asc_set_l13d_padding | 设置Pad属性描述,用于在调用asc_copy_l12l0a接口时配置填充数值。 |
| asc_copy_gm2ub | 将数据从Global Memory (GM) 搬运到 Unified Buffer (UB)。 |
| asc_copy_gm2ub_align | 提供数据非对齐搬运的功能,将数据从Global Memory (GM) 搬运到 Unified Buffer (UB),并支持8位/16位/32位数据类型搬运。 |
| asc_copy_ub2gm | 将数据从Unified Buffer (UB) 搬运到 Global Memory (GM)。 |
| asc_copy_ub2gm_align | 将数据从Unified Buffer (UB) 搬运到 Global Memory (GM),支持8位/16位/32位分块拷贝操作。 |
维测接口
| API名称 | 说明 |
|---|---|
| assert | 在算子Kernel侧实现代码中需要增加断言的地方使用assert检查代码,并格式化输出一些调测信息。 |
| dump | 将对应内存上的数据打印出来,同时支持打印自定义的附加信息(仅支持uint32_t类型的信息)。 |
| printf | 该接口提供NPU域调试场景下的格式化输出功能。 |
标量操作
标量操作类API,单独使用时可以引入scalar_compute.h,此类API列表如下:
| API名称 | 说明 |
|---|---|
| asc_clz | 计算参数前导零的数量(二进制从最高位到第一个1共有多少个0)。 |
| asc_set_nthbit | 计算一个uint64_t类型数字的指定二进制位置为1,其余位保持不变。 |
| asc_sflbits | 计算一个int64_t类型数字的二进制中,从最高数值位开始与符号位相同的连续比特位的个数。 |
| asc_clear_nthbit | 位操作函数,用于将一个uint64_t整数bits的第idx位设置为0。 |
| asc_ffs | FindFirstSet接口,输入数据的二进制表示中从最低位向最高位查找第一个值为1的位,并返回其位置,如果没找到则返回-1。 |
| asc_ffz | 获取一个uint64_t类型数字的二进制表示中从最低有效位开始的第一个0出现的位置,如果没找到则返回-1。 |
| asc_popc | 获取一个uint64_t类型数字的二进制中1的个数。 |
| asc_zero_bits_cnt | 获取一个uint64_t类型数字的二进制中0的个数。 |
矩阵计算
标量操作类API,单独使用时可以引入cube_compute.h,此类API列表如下:
| API名称 | 说明 |
|---|---|
| asc_set_mmad_direction_m | 设置mmad计算时优先通过M/N中的N方向,然后通过M方向产生结果,M为矩阵的行,N为矩阵的列。 |
| asc_set_mmad_direction_n | 设置mmad计算时优先通过M/N中的M方向,然后通过N方向产生结果,M为矩阵的行,N为矩阵的列。 |
| asc_enable_hf32_trans | 设置HF32模式取整方式,需要先使用asc_enable_hf32开启HF32取整模式。 |
| asc_mmad | 完成矩阵乘加操作。 |
| asc_mmad_sparse | 完成矩阵乘加操作,传入的左矩阵A为稀疏矩阵,右矩阵B为稠密矩阵。 |
| asc_set_fp32_mode | 无 |
| asc_enable_hf32 | 用于设置Mmad计算开启HF32模式,开启该模式后L0A Buffer/L0B Buffer中的FP32数据将在参与Mmad计算之前被舍入为HF32。 |
同步控制
同步控制类API,单独使用时可以引入sync.h,此类API列表如下:
| API名称 | 说明 |
|---|---|
| asc_sync_notify | 设置同步标志。 |
| asc_sync_wait | 等待同步标志。 |
| asc_sync_pipe | 等待指定流水线操作完成。 |
| asc_sync | 等待所有流水线操作完成。 |
| asc_sync_vec | 同步所有流水线。 |
| asc_sync_mte3 | 等待PIPE_MTE3流水完成。 |
| asc_sync_mte2 | 等待PIPE_MTE2流水完成。 |
| asc_sync_data_barrier | 用于阻塞后续的指令执行,直到所有之前的内存访问指令(需要等待的内存位置可以通过参数控制)执行结束。 |
系统变量
系统变量类API,单独使用时可以引入sys_var.h,此类API列表如下:
| API名称 | 说明 |
|---|---|
| asc_get_block_num | 获取AI核数。 |
| asc_get_block_idx | 获取当前运行核的索引。 |
| asc_get_core_id | 获取当前核的编号。 |
| asc_get_sub_block_id | 获取AI Core上Vector核的ID。 |
| asc_get_sub_block_num | 分离模式下,获取一个AI Core上Cube Core(AIC)或者Vector Core(AIV)的数量。 |
| asc_set_ctrl | 设置CTRL寄存器(控制寄存器)的值。 |
| asc_get_ctrl | 读取CTRL寄存器(控制寄存器)的值。 |
| asc_get_phy_buf_addr | 基于偏移量获取片上实际物理地址。 |
| asc_get_system_cycle | 获取当前系统cycle数。 |
| asc_get_arch_ver | 获取当前AI处理器架构版本号。 |
| asc_get_program_counter | 获取程序计数器的指针,程序计数器用于记录当前程序执行的位置。 |
缓存控制
缓存控制类API,单独使用时可以引入cache_ctrl.h,此类API列表如下:
| API名称 | 说明 |
|---|---|
| asc_datacache_preload | 从源地址所在的特定GM地址预加载数据到Data Cache中。 |
| asc_dcci | 用于刷新Cache, 保证Cache的一致性。 |
| asc_get_icache_preload_status | 获取ICache的Preload的状态。 |
| asc_icache_preload | 从指令所在DDR地址预加载数据到对应的cacheline中。 |
原子操作
原子操作类API,单独使用时可以引入atomic.h,此类API列表如下:
| API名称 | 说明 |
|---|---|
| asc_set_atomic_add_bfloat | 设置对后续的从Unified Buffer/L0C Buffer/L1 Buffer到Global Memory的数据传输开启原子累加。累加的数据类型为bfloat16_t。 |
| asc_set_atomic_add_float | 设置对后续的从Unified Buffer/L0C Buffer/L1 Buffer到Global Memory的数据传输开启原子累加。累加的数据类型为float。 |
| asc_set_atomic_add_float16 | 设置对后续的从Unified Buffer/L0C Buffer/L1 Buffer到Global Memory的数据传输开启原子累加。累加的数据类型为half。 |
| asc_set_atomic_add_int | 设置对后续的从Unified Buffer/L0C Buffer/L1 Buffer到Global Memory的数据传输开启原子累加。累加的数据类型为int32_t。 |
| asc_set_atomic_add_int8 | 设置对后续的从Unified Buffer/L0C Buffer/L1 Buffer到Global Memory的数据传输开启原子累加。累加的数据类型为int8_t。 |
| asc_set_atomic_add_int16 | 设置对后续的从Unified Buffer/L0C Buffer/L1 Buffer到Global Memory的数据传输开启原子累加。累加的数据类型为int16_t。 |
| asc_set_atomic_max_bfloat | 设置计算结果以原子比较的方式传输到GM。在拷贝前,将待传输的bfloat16_t数据与GM中已有数据进行逐元素比较,并将最大值写入GM。 |
| asc_set_atomic_max_float | 设置计算结果以原子比较的方式传输到GM。在拷贝前,将待传输的float数据与GM中已有数据进行逐元素比较,并将最大值写入GM。 |
| asc_set_atomic_max_float16 | 设置计算结果以原子比较的方式传输到GM。在拷贝前,将待传输的half数据与GM中已有数据进行逐元素比较,并将最大值写入GM。 |
| asc_set_atomic_max_int | 设置计算结果以原子比较的方式传输到GM。在拷贝前,将待传输的int32_t数据与GM中已有数据进行逐元素比较,并将最大值写入GM。 |
| asc_set_atomic_max_int8 | 设置计算结果以原子比较的方式传输到GM。在拷贝前,将待传输的int8_t数据与GM中已有数据进行逐元素比较,并将最大值写入GM。 |
| asc_set_atomic_max_int16 | 设置计算结果以原子比较的方式传输到GM。在拷贝前,将待传输的int16_t数据与GM中已有数据进行逐元素比较,并将最大值写入GM。 |
| asc_set_atomic_min_bfloat | 设置计算结果以原子比较的方式传输到GM。在拷贝前,将待传输的bfloat16_t数据与GM中已有数据进行逐元素比较,并将最小值写入GM。 |
| asc_set_atomic_min_float | 设置计算结果以原子比较的方式传输到GM。在拷贝前,将待传输的float数据与GM中已有数据进行逐元素比较,并将最小值写入GM。 |
| asc_set_atomic_min_float16 | 设置计算结果以原子比较的方式传输到GM。在拷贝前,将待传输的half数据与GM中已有数据进行逐元素比较,并将最小值写入GM。 |
| asc_set_atomic_min_int | 设置计算结果以原子比较的方式传输到GM。在拷贝前,将待传输的int32_t数据与GM中已有数据进行逐元素比较,并将最小值写入GM。 |
| asc_set_atomic_min_int8 | 设置计算结果以原子比较的方式传输到GM。在拷贝前,将待传输的int8_t数据与GM中已有数据进行逐元素比较,并将最小值写入GM。 |
| asc_set_atomic_min_int16 | 设置计算结果以原子比较的方式传输到GM。在拷贝前,将待传输的int16_t数据与GM中已有数据进行逐元素比较,并将最小值写入GM。 |
| asc_set_store_atomic_config | 设置原子操作使能位与原子操作类型的值。 |
| asc_get_store_atomic_config | 获取原子操作使能位与原子操作类型的值。 |
| asc_set_atomic_none | 清空原子操作的状态。 |
其他操作
| API名称 | 说明 |
|---|---|
| asc_init | 初始化NPU状态。 |