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状态。