已合并
[C API]新增Reg计算部分文档 #217
guojianyang创建于 1月31日
[C API]新增Reg计算部分文档 #217
已合并
guojianyang创建于 1月31日
77 个文件变更+1182-91
@@ -77,7 +77,7 @@ C API文档目录,整体使用时可以引入asc_simd.h,C API列表如下:
77| [asc_gather](vector_compute/asc_gather.md) | 将源操作数按照给定的偏移按元素收集到目的操作数中。 |77| [asc_gather](vector_compute/asc_gather.md) | 将源操作数按照给定的偏移按元素收集到目的操作数中。 |
78| [asc_min_scalar](vector_compute/asc_min_scalar.md) | 源操作数矢量逐元素与标量相比,取较小值。 |78| [asc_min_scalar](vector_compute/asc_min_scalar.md) | 源操作数矢量逐元素与标量相比,取较小值。 |
79| [asc_gt](vector_compute/asc_gt.md) | 按元素比较两个矢量的大小关系,若比较后的结果为真,则输出结果的对应比特位为1,否则为0。 |79| [asc_gt](vector_compute/asc_gt.md) | 按元素比较两个矢量的大小关系,若比较后的结果为真,则输出结果的对应比特位为1,否则为0。 |
80-| [asc_vdeq_int162b8](vector_compute/asc_vdeq_int162b8.md) | 将int16_t类型转为int8_t或uint8_t类型,并将数据存放在每个DataBlock的上半块或下半块。 |80+| [asc_vdeq_int162b8](vector_compute/asc_vdeq_int162b8.md) | 将int16_t类型转为int8_t或uint8_t类型,并将数据存放在每个DataBlock的上半块或下半块。 |
81| [asc_int322float](vector_compute/asc_int322float.md) | 将int32_t类型数据转换为float类型。 |81| [asc_int322float](vector_compute/asc_int322float.md) | 将int32_t类型数据转换为float类型。 |
82| [asc_abs](vector_compute/asc_abs.md) | 按元素取绝对值 |82| [asc_abs](vector_compute/asc_abs.md) | 按元素取绝对值 |
83| [asc_add_relu](vector_compute/asc_add_relu.md) | 按元素求和,再进行Relu计算(结果和0对比取较大值),并提供转换最终结果的数据类型的功能(s162s8、f322f16、f162s8)。 |83| [asc_add_relu](vector_compute/asc_add_relu.md) | 按元素求和,再进行Relu计算(结果和0对比取较大值),并提供转换最终结果的数据类型的功能(s162s8、f322f16、f162s8)。 |
@@ -262,3 +262,98 @@ C API文档目录,整体使用时可以引入asc_simd.h,C API列表如下:
262| API名称 | 说明 |262| API名称 | 说明 |
263|----------|-----------|263|----------|-----------|
264| [asc_init](misc/asc_init.md)| 初始化NPU状态。 |264| [asc_init](misc/asc_init.md)| 初始化NPU状态。 |
265+ 
266+<cann-filter npu_type="950">
267+ 
268+## 寄存器数据搬运
269+ 
270+| API名称 | 说明 |
271+|----------|-----------|
272+| [asc_loadalign](reg/reg_load/asc_loadalign/) | 对齐数据搬运接口,从UB连续对齐搬入目的操作数,支持多种搬入模式。 |
273+| [asc_storealign](reg/reg_store/asc_storealign/) | reg计算数据搬运接口,适用于从矢量数据寄存器连续对齐搬出到UB的场景,并支持多种搬出模式。 |
274+| [asc_gather](reg/reg_load/asc_gather.md) | 根据索引位置index将源操作数src按元素收集到目的操作数dst中。 |
275+| [asc_gather_datablock](reg/reg_load/asc_gather_datablock.md) | 给定源操作数在UB中的基地址和索引,根据索引位置将源操作数按DataBlock收集到目的操作数中。 |
276+| [asc_get_mask_spr](reg/reg_load/asc_get_mask_spr.md) | 从特殊寄存器SPR{MASK1, MASK0}读取mask值并根据数据类型格式返回对应的mask数据,MASK0、MASK1均为64bit的寄存器。 |
277+| [asc_load](reg/reg_load/asc_load.md) | reg计算数据搬运接口,支持从UB非32字节对齐的源地址src搬运至矢量数据寄存器,搬运量为VL。 |
278+| [asc_loadunalign](reg/reg_load/asc_loadunalign.md) | reg计算数据搬运接口,适用于从UB非32B对齐的起始地址连续搬入矢量数据寄存器的场景。 |
279+| [asc_loadunalign_pre](reg//reg_load/asc_loadunalign_pre.md) | 用于在进行非对齐数据搬入前的初始化,需配合[asc_loadunalign](./asc_loadunalign.md)接口使用。 |
280+| [asc_store](reg/reg_store/asc_store.md) | reg计算数据搬运接口,适用于从矢量数据寄存器搬出到UB的场景,不区分是否对齐,在追求极致性能时,应尽量避免使用该接口。 |
281+| [asc_storeunalign](reg/reg_store/asc_storeunalign.md) | reg计算数据搬运接口,适用于从矢量数据寄存器连续非32B对齐的起始地址连续搬出到UB的场景。 |
282+| [asc_storeunalign_postupdate](reg/reg_store/asc_storeunalign_postupdate.md) | reg计算数据搬运接口,适用于从矢量数据寄存器连续非32B对齐的起始地址连续搬出到UB的场景。 |
283+ 
284+## 寄存器计算
M
Mmunanhw2月10日

需要加950标签

likedislike
guojianyang
guojianyang
2月10日 评论:
285+ 
286+| API名称 | 说明 |
287+|----------|-----------|
288+| [asc_abs](reg/reg_vector/asc_abs.md) | 按元素取绝对值。 |
289+| [asc_add](reg/reg_vector/asc_add.md) | 按照元素对应位置执行矢量加法运算。 |
290+| [asc_addc](reg/reg_vector/asc_addc.md) | 对输入数据src0、src1及进位数据src2执行元素逐位相加操作,相加结果写入dst1。 |
291+| [asc_add_scalar](reg/reg_vector/asc_add_scalar.md) | 执行矢量和标量的加法运算。 |
292+| [asc_and](reg/reg_vector/asc_and.md) | 执行矢量与运算。 |
293+| [asc_arange](reg/reg_vector/asc_arange.md) | 以传入的value为起始值,生成递增/递减的索引,并将生成的索引保存在dst中。 |
294+| [asc_axpy](reg/reg_vector/asc_axpy.md) | 根据mask对源操作数src、value进行按元素做乘加操作,将结果写入目的操作数dst。 |
295+| [asc_bfloat162float](reg/reg_vector/asc_bfloat162float.md) | 将bfloat16_t数据类型的矢量逐元素转换为float类型。 |
296+| [asc_bfloat162int32](reg/reg_vector/asc_bfloat162int32.md) | 将bfloat16_t数据类型的矢量逐元素转换为int32_t类型。 |
297+| [asc_cumulative_histogram](reg/reg_vector/asc_cumulative_histogram.md) | 对直方图数据进行累计统计。 |
298+| [asc_deintlv](reg/reg_vector/asc_deintlv.md) | 给定源操作数src0和src1,将src0和src1中的元素解交织存入结果操作数dst0和dst1中。 |
299+| [asc_div](reg/reg_vector/asc_div.md) | 按元素求商。 |
300+| [asc_e5m22float](reg/reg_vector/asc_e5m22float.md) | 将fp8_e5m2_t数据类型的矢量逐元素转换为float类型。 |
301+| [asc_exp](reg/reg_vector/asc_exp.md) | 计算e的x次幂。 |
302+| [asc_exp_sub](reg/reg_vector/asc_exp_sub.md) | 将src0与src1相减,差值作为e的指数计算 |
303+| [asc_float2bfloat16](reg/reg_vector/asc_float2bfloat16.md) | 将float数据类型的矢量逐元素转换为bfloat16_t类型。 |
304+| [asc_frequency_histogram](reg/reg_vector/asc_frequency_histogram.md) | 对直方图数据进行频率统计。 |
305+| [asc_ge](reg/reg_vector/asc_ge.md) | 对源操作数执行逐元素比较。对于src0 >= src1,若条件成立则目的操作数对应结果位为1,否则为0。 |
306+| [asc_ge_scalar](reg/reg_vector/asc_ge_scalar.md) | 对源操作数与标量执行逐元素比较。对于src0 >= value,若条件成立则目的操作数对应结果位为1,否则为0。 |
307+| [asc_half2bf16](reg/reg_vector/asc_half2bfloat16.md) | 将half数据类型的矢量逐元素转换为bfloat16_t类型。 |
308+| [asc_half2hif8](reg/reg_vector/asc_half2hif8.md) | 将half数据类型的矢量逐元素转换为hifloat8_t类型。 |
309+| [asc_half2int16](reg/reg_vector/asc_half2int16.md) | 将half数据类型的矢量逐元素转换为int16_t类型。 |
310+| [asc_half2int32](reg/reg_vector/asc_half2int32.md) | 将half数据类型的矢量逐元素转换为int32_t类型。 |
311+| [asc_half2int4x2](reg/reg_vector/asc_half2int4x2.md) | 将half数据类型的矢量逐元素转换为int4x2_t类型。 |
312+| [asc_half2int8](reg/reg_vector/asc_half2int8.md) | 将half数据类型的矢量逐元素转换为int8_t类型。 |
313+| [asc_hif82half](reg/reg_vector/asc_hif82half.md) | 将hifloat8_t数据类型的矢量逐元素转换为half类型。 |
314+| [asc_int162int32](reg/reg_vector/asc_int162int32.md) | 将int16_t数据类型的矢量逐元素转换为int32_t类型。 |
315+| [asc_int162uint32](reg/reg_vector/asc_int162uint32.md) | 将int16_t数据类型的矢量逐元素转换为uint32_t类型。 |
316+| [asc_int322float](reg/reg_vector/asc_int322float.md) | 将int32_t数据类型的矢量逐元素转换为float类型。 |
317+| [asc_int322int64](reg/reg_vector/asc_int322int64.md) | 将int32_t数据类型的矢量逐元素转换为int64_t类型。 |
318+| [asc_int322uint16](reg/reg_vector/asc_int322uint16.md) | 将int32_t数据类型的矢量逐元素转换为uint16_t类型。 |
319+| [asc_int4x22bfloat16](reg/reg_vector/asc_int4x22bfloat16.md) | 将int4x2_t数据类型的矢量逐元素转换为bfloat16_t类型。 |
320+| [asc_int642float](reg/reg_vector/asc_int642float.md) | 将int64_t数据类型的矢量逐元素转换为float类型。 |
321+| [asc_int642int32](reg/reg_vector/asc_int642int32.md) | 将int64_t数据类型的矢量逐元素转换为int32_t类型。 |
322+| [asc_int82half](reg/reg_vector/asc_int82half.md) | 将int8_t数据类型的矢量逐元素转换为half类型。 |
323+| [asc_intlv](reg/reg_vector/asc_intlv.md) | 将源操作数src0和src1中的元素交织存入目的操作数dst0和dst1中。 |
324+| [asc_le](reg/reg_vector/asc_le.md) | 对源操作数执行逐元素比较。对于src0 <= src1,若条件成立则目的操作数对应结果位为1,否则为0。 |
325+| [asc_le_scalar](reg/reg_vector/asc_le_scalar.md) | 对源操作数与标量执行逐元素比较。对于src0 <= value,若条件成立则目的操作数对应结果位为1,否则为0。 |
326+| [asc_ln](reg/reg_vector/asc_ln.md) | 计算自然对数。 |
327+| [asc_lt](reg/reg_vector/asc_lt.md) | 对源操作数执行逐元素比较。对于src0 < src1,若条件成立则目的操作数对应结果位为1,否则为0。 |
328+| [asc_lt_scalar](reg/reg_vector/asc_lt_scalar.md) | 对源操作数与标量执行逐元素比较。对于src0 < value,若条件成立则目的操作数对应结果位为1,否则为0。 |
329+| [asc_madd](reg/reg_vector/asc_madd.md) | madd(multiply-add),对源操作数执行逐元素乘法和加法。 |
330+| [asc_max](reg/reg_vector/asc_max.md) | 根据mask对源操作数src0、src1进行按元素求最大值操作,将结果写入目的操作数dst。 |
331+| [asc_max_scalar](reg/reg_vector/asc_max_scalar.md) | 矢量src的逐个元素与标量value比较大小,接着按照对应的比特位将最大值存入dst中。 |
332+| [asc_min](reg/reg_vector/asc_min.md) | 根据mask对源操作数src0、src1进行按元素求最小值操作,将结果写入目的操作数dst。 |
333+| [asc_min_scalar](reg/reg_vector/asc_min_scalar.md) | 矢量src的逐个元素与标量value比较大小,接着按照对应的比特位将最小值存入dst中。 |
334+| [asc_mull](reg/reg_vector/asc_mull.md) | 无符号整数乘法,将src0和src1对应元素相乘,结果写入dst。 |
335+| [asc_ne](reg/reg_vector/asc_ne.md) | 对源操作数执行逐元素比较。对于src0 != src1,若条件成立则目的操作数对应结果位为1,否则为0。 |
336+| [asc_neg](reg/reg_vector/asc_neg.md) | 根据mask对源操作数src进行取相反数操作,将结果写入目的操作数dst。 |
337+| [asc_ne_scalar](reg/reg_vector/asc_ne_scalar.md) | 对源操作数与标量执行逐元素比较。对于src0 != value,若条件成立则目的操作数对应结果位为1,否则为0。 |
338+| [asc_not](reg/reg_vector/asc_not.md) | 执行矢量非运算。 |
339+| [asc_pack](reg/reg_vector/asc_pack.md) | 将源操作数中的元素选取低8位(b16)、低16位(b32)、低32位(b64)写入目的操作数的低半部分或高半部分。 |
340+| [asc_pair_reduce_sum](reg/reg_vector/asc_pair_reduce_sum.md) | 相邻两个(奇偶)元素求和,结果写入dst。 |
341+| [asc_reduce_add](reg/reg_vector/asc_reduce_add.md) | 归约求和功能,用于将src中的所有参与计算的元素求和,得到的结果保存在dst中。 |
342+| [asc_reduce_add_datablock](reg/reg_vector/asc_reduce_add_datablock.md) | 归约求和功能,用于将src每个DataBlock(32B)中参与计算的元素求和,得到的结果依次保存在dst中。 |
343+| [asc_reduce_max](reg/reg_vector/asc_reduce_max.md) | 根据mask对源操作数src进行归约最大值操作,将结果写入目的操作数dst。 |
344+| [asc_reduce_min](reg/reg_vector/asc_reduce_min.md) | 根据mask对源操作数src进行归约最小值操作,将结果写入目的操作数dst。 |
345+| [asc_reduce_min_datablock](reg/reg_vector/asc_reduce_min_datablock.md) | 根据mask将每个DataBlock(32B)中的最小值,依次保存在dst中的最低位。 |
346+| [asc_shiftleft](reg/reg_vector/asc_shiftleft.md) | 根据掩码mask对输入数据src0,按照src1对应元素进行左移操作,完成后将结果写入dst中。 |
347+| [asc_shiftright](reg/reg_vector/asc_shiftright.md) | 根据掩码mask对输入数据src0,按照src1对应元素进行右移操作,完成后将结果写入dst中。 |
348+| [asc_squeeze](reg/reg_vector/asc_squeeze.md) | 将src中被mask选择的有效元素依次复制到dst,有效元素从低到高连续排列。 |
349+| [asc_uint162uint32](reg/reg_vector/asc_uint162uint32.md) | 将uint16_t数据类型的矢量逐元素转换为uint32_t类型。 |
350+| [asc_uint162uint8](reg/reg_vector/asc_uint162uint8.md) | 将uint16_t数据类型的矢量逐元素转换为uint8_t类型。 |
351+| [asc_uint322int16](reg/reg_vector/asc_uint322int16.md) | 将uint32_t数据类型的矢量逐元素转换为int16_t类型。 |
352+| [asc_uint322uint8](reg/reg_vector/asc_uint322uint8.md) | 将uint32_t数据类型的矢量逐元素转换为uint8_t类型。 |
353+| [asc_uint82half](reg/reg_vector/asc_uint82half.md) | 将uint8_t数据类型的矢量逐元素转换为half类型。 |
354+| [asc_uint82uint16](reg/reg_vector/asc_uint82uint16.md) | 将uint8_t数据类型的矢量逐元素转换为uint16_t类型。 |
355+| [asc_unpack](reg/reg_vector/asc_unpack.md) | 矢量解包操作。 |
356+| [asc_unsqueeze](reg/reg_vector/asc_unsqueeze.md) | 根据mask进行解压缩,将生成的数据输出到dst。 |
357+| [asc_update_mask](reg/reg_vector/asc_update_mask.md) | 根据value大小生成对应的掩码寄存器中的值。 |
358+ 
359+</cann-filter>
@@ -23,6 +23,8 @@ Scalar单元访问Global Memory,首先会访问每个核内的Data Cache,因
23读取Global Memory的数据,但该数据可能在外部被其余核修改,此时需要使用asc_dcci接口,直接访问Global Memory,获取最新数据;23读取Global Memory的数据,但该数据可能在外部被其余核修改,此时需要使用asc_dcci接口,直接访问Global Memory,获取最新数据;
24用户通过Scalar单元写Global Memory的数据,希望立刻写出,也需要使用asc_dcci接口。24用户通过Scalar单元写Global Memory的数据,希望立刻写出,也需要使用asc_dcci接口。
25 25 
26+Scalar单元访问UB数据时,该接口需配合[asc_set_ctrl()](../sys_var/asc_set_ctrl.md)接口使用,将CTRL[49]设置为1'b1,开启datacache模式。
27+ 
26## 函数原型28## 函数原型
27 29 
28 ```cpp30 ```cpp
@@ -4,9 +4,11 @@
4 4 
5| 产品 | 是否支持 |5| 产品 | 是否支持 |
6| :-----------| :------: |6| :-----------| :------: |
7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
7| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |8| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
8| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |9| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
9 10 
11+ 
10## 功能说明12## 功能说明
11 13 
12从指令所在DDR地址预加载数据到对应的cacheline中。14从指令所在DDR地址预加载数据到对应的cacheline中。
@@ -41,6 +43,6 @@ PIPE_S
41 43 
42```cpp44```cpp
43int64_t prefetch_length = 32;45int64_t prefetch_length = 32;
44-int64_t pc = asc_get_program_counter_impl() & 0xFFFFFFFFFFFF;46+int64_t pc = asc_get_program_counter() & 0xFFFFFFFFFFFF;
45asc_icache_preload(reinterpret_cast<void *>(pc), prefetch_length);47asc_icache_preload(reinterpret_cast<void *>(pc), prefetch_length);
46```48```
@@ -109,8 +109,8 @@ PIPE_MTE1
109```cpp109```cpp
110// 设置源操作数和目的操作数,total_length 指参与计算的数据长度110// 设置源操作数和目的操作数,total_length 指参与计算的数据长度
111constexpr uint64_t total_length = 512;111constexpr uint64_t total_length = 512;
112-__cbuf__ int16_t src[total_length];112+__cbuf__ int32_t src[total_length];
113-__cb__ int16_t dst[total_length];113+__cb__ int32_t dst[total_length];
114 114 
115// 设置搬运过程中的配置115// 设置搬运过程中的配置
116uint8_t n = 64;116uint8_t n = 64;
@@ -8,7 +8,7 @@
8 8 
9## 功能说明9## 功能说明
10 10 
11-对齐数据搬运接口,从UB连续对齐搬入目的操作数,支持多种搬入模式接口不传入偏移,需要由用户自行更新源操作数的地址。11+对齐数据搬运接口,从UB连续对齐搬入目的操作数,支持多种搬入模式接口不传入偏移,需要由用户自行更新源操作数的地址。
12 12 
13- NORM搬入模式:正常模式,搬运VL数据。13- NORM搬入模式:正常模式,搬运VL数据。
H
Hhorming2月10日

这个描述中,能否增加个 example 示例?

likedislike
guojianyang
guojianyang
2月10日 评论:
14- BRC搬入模式:搬运一个b8/b16/b32类型的数据,并Broadcast到所有元素位置。14- BRC搬入模式:搬运一个b8/b16/b32类型的数据,并Broadcast到所有元素位置。
@@ -4,11 +4,11 @@
4 4 
5| 产品 | 是否支持 |5| 产品 | 是否支持 |
6| :-----------------------| :-----:|6| :-----------------------| :-----:|
7-| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> </cann-filter>| √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8 8 
9## 功能说明9## 功能说明
10 10 
11-对齐数据搬运接口,从UB连续对齐搬入目的操作数,支持多种搬入模式接口通过地址寄存器传入偏移,用户可以选择更新偏移或者更新源操作数的地址。11+对齐数据搬运接口,从UB连续对齐搬入目的操作数,支持多种搬入模式接口通过地址寄存器传入偏移,用户可以选择更新偏移或者更新源操作数的地址。
12 12 
13- NORM搬入模式:正常模式,搬运VL数据。13- NORM搬入模式:正常模式,搬运VL数据。
14- BRC搬入模式:搬运一个b8/b16/b32类型的数据,并Broadcast到所有元素位置。14- BRC搬入模式:搬运一个b8/b16/b32类型的数据,并Broadcast到所有元素位置。
@@ -8,7 +8,7 @@
8 8 
9## 功能说明9## 功能说明
10 10 
11-对齐数据搬运接口,从UB连续对齐搬入目的操作数,支持多种搬入模式接口通过int32_t传入偏移,用户可以选择更新偏移或者更新源操作数的地址。11+对齐数据搬运接口,从UB连续对齐搬入目的操作数,支持多种搬入模式接口通过int32_t传入偏移,用户可以选择更新偏移或者更新源操作数的地址。
12 12 
13- NORM搬入模式:正常模式,搬运VL数据。13- NORM搬入模式:正常模式,搬运VL数据。
14- BRC搬入模式:搬运一个b8/b16/b32类型的数据,并Broadcast到所有元素位置。14- BRC搬入模式:搬运一个b8/b16/b32类型的数据,并Broadcast到所有元素位置。
@@ -8,7 +8,7 @@
8 8 
9## 功能说明9## 功能说明
10 10 
11-对齐数据搬运接口,从UB连续对齐搬入目的操作数,支持多种搬入模式接口通过int32_t传入偏移,同时设置成硬件自动Post Update,用户不用更新偏移或者更新源操作数的地址。11+对齐数据搬运接口,从UB连续对齐搬入目的操作数,支持多种搬入模式接口通过int32_t传入偏移,同时设置成硬件自动Post Update,用户不用更新偏移或者更新源操作数的地址。
12 12 
13- NORM搬入模式:正常模式,搬运VL数据。13- NORM搬入模式:正常模式,搬运VL数据。
14- BRC搬入模式:搬运一个b8/b16/b32类型的数据,并Broadcast到所有元素位置。14- BRC搬入模式:搬运一个b8/b16/b32类型的数据,并Broadcast到所有元素位置。
@@ -8,7 +8,7 @@
8 8 
9## 功能说明9## 功能说明
10 10 
11-对齐数据搬运接口,从UB连续对齐搬入目的操作数,支持多种搬入模式接口使用repeat stride模式。11+对齐数据搬运接口,从UB连续对齐搬入目的操作数,支持多种搬入模式接口使用repeat stride模式。
12 12 
13## 函数原型13## 函数原型
14 14 
@@ -0,0 +1,80 @@
1+# asc_store
2+ 
3+## 产品支持情况
4+ 
5+| 产品 | 是否支持 |
6+| :-----------------------| :-----:|
7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8+ 
9+## 功能说明
10+ 
11+reg计算数据搬运接口,适用于从矢量数据寄存器搬出到UB的场景,不区分是否对齐,在追求极致性能时,对齐场景推荐使用[asc_store_align](./asc_storealign)接口。
12+ 
13+## 函数原型
14+ 
15+```cpp
16+// 不传入count参数,默认搬运VL(Vector Length)长度的元素
17+__simd_callee__ inline void asc_store(__ubuf__ int8_t* dst, vector_int8_t src)
18+__simd_callee__ inline void asc_store(__ubuf__ uint8_t* dst, vector_uint8_t src)
19+__simd_callee__ inline void asc_store(__ubuf__ fp4x2_e2m1_t* dst, vector_fp4x2_e2m1_t src)
20+__simd_callee__ inline void asc_store(__ubuf__ fp4x2_e1m2_t* dst, vector_fp4x2_e1m2_t src)
21+__simd_callee__ inline void asc_store(__ubuf__ fp8_e8m0_t* dst, vector_fp8_e8m0_t src)
22+__simd_callee__ inline void asc_store(__ubuf__ fp8_e5m2_t* dst, vector_fp8_e5m2_t src)
23+__simd_callee__ inline void asc_store(__ubuf__ fp8_e4m3fn_t* dst, vector_fp8_e4m3fn_t src)
24+__simd_callee__ inline void asc_store(__ubuf__ int16_t* dst, vector_int16_t src)
25+__simd_callee__ inline void asc_store(__ubuf__ uint16_t* dst, vector_uint16_t src)
26+__simd_callee__ inline void asc_store(__ubuf__ half* dst, vector_half src)
27+__simd_callee__ inline void asc_store(__ubuf__ bfloat16_t* dst, vector_bfloat16_t src)
28+__simd_callee__ inline void asc_store(__ubuf__ int32_t* dst, vector_int32_t src)
29+__simd_callee__ inline void asc_store(__ubuf__ uint32_t* dst, vector_uint32_t src)
30+__simd_callee__ inline void asc_store(__ubuf__ float* dst, vector_float src)
31+__simd_callee__ inline void asc_store(__ubuf__ int64_t* dst, vector_int64_t src)
32+ 
33+// 传入count参数,搬运count个元素
34+__simd_callee__ inline void asc_store(__ubuf__ int8_t* dst, vector_int8_t src, uint32_t count)
35+__simd_callee__ inline void asc_store(__ubuf__ uint8_t* dst, vector_uint8_t src, uint32_t count)
36+__simd_callee__ inline void asc_store(__ubuf__ int16_t* dst, vector_int16_t src, uint32_t count)
37+__simd_callee__ inline void asc_store(__ubuf__ uint16_t* dst, vector_uint16_t src, uint32_t count)
38+__simd_callee__ inline void asc_store(__ubuf__ int32_t* dst, vector_int32_t src, uint32_t count)
39+__simd_callee__ inline void asc_store(__ubuf__ uint32_t* dst, vector_uint32_t src, uint32_t count)
40+__simd_callee__ inline void asc_store(__ubuf__ float* dst, vector_float src, uint32_t count)
41+__simd_callee__ inline void asc_store(__ubuf__ int64_t* dst, vector_int64_t src, uint32_t count)
42+__simd_callee__ inline void asc_store(__ubuf__ bfloat16_t* dst, vector_bfloat16_t src, uint32_t count)
43+__simd_callee__ inline void asc_store(__ubuf__ fp8_e8m0_t* dst, vector_fp8_e8m0_t src, uint32_t count)
44+__simd_callee__ inline void asc_store(__ubuf__ fp8_e5m2_t* dst, vector_fp8_e5m2_t src, uint32_t count)
45+__simd_callee__ inline void asc_store(__ubuf__ fp8_e4m3fn_t* dst, vector_fp8_e4m3fn_t src, uint32_t count)
46+__simd_callee__ inline void asc_store(__ubuf__ fp4x2_e2m1_t* dst, vector_fp4x2_e2m1_t src, uint32_t count)
47+__simd_callee__ inline void asc_store(__ubuf__ fp4x2_e1m2_t* dst, vector_fp4x2_e1m2_t src, uint32_t count)
48+```
49+ 
50+## 参数说明
51+ 
52+| 参数名 | 输入/输出 | 描述 |
53+| :----- | :------- | :------- |
54+| dst | 输出 | 目的操作数(矢量)的起始地址。 |
55+| src | 输入 | 源操作数(矢量数据寄存器)。 |
56+| count | 输入 | 搬运元素数量。 |
57+ 
58+矢量数据寄存器的详细说明请参见[reg数据类型定义.md](../reg数据类型定义.md)。
59+ 
60+## 返回值说明
61+ 
62+
63+ 
64+## 流水类型
65+ 
66+PIPE_V
67+ 
68+## 约束说明
69+ 
H
Hhorming2月10日

count的取值范围有约束吧,说明清楚 在什么范围内有效,在什么范围外是什么行为

likedislike
guojianyang
guojianyang
2月10日 评论:
70+- count的取值范围为[1, VL/sizeof(dst)],VL为矢量长度。超出该范围会导致未定义行为。
71+ 
72+## 调用示例
73+ 
74+```cpp
75+vector_half src;
76+__ubuf__ half* dst = (__ubuf__ half*)asc_get_phy_buf_addr(0);
H
Hhorming2月10日

这个示例,给src起码dup一下

likedislike
guojianyang
guojianyang
2月11日 评论:
77+asc_store(dst, src);
78+```
79+ 
80+ 
@@ -8,7 +8,7 @@
8 8 
9## 功能说明9## 功能说明
10 10 
11-reg计算数据搬运接口,适用于从矢量数据寄存器连续对齐搬出到UB的场景,并支持多种搬出模式接口不传入偏移,需要由用户自行更新目的操作数的地址。11+reg计算数据搬运接口,适用于从矢量数据寄存器连续对齐搬出到UB的场景,并支持多种搬出模式接口不传入偏移,需要由用户自行更新目的操作数的地址。
12 12 
13- NORM搬出模式:正常模式,搬运VL数据,支持数据类型为b8、b16、b32。13- NORM搬出模式:正常模式,搬运VL数据,支持数据类型为b8、b16、b32。
14- FIRST搬出模式:忽略mask,向dst_align32b中搬运src第一个元素,支持数据类型为b8、b16、b32。14- FIRST搬出模式:忽略mask,向dst_align32b中搬运src第一个元素,支持数据类型为b8、b16、b32。
@@ -8,7 +8,7 @@
8 8 
9## 功能说明9## 功能说明
10 10 
11-reg计算数据搬运接口,适用于从矢量数据寄存器连续对齐搬出到UB的场景,并支持多种搬出模式接口通过地址寄存器传入偏移,用户可以选择更新偏移或者更新目的操作数的地址。11+reg计算数据搬运接口,适用于从矢量数据寄存器连续对齐搬出到UB的场景,并支持多种搬出模式接口通过地址寄存器传入偏移,用户可以选择更新偏移或者更新目的操作数的地址。
12 12 
13- NORM搬出模式:正常模式,搬运VL数据,支持数据类型为b8、b16、b32。13- NORM搬出模式:正常模式,搬运VL数据,支持数据类型为b8、b16、b32。
14- FIRST搬出模式:忽略mask,向dst_align32b中搬运src第一个元素,支持数据类型为b8、b16、b32。14- FIRST搬出模式:忽略mask,向dst_align32b中搬运src第一个元素,支持数据类型为b8、b16、b32。
@@ -8,7 +8,7 @@
8 8 
9## 功能说明9## 功能说明
10 10 
11-reg计算数据搬运接口,适用于从矢量数据寄存器连续对齐搬出到UB的场景,并支持多种搬出模式接口通过int32_t传入偏移,用户可以选择更新偏移或者更新目的操作数的地址。11+reg计算数据搬运接口,适用于从矢量数据寄存器连续对齐搬出到UB的场景,并支持多种搬出模式接口通过int32_t传入偏移,用户可以选择更新偏移或者更新目的操作数的地址。
12 12 
13- NORM搬出模式:正常模式,搬运VL数据,支持数据类型为b8、b16、b32。13- NORM搬出模式:正常模式,搬运VL数据,支持数据类型为b8、b16、b32。
14- FIRST搬出模式:忽略mask,向dst_align32b中搬运src第一个元素,支持数据类型为b8、b16、b32。14- FIRST搬出模式:忽略mask,向dst_align32b中搬运src第一个元素,支持数据类型为b8、b16、b32。
@@ -8,7 +8,7 @@
8 8 
9## 功能说明9## 功能说明
10 10 
11-reg计算数据搬运接口,适用于从矢量数据寄存器连续对齐搬出到UB的场景,并支持多种搬出模式接口通过int32_t传入偏移,同时设置成硬件自动Post Update,用户不用更新偏移或者更新目的操作数的地址。11+reg计算数据搬运接口,适用于从矢量数据寄存器连续对齐搬出到UB的场景,并支持多种搬出模式接口通过int32_t传入偏移,同时设置成硬件自动Post Update,用户不用更新偏移或者更新目的操作数的地址。
12 12 
13- NORM搬出模式:正常模式,搬运VL数据,支持数据类型为b8、b16、b32。13- NORM搬出模式:正常模式,搬运VL数据,支持数据类型为b8、b16、b32。
14- FIRST搬出模式:忽略mask,向dst_align32b中搬运src第一个元素,支持数据类型为b8、b16、b32。14- FIRST搬出模式:忽略mask,向dst_align32b中搬运src第一个元素,支持数据类型为b8、b16、b32。
@@ -8,7 +8,7 @@
8 8 
9## 功能说明9## 功能说明
10 10 
11-reg计算数据搬运接口,适用于从矢量数据寄存器连续对齐搬出到UB的场景接口使用repeat stride模式。11+reg计算数据搬运接口,适用于从矢量数据寄存器连续对齐搬出到UB的场景接口使用repeat stride模式。
12 12 
13## 函数原型13## 函数原型
14 14 
@@ -1,15 +1,14 @@
1- 
2# asc_abs1# asc_abs
3 2 
4## 产品支持情况3## 产品支持情况
5 4 
6| 产品 | 是否支持 |5| 产品 | 是否支持 |
7| :-----------------------| :-----:|6| :-----------------------| :-----:|
8-| <term>Ascend 950PR/Ascend 950DT</term> | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
9 8 
10### 功能说明9### 功能说明
11 10 
12-按元素取绝对值,计算公式如下:11+按元素取绝对值,i为元素索引。计算公式如下:
13$$12$$
14dst_i = |src_i|13dst_i = |src_i|
15$$14$$
@@ -0,0 +1,71 @@
1+# asc_add
2+ 
3+## 产品支持情况
4+ 
5+| 产品 | 是否支持 |
6+| :-----------------------| :-----:|
7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8+ 
9+## 功能说明
10+ 
11+按照元素对应位置执行矢量加法运算,i为元素索引。计算过程为ZEROING模式(未被mask掩码的元素在目的操作数中中置0)。当输入src0和src1转换为uint32_t类型时,相加超出uint32_t的最大值时,执行带进位的加法运算,在dst的对应位置上,每4个比特位写入1,否则写入0。
12+ 
13+计算公式如下:
14+ 
15+$$
16+dst_i = src0_i + src1_i
17+$$
18+ 
19+## 函数原型
20+ 
21+```cpp
22+// 不带进位的矢量加法
23+__simd_callee__ inline void asc_add(vector_uint8_t& dst, vector_uint8_t src0, vector_uint8_t src1, vector_bool mask)
24+__simd_callee__ inline void asc_add(vector_int8_t& dst, vector_int8_t src0, vector_int8_t src1, vector_bool mask)
25+__simd_callee__ inline void asc_add(vector_uint16_t& dst, vector_uint16_t src0, vector_uint16_t src1, vector_bool mask)
26+__simd_callee__ inline void asc_add(vector_int16_t& dst, vector_int16_t src0, vector_int16_t src1, vector_bool mask)
27+__simd_callee__ inline void asc_add(vector_half& dst, vector_half src0, vector_half src1, vector_bool mask)
28+__simd_callee__ inline void asc_add(vector_float& dst, vector_float src0, vector_float src1, vector_bool mask)
29+__simd_callee__ inline void asc_add(vector_int32_t& dst, vector_int32_t src0, vector_int32_t src1, vector_bool mask)
30+__simd_callee__ inline void asc_add(vector_uint32_t& dst, vector_uint32_t src0, vector_uint32_t src1, vector_bool mask)
31+__simd_callee__ inline void asc_add(vector_bfloat16_t& dst, vector_bfloat16_t src0, vector_bfloat16_t src1, vector_bool mask)
32+// 带进位的矢量加法
33+__simd_callee__ inline void asc_add(vector_bool& dst0, vector_int32_t& dst1, vector_int32_t src0, vector_int32_t src1, vector_bool mask)
34+__simd_callee__ inline void asc_add(vector_bool& dst0, vector_uint32_t& dst1, vector_uint32_t src0, vector_uint32_t src1, vector_bool mask)
35+```
36+ 
37+## 参数说明
38+ 
39+| 参数名 | 输入/输出 | 描述 |
40+| :----- | :------- | :------- |
41+| dst| 输出 | 目的操作数(矢量数据寄存器)。 |
42+| dst0| 输出 | 目的操作数(掩码寄存器)。用来存储加法计算后的进位数据。 |
43+| dst1| 输出 | 目的操作数(矢量数据寄存器)。 |
44+| src0 | 输入 | 源操作数(矢量数据寄存器)。 |
45+| src1 | 输入 | 源操作数(矢量数据寄存器)。 |
46+| mask | 输入 | 源操作数掩码(掩码寄存器),用于指示在计算过程中哪些元素参与计算。对应位置为1时参与计算,为0时不参与计算。mask未筛选的元素在输出中置零。 |
47+ 
48+矢量数据寄存器和掩码寄存器的详细说明请参见[reg数据类型定义.md](../reg数据类型定义.md)。
49+ 
50+## 返回值说明
51+ 
52+
53+ 
54+## 流水类型
55+ 
56+PIPE_V
57+ 
58+## 约束说明
59+ 
60+- 带进位的加法运算仅支持int32_t和uint32_t类型。
61+- 带进位的加法运算需手动调用,接口内部不支持自动识别触发。
62+ 
63+## 调用示例
64+ 
65+```cpp
66+vector_half dst;
67+vector_half src0, src1;
68+half value;
69+vector_bool mask;
70+asc_add(dst, src0, src1, mask);
71+```
@@ -0,0 +1,60 @@
1+# asc_addc
2+ 
3+## 产品支持情况
4+ 
5+| 产品 | 是否支持 |
6+| :-----------------------| :-----:|
7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8+ 
9+## 功能说明
10+ 
11+基于掩码mask,对输入数据src0、src1及进位数据src2执行元素逐位相加操作,i为元素索引,相加结果写入dst1。若src0和src1的数据类型为uint32_t,且二者与进位值src2的累加结果超出uint32_t的最值时,在dst0的对应位置上,每4个比特位写入1,否则写入0。
12+ 
13+计算公式如下:
14+ 
15+$$
16+\{dst0_i, dst1_i\} = src0_i + src1_i + src2_i
17+$$
18+ 
19+## 函数原型
20+ 
21+```cpp
22+__simd_callee__ inline void asc_addc(vector_bool& dst0, vector_uint32_t& dst1, vector_uint32_t src0, vector_uint32_t src1, vector_bool src2, vector_bool mask)
23+__simd_callee__ inline void asc_addc(vector_bool& dst0, vector_int32& dst1, vector_int32 src0, vector_int32 src1, vector_bool src2, vector_bool mask)
24+```
25+ 
26+## 参数说明
27+ 
28+| 参数名 | 输入/输出 | 描述 |
29+| :----- | :------- | :------- |
30+| dst0 | 输出 | 目的操作数(掩码寄存器)。存储加法计算后的进位数据。 |
31+| dst1 | 输出 | 目的操作数(矢量数据寄存器)。 存储加法计算后的结果。|
32+| src0 | 输入 | 源操作数(矢量数据寄存器)。|
33+| src1 | 输入 | 源操作数(矢量数据寄存器)。|
34+| src2 | 输入 | 源操作数(掩码寄存器),进位数据。|
35+| mask | 输入 | 源操作数掩码(掩码寄存器),用于指示在计算过程中哪些元素参与计算。对应位置为1时参与计算,为0时不参与计算。mask未筛选的元素在输出中置零。 |
36+ 
37+矢量数据寄存器和掩码寄存器的详细说明请参见[reg数据类型定义.md](../reg数据类型定义.md)。
38+ 
39+## 返回值说明
40+ 
41+
42+ 
43+## 流水类型
44+ 
45+PIPE_V
46+ 
47+## 约束说明
48+ 
H
Hhorming2月10日

要说明dst的bit的有效位,可以连接到公共地方,

likedislike
guojianyang
guojianyang
2月10日 评论:
49+
50+ 
51+## 调用示例
52+ 
53+```cpp
54+vector_bool dst0;
55+vector_int32 dst1;
56+vector_int32 src0, src1;
57+vector_bool src2;
58+vector_bool mask;
59+asc_addc(dst0, dst1, src0, src1, src2, mask);
60+```
@@ -4,7 +4,7 @@
4 4 
5|产品|是否支持|5|产品|是否支持|
6| :------------ | :------------: |6| :------------ | :------------: |
7-| <term>Ascend 950PR/Ascend 950DT</term> | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8 8 
9## 功能说明9## 功能说明
10 10 
@@ -4,7 +4,7 @@
4 4 
5|产品|是否支持|5|产品|是否支持|
6| :------------ | :------------: |6| :------------ | :------------: |
7-| <term>Ascend 950PR/Ascend 950DT</term> | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8 8 
9## 功能说明9## 功能说明
10 10 
@@ -94,7 +94,7 @@ PIPE_V
94 94 
95## 约束说明95## 约束说明
96 96 
97-97+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
98 98 
99## 调用示例99## 调用示例
100 100 
@@ -4,7 +4,7 @@
4 4 
5|产品|是否支持|5|产品|是否支持|
6| :------------ | :------------: |6| :------------ | :------------: |
7-| <term>Ascend 950PR/Ascend 950DT</term> | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8 8 
9## 功能说明9## 功能说明
10 10 
@@ -5,7 +5,8 @@
5 5 
6| 产品 | 是否支持 |6| 产品 | 是否支持 |
7| :-----------------------| :-----:|7| :-----------------------| :-----:|
8-| Ascend 950PR/Ascend 950DT | √ |8+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
9+ 
9## 功能说明10## 功能说明
10 11 
11给定源操作数src0和src1,将src0和src1中的元素解交织存入结果操作数dst0和dst1中。操作数为掩码寄存器时,不同数据类型的接口决定了交织的位宽大小,例如int32_t(b32)类型,交织时以4bit为一组。12给定源操作数src0和src1,将src0和src1中的元素解交织存入结果操作数dst0和dst1中。操作数为掩码寄存器时,不同数据类型的接口决定了交织的位宽大小,例如int32_t(b32)类型,交织时以4bit为一组。
@@ -8,7 +8,7 @@
8 8 
9## 功能说明9## 功能说明
10 10 
11-将src0与src1相减,差值作为e的指数计算,计算公式如下:11+将src0与src1相减,差值作为e的指数计算,i为元素索引。计算公式如下:
12 12 
13- 当src0和src1为float类型时:13- 当src0和src1为float类型时:
14 14 
@@ -80,7 +80,7 @@ PIPE_V
80 80 
81## 约束说明81## 约束说明
82 82 
83-83+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
84 84 
85## 调用示例85## 调用示例
86 86 
@@ -65,7 +65,7 @@ PIPE_V
65 65 
66## 约束说明66## 约束说明
67 67 
68-68+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
69 69 
70## 调用示例70## 调用示例
71 71 
@@ -16,6 +16,15 @@
16- CEIL舍入模式:向正无穷舍入16- CEIL舍入模式:向正无穷舍入
17- TRUNC舍入模式:向零舍入17- TRUNC舍入模式:向零舍入
18 18 
19+- 非饱和模式:
20+ - 输入数据超过输出类型最值时,结果被截断为目标格式的数据宽度,例如输入half值为257,输出int8_t值为1。
21+ - 输入数据为+/-inf时,返回输出类型的最值。
22+ - 输入数据为nan时,返回0。
23+- 饱和模式:
24+ - 输入数据超过输出类型最值时,返回输出类型的对应最值,例如输入half值为257,输出int8_t值为127。
25+ - 输入数据为+/-inf时,返回输出类型的最值。
26+ - 输入数据为nan时,返回0。
27+ 
19## 函数原型28## 函数原型
20 29 
21```cpp30```cpp
@@ -121,14 +130,7 @@ PIPE_V
121 130 
122## 约束说明131## 约束说明
123 132 
124-- 非饱和模式133+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
125- - 输入数据超过输出类型最值时,结果被截断为目标格式的数据宽度,例如输入half值为257,输出int8_t值为1。
126- - 输入数据为+/-inf时,返回输出类型的最值。
127- - 输入数据为nan时,返回0。
128-- 饱和模式:
129- - 输入数据超过输出类型最值时,返回输出类型的对应最值,例如输入half值为257,输出int8_t值为127。
130- - 输入数据为+/-inf时,返回输出类型的最值。
131- - 输入数据为nan时,返回0。
132 134 
133## 调用示例135## 调用示例
134 136 
@@ -84,7 +84,7 @@ PIPE_V
84 84 
85## 约束说明85## 约束说明
86 86 
87-87+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
88 88 
89## 调用示例89## 调用示例
90 90 
@@ -94,7 +94,8 @@ PIPE_V
94 94 
95## 约束说明95## 约束说明
96 96 
97-97+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
98+ 
98## 调用示例99## 调用示例
99 100 
100```cpp101```cpp
@@ -70,7 +70,7 @@ PIPE_V
70 70 
71## 约束说明71## 约束说明
72 72 
73-73+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
74 74 
75## 调用示例75## 调用示例
76 76 
@@ -92,7 +92,7 @@ PIPE_V
92 92 
93## 约束说明93## 约束说明
94 94 
95-95+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
96 96 
97## 调用示例97## 调用示例
98 98 
@@ -4,7 +4,7 @@
4 4 
5|产品|是否支持|5|产品|是否支持|
6| :------------ | :------------: |6| :------------ | :------------: |
7-| <term>Ascend 950PR/Ascend 950DT</term> | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8 8 
9## 功能说明9## 功能说明
10 10 
@@ -4,11 +4,11 @@
4 4 
5| 产品 | 是否支持 |5| 产品 | 是否支持 |
6| :-----------------------| :-----:|6| :-----------------------| :-----:|
7-| Ascend 950PR/Ascend 950DT | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8 8 
9## 功能说明9## 功能说明
10 10 
11-ge(greater than or equal to),对源操作数执行逐元素比较。对于src0 >= src1,若条件成立则目的操作数对应结果位为1,否则为0,每个元素的比较结果占一个bit。11+ge(greater than or equal to),对源操作数执行逐元素比较。对于src0_i >= src1_i,若条件成立则目的操作数对应结果位为1,否则为0,每个元素的比较结果占一个bit。
12 12 
13计算公式如下:13计算公式如下:
14 14 
@@ -8,7 +8,7 @@
8 8 
9## 功能说明9## 功能说明
10 10 
11-ge(greater than or equal to),对源操作数执行逐元素比较。对于src >= value,若条件成立则目的操作数对应结果位为1,否则为0,每个元素的比较结果占一个bit。11+ge(greater than or equal to),对源操作数执行逐元素比较。对于src_i >= value,若条件成立则目的操作数对应结果位为1,否则为0,每个元素的比较结果占一个bit。
12 12 
13计算公式如下:13计算公式如下:
14$$14$$
@@ -8,7 +8,7 @@
8 8 
9## 功能说明9## 功能说明
10 10 
11-对源操作数执行逐元素比较。对于src0 > src1,若条件成立则目的操作数对应结果位为1,否则为0,每个元素的比较结果占一个bit。11+对源操作数执行逐元素比较。对于src0_i > src1_i,若条件成立则目的操作数对应结果位为1,否则为0,每个元素的比较结果占一个bit。
12 12 
13## 函数原型13## 函数原型
14 14 
@@ -8,7 +8,7 @@
8 8 
9## 功能说明9## 功能说明
10 10 
11-对源操作数执行逐元素比较。对于src0 > src1,若条件成立则目的操作数对应结果位为1,否则为0,每个元素的比较结果占一个bit。11+对源操作数执行逐元素比较。对于src0_i > value,若条件成立则目的操作数对应结果位为1,否则为0,每个元素的比较结果占一个bit。
12 12 
13## 函数原型13## 函数原型
14 14 
@@ -0,0 +1,64 @@
1+# asc_half2bfloat16
2+ 
3+## 产品支持情况
4+ 
5+|产品|是否支持|
6+| :------------ | :------------: |
7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8+ 
9+## 功能说明
10+ 
11+将half类型数据转为bfloat16类型,并支持多种舍入模式。
12+ 
13+- RINT舍入模式:四舍六入五成双舍入
14+- ROUND舍入模式:四舍五入舍入
15+- FLOOR舍入模式:向负无穷舍入
16+- CEIL舍入模式:向正无穷舍入
17+- TRUNC舍入模式:向零舍入
18+ 
19+## 函数原型
20+ 
21+```cpp
22+// FLOOR舍入模式
23+__simd_callee__ inline void asc_half2bfloat16_rd(vector_bfloat16_t& dst, vector_half src, vector_bool mask)
24+// RINT舍入模式
25+__simd_callee__ inline void asc_half2bfloat16_rn(vector_bfloat16_t& dst, vector_half src, vector_bool mask)
26+// ROUND舍入模式
27+__simd_callee__ inline void asc_half2bfloat16_rna(vector_bfloat16_t& dst, vector_half src, vector_bool mask)
28+// CEIL舍入模式
29+__simd_callee__ inline void asc_half2bfloat16_ru(vector_bfloat16_t& dst, vector_half src, vector_bool mask)
30+// TRUNC舍入模式
31+__simd_callee__ inline void asc_half2bfloat16_rz(vector_bfloat16_t& dst, vector_half src, vector_bool mask)
32+```
33+ 
34+## 参数说明
35+ 
36+|参数名|输入/输出|描述|
37+| ------------ | ------------ | ------------ |
38+|dst|输出|目的操作数(矢量数据寄存器)。|
39+|src|输入|源操作数(矢量数据寄存器)。|
40+|mask|输入|源操作数掩码(掩码寄存器),用于指示在计算过程中哪些元素参与计算。对应位置为1时参与计算,为0时不参与计算。mask未筛选的元素在输出中置零。|
41+ 
42+矢量数据寄存器和掩码寄存器的详细说明请参见[reg数据类型定义.md](../reg数据类型定义.md)。
43+ 
44+## 返回值说明
45+ 
46+
47+ 
48+## 流水类型
49+ 
50+PIPE_V
51+ 
52+## 约束说明
53+ 
54+
55+ 
56+## 调用示例
57+ 
58+```cpp
59+vector_half src;
60+vector_bfloat16_t dst;
61+vector_bool mask = asc_create_mask_b16(Pat::ALL);
62+asc_loadalign(src, src_addr); // src_addr是外部输入的UB内存空间地址。
63+asc_half2bfloat16_rna(dst, src, mask);
64+```
@@ -62,6 +62,7 @@ PIPE_V
62 - 输入数据超过输出类型最值时,返回输出类型的对应最值。62 - 输入数据超过输出类型最值时,返回输出类型的对应最值。
63 - 输入数据为+/-inf时, 返回输出类型的对应最值。63 - 输入数据为+/-inf时, 返回输出类型的对应最值。
64 - 输入数据为nan时,返回0。64 - 输入数据为nan时,返回0。
65+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
65 66 
66## 调用示例67## 调用示例
67 68 
@@ -4,7 +4,7 @@
4 4 
5|产品|是否支持|5|产品|是否支持|
6| :------------ | :------------: |6| :------------ | :------------: |
7-| <term>Ascend 950PR/Ascend 950DT</term> | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8 8 
9## 功能说明9## 功能说明
10 10 
@@ -72,7 +72,7 @@ PIPE_V
72 72 
73## 约束说明73## 约束说明
74 74 
75-75+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
76 76 
77## 调用示例77## 调用示例
78 78 
@@ -66,7 +66,7 @@ PIPE_V
66 66 
67## 约束说明67## 约束说明
68 68 
69-69+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
70 70 
71## 调用示例71## 调用示例
72 72 
@@ -0,0 +1,143 @@
1+# asc_half2int4x2
2+ 
3+## 产品支持情况
4+ 
5+|产品|是否支持|
6+| :------------ | :------------: |
7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8+ 
9+## 功能说明
10+ 
11+将half类型数据转为int4x2类型,并支持多种舍入模式。
12+ 
13+- RINT舍入模式:四舍六入五成双舍入
14+- ROUND舍入模式:四舍五入舍入
15+- FLOOR舍入模式:向负无穷舍入
16+- CEIL舍入模式:向正无穷舍入
17+- TRUNC舍入模式:向零舍入
18+ 
19+- 非饱和模式:
20+ - 输入数据超过输出类型最值时,返回输出类型的对应符号inf值。
21+ - 输入数据为+/-inf时, 返回+/-inf。
22+ - 输入数据为nan时,返回nan。
23+- 饱和模式:
24+ - 输入数据超过输出类型最值时,返回输出类型的对应最值。
25+ - 输入数据为+/-inf时, 返回输出类型的对应最值。
26+ - 输入数据为nan时,返回0。
27+ 
28+## 函数原型
29+ 
30+```cpp
31+// FLOOR舍入模式,非饱和模式,选取索引0的位置
32+__simd_callee__ inline void asc_half2int4x2_rd(vector_int4x2_t& dst, vector_half src, vector_bool mask)
33+// FLOOR舍入模式,非饱和模式,选取索引1的位置
34+__simd_callee__ inline void asc_half2int4x2_rd_v2(vector_int4x2_t& dst, vector_half src, vector_bool mask)
35+// FLOOR舍入模式,饱和模式,选取索引0的位置
36+__simd_callee__ inline void asc_half2int4x2_rd_sat(vector_int4x2_t& dst, vector_half src, vector_bool mask)
37+// FLOOR舍入模式,饱和模式,选取索引1的位置
38+__simd_callee__ inline void asc_half2int4x2_rd_sat_v2(vector_int4x2_t& dst, vector_half src, vector_bool mask)
39+// FLOOR舍入模式,非饱和模式,选取索引2的位置
40+__simd_callee__ inline void asc_half2int4x2_rd_v3(vector_int4x2_t& dst, vector_half src, vector_bool mask)
41+// FLOOR舍入模式,饱和模式,选取索引2的位置
42+__simd_callee__ inline void asc_half2int4x2_rd_sat_v3(vector_int4x2_t& dst, vector_half src, vector_bool mask)
43+// FLOOR舍入模式,非饱和模式,选取索引3的位置
44+__simd_callee__ inline void asc_half2int4x2_rd_v4(vector_int4x2_t& dst, vector_half src, vector_bool mask)
45+// FLOOR舍入模式,饱和模式,选取索引3的位置
46+__simd_callee__ inline void asc_half2int4x2_rd_sat_v4(vector_int4x2_t& dst, vector_half src, vector_bool mask)
47+// RINT舍入模式,非饱和模式,选取索引0的位置
48+__simd_callee__ inline void asc_half2int4x2_rn(vector_int4x2_t& dst, vector_half src, vector_bool mask)
49+// RINT舍入模式,非饱和模式,选取索引1的位置
50+__simd_callee__ inline void asc_half2int4x2_rn_v2(vector_int4x2_t& dst, vector_half src, vector_bool mask)
51+// RINT舍入模式,饱和模式,选取索引0的位置
52+__simd_callee__ inline void asc_half2int4x2_rn_sat(vector_int4x2_t& dst, vector_half src, vector_bool mask)
53+// RINT舍入模式,饱和模式,选取索引1的位置
54+__simd_callee__ inline void asc_half2int4x2_rn_sat_v2(vector_int4x2_t& dst, vector_half src, vector_bool mask)
55+// RINT舍入模式,非饱和模式,选取索引2的位置
56+__simd_callee__ inline void asc_half2int4x2_rn_v3(vector_int4x2_t& dst, vector_half src, vector_bool mask)
57+// RINT舍入模式,饱和模式,选取索引2的位置
58+__simd_callee__ inline void asc_half2int4x2_rn_sat_v3(vector_int4x2_t& dst, vector_half src, vector_bool mask)
59+// RINT舍入模式,非饱和模式,选取索引3的位置
60+__simd_callee__ inline void asc_half2int4x2_rn_v4(vector_int4x2_t& dst, vector_half src, vector_bool mask)
61+// RINT舍入模式,饱和模式,选取索引3的位置
62+__simd_callee__ inline void asc_half2int4x2_rn_sat_v4(vector_int4x2_t& dst, vector_half src, vector_bool mask)
63+// ROUND舍入模式,非饱和模式,选取索引0的位置
64+__simd_callee__ inline void asc_half2int4x2_rna(vector_int4x2_t& dst, vector_half src, vector_bool mask)
65+// ROUND舍入模式,非饱和模式,选取索引1的位置
66+__simd_callee__ inline void asc_half2int4x2_rna_v2(vector_int4x2_t& dst, vector_half src, vector_bool mask)
67+// ROUND舍入模式,饱和模式,选取索引0的位置
68+__simd_callee__ inline void asc_half2int4x2_rna_sat(vector_int4x2_t& dst, vector_half src, vector_bool mask)
69+// ROUND舍入模式,饱和模式,选取索引1的位置
70+__simd_callee__ inline void asc_half2int4x2_rna_sat_v2(vector_int4x2_t& dst, vector_half src, vector_bool mask)
71+// ROUND舍入模式,非饱和模式,选取索引2的位置
72+__simd_callee__ inline void asc_half2int4x2_rna_v3(vector_int4x2_t& dst, vector_half src, vector_bool mask)
73+// ROUND舍入模式,饱和模式,选取索引2的位置
74+__simd_callee__ inline void asc_half2int4x2_rna_sat_v3(vector_int4x2_t& dst, vector_half src, vector_bool mask)
75+// ROUND舍入模式,非饱和模式,选取索引3的位置
76+__simd_callee__ inline void asc_half2int4x2_rna_v4(vector_int4x2_t& dst, vector_half src, vector_bool mask)
77+// ROUND舍入模式,饱和模式,选取索引3的位置
78+__simd_callee__ inline void asc_half2int4x2_rna_sat_v4(vector_int4x2_t& dst, vector_half src, vector_bool mask)
79+// CEIL舍入模式,非饱和模式,选取索引0的位置
80+__simd_callee__ inline void asc_half2int4x2_ru(vector_int4x2_t& dst, vector_half src, vector_bool mask)
81+// CEIL舍入模式,非饱和模式,选取索引1的位置
82+__simd_callee__ inline void asc_half2int4x2_ru_v2(vector_int4x2_t& dst, vector_half src, vector_bool mask)
83+// CEIL舍入模式,饱和模式,选取索引0的位置
84+__simd_callee__ inline void asc_half2int4x2_ru_sat(vector_int4x2_t& dst, vector_half src, vector_bool mask)
85+// CEIL舍入模式,饱和模式,选取索引1的位置
86+__simd_callee__ inline void asc_half2int4x2_ru_sat_v2(vector_int4x2_t& dst, vector_half src, vector_bool mask)
87+// CEIL舍入模式,非饱和模式,选取索引2的位置
88+__simd_callee__ inline void asc_half2int4x2_ru_v3(vector_int4x2_t& dst, vector_half src, vector_bool mask)
89+// CEIL舍入模式,饱和模式,选取索引2的位置
90+__simd_callee__ inline void asc_half2int4x2_ru_sat_v3(vector_int4x2_t& dst, vector_half src, vector_bool mask)
91+// CEIL舍入模式,非饱和模式,选取索引3的位置
92+__simd_callee__ inline void asc_half2int4x2_ru_v4(vector_int4x2_t& dst, vector_half src, vector_bool mask)
93+// CEIL舍入模式,饱和模式,选取索引3的位置
94+__simd_callee__ inline void asc_half2int4x2_ru_sat_v4(vector_int4x2_t& dst, vector_half src, vector_bool mask)
95+// TRUNC舍入模式,非饱和模式,选取索引0的位置
96+__simd_callee__ inline void asc_half2int4x2_rz(vector_int4x2_t& dst, vector_half src, vector_bool mask)
97+// TRUNC舍入模式,非饱和模式,选取索引1的位置
98+__simd_callee__ inline void asc_half2int4x2_rz_v2(vector_int4x2_t& dst, vector_half src, vector_bool mask)
99+// TRUNC舍入模式,饱和模式,选取索引0的位置
100+__simd_callee__ inline void asc_half2int4x2_rz_sat(vector_int4x2_t& dst, vector_half src, vector_bool mask)
101+// TRUNC舍入模式,饱和模式,选取索引1的位置
102+__simd_callee__ inline void asc_half2int4x2_rz_sat_v2(vector_int4x2_t& dst, vector_half src, vector_bool mask)
103+// TRUNC舍入模式,非饱和模式,选取索引2的位置
104+__simd_callee__ inline void asc_half2int4x2_rz_v3(vector_int4x2_t& dst, vector_half src, vector_bool mask)
105+// TRUNC舍入模式,饱和模式,选取索引2的位置
106+__simd_callee__ inline void asc_half2int4x2_rz_sat_v3(vector_int4x2_t& dst, vector_half src, vector_bool mask)
107+// TRUNC舍入模式,非饱和模式,选取索引3的位置
108+__simd_callee__ inline void asc_half2int4x2_rz_v4(vector_int4x2_t& dst, vector_half src, vector_bool mask)
109+// TRUNC舍入模式,饱和模式,选取索引3的位置
110+__simd_callee__ inline void asc_half2int4x2_rz_sat_v4(vector_int4x2_t& dst, vector_half src, vector_bool mask)
111+```
112+ 
113+## 参数说明
114+ 
115+|参数名|输入/输出|描述|
116+| ------------ | ------------ | ------------ |
117+|dst|输出|目的操作数(矢量数据寄存器)。|
118+|src|输入|源操作数(矢量数据寄存器)。|
119+|mask|输入|源操作数掩码(掩码寄存器),用于指示在计算过程中哪些元素参与计算。对应位置为1时参与计算,为0时不参与计算。mask未筛选的元素在输出中置零。|
120+ 
121+矢量数据寄存器和掩码寄存器的详细说明请参见[reg数据类型定义.md](../reg数据类型定义.md)。
122+ 
123+## 返回值说明
124+ 
125+
126+ 
127+## 流水类型
128+ 
129+PIPE_V
130+ 
131+## 约束说明
132+ 
H
Hhorming2月10日

对于宽转窄,和窄转宽的数据类型,要说明清楚 有效元素在寄存器中的位置,以及mask生效的位置。 所有转换的都是这个

likedislike
guojianyang
guojianyang
2月10日 评论:
133+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
134+ 
135+## 调用示例
136+ 
137+```cpp
138+vector_half src;
139+vector_int4x2_t dst;
140+vector_bool mask = asc_create_mask_b16(Pat::ALL);
141+asc_loadalign(src, src_addr); // src_addr是外部输入的UB内存空间地址。
142+asc_half2int4x2_rna(dst, src, mask);
143+```
@@ -16,6 +16,15 @@
16- CEIL舍入模式:向正无穷舍入16- CEIL舍入模式:向正无穷舍入
17- TRUNC舍入模式:向零舍入17- TRUNC舍入模式:向零舍入
18 18 
19+- 非饱和模式:
20+ - 输入数据超过输出类型最值时,结果被截断为目标格式的数据宽度,例如输入half值为257,输出int8_t值为1。
21+ - 输入数据为+/-inf时, 返回输出类型的最值。
22+ - 输入数据为nan时,返回0。
23+- 饱和模式:
24+ - 输入数据超过输出类型最值时,返回输出类型的对应最值,例如输入half值为257,输出int8_t值为127。
25+ - 输入数据为+/-inf时, 返回输出类型的最值。
26+ - 输入数据为nan时,返回0。
27+ 
19## 函数原型28## 函数原型
20 29 
21```cpp30```cpp
@@ -81,14 +90,7 @@ PIPE_V
81 90 
82## 约束说明91## 约束说明
83 92 
84-- 非饱和模式93+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
85- - 输入数据超过输出类型最值时,结果被截断为目标格式的数据宽度,例如输入half值为257,输出int8_t值为1。
86- - 输入数据为+/-inf时, 返回输出类型的最值。
87- - 输入数据为nan时,返回0。
88-- 饱和模式:
89- - 输入数据超过输出类型最值时,返回输出类型的对应最值,例如输入half值为257,输出int8_t值为127。
90- - 输入数据为+/-inf时, 返回输出类型的最值。
91- - 输入数据为nan时,返回0。
92 94 
93## 调用示例95## 调用示例
94 96 
@@ -16,6 +16,15 @@
16- CEIL舍入模式:向正无穷舍入16- CEIL舍入模式:向正无穷舍入
17- TRUNC舍入模式:向零舍入17- TRUNC舍入模式:向零舍入
18 18 
19+- 非饱和模式:
20+ - 输入数据超过输出类型最值时,返回输出类型的对应符号inf值。
21+ - 输入数据为+/-inf时, 返回+/-inf。
22+ - 输入数据为nan时,返回nan。
23+- 饱和模式:
24+ - 输入数据超过输出类型最值时,返回输出类型的对应最值。
25+ - 输入数据为+/-inf时, 返回输出类型的对应最值。
26+ - 输入数据为nan时,返回0。
27+ 
19## 函数原型28## 函数原型
20 29 
21```cpp30```cpp
@@ -81,14 +90,7 @@ PIPE_V
81 90 
82## 约束说明91## 约束说明
83 92 
84-- 非饱和模式93+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
85- - 输入数据超过输出类型最值时,结果被截断为目标格式的数据宽度,例如输入half值为257,输出int8_t值为1。
86- - 输入数据为+/-inf时,返回输出类型的最值。
87- - 输入数据为nan时,返回0。
88-- 饱和模式:
89- - 输入数据超过输出类型最值时,返回输出类型的对应最值,例如输入half值为257,输出int8_t值为127。
90- - 输入数据为+/-inf时,返回输出类型的最值。
91- - 输入数据为nan时,返回0。
92 94 
93## 调用示例95## 调用示例
94 96 
@@ -4,7 +4,7 @@
4 4 
5|产品|是否支持|5|产品|是否支持|
6| :------------ | :------------: |6| :------------ | :------------: |
7-| <term>Ascend 950PR/Ascend 950DT</term> | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8 8 
9## 功能说明9## 功能说明
10 10 
@@ -4,7 +4,7 @@
4 4 
5|产品|是否支持|5|产品|是否支持|
6| :------------ | :------------: |6| :------------ | :------------: |
7-| <term>Ascend 950PR/Ascend 950DT</term> | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8 8 
9## 功能说明9## 功能说明
10 10 
@@ -47,7 +47,7 @@ PIPE_V
47 47 
48## 约束说明48## 约束说明
49 49 
50-50+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
51 51 
52## 调用示例52## 调用示例
53 53 
@@ -4,7 +4,7 @@
4 4 
5|产品|是否支持|5|产品|是否支持|
6| :------------ | :------------: |6| :------------ | :------------: |
7-| <term>Ascend 950PR/Ascend 950DT</term> | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8 8 
9## 功能说明9## 功能说明
10 10 
@@ -63,7 +63,7 @@ PIPE_V
63 63 
64## 约束说明64## 约束说明
65 65 
66-66+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
67 67 
68## 调用示例68## 调用示例
69 69 
@@ -47,7 +47,7 @@ PIPE_V
47 47 
48## 约束说明48## 约束说明
49 49 
50-50+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
51 51 
52## 调用示例52## 调用示例
53 53 
@@ -4,7 +4,7 @@
4 4 
5|产品|是否支持|5|产品|是否支持|
6| :------------ | :------------: |6| :------------ | :------------: |
7-| <term>Ascend 950PR/Ascend 950DT</term> | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8 8 
9## 功能说明9## 功能说明
10 10 
@@ -4,7 +4,7 @@
4 4 
5|产品|是否支持|5|产品|是否支持|
6| :------------ | :------------: |6| :------------ | :------------: |
7-| <term>Ascend 950PR/Ascend 950DT</term> | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8 8 
9## 功能说明9## 功能说明
10 10 
@@ -4,11 +4,11 @@
4 4 
5|产品|是否支持|5|产品|是否支持|
6| :------------ | :------------: |6| :------------ | :------------: |
7-| <term>Ascend 950PR/Ascend 950DT</term> | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8 8 
9## 功能说明9## 功能说明
10 10 
11-按元素判断src0 <= src1是否成立,若成立则输出结果为1,否则为0。11+按元素判断src0_i <= src1_i是否成立,若成立则输出结果为1,否则为0。
12 12 
13## 函数原型13## 函数原型
14 14 
@@ -4,11 +4,11 @@
4 4 
5|产品|是否支持|5|产品|是否支持|
6| :------------ | :------------: |6| :------------ | :------------: |
7-| <term>Ascend 950PR/Ascend 950DT</term> | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8 8 
9## 功能说明9## 功能说明
10 10 
11-按元素判断src <= value是否成立,若成立则输出结果为1,否则为0。11+按元素判断src_i <= value是否成立,若成立则输出结果为1,否则为0。
12 12 
13## 函数原型13## 函数原型
14 14 
@@ -5,7 +5,7 @@
5 5 
6| 产品 | 是否支持 |6| 产品 | 是否支持 |
7| :-----------------------| :-----:|7| :-----------------------| :-----:|
8-| Ascend 950PR/Ascend 950DT | √ |8+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
9 9 
10## 功能说明10## 功能说明
11 11 
@@ -0,0 +1,60 @@
1+# asc_lt
2+ 
3+## 产品支持情况
4+ 
5+| 产品 | 是否支持 |
6+| :-----------------------| :-----:|
7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8+ 
9+## 功能说明
10+ 
11+lt(less than),对源操作数执行逐元素比较。对于src0_i < src1_i,若条件成立则目的操作数对应结果位为1,否则为0,每个元素的比较结果占一个bit。
12+ 
13+## 函数原型
14+ 
15+```cpp
16+__simd_callee__ inline void asc_lt(vector_bool& dst, vector_uint8_t src0, vector_uint8_t src1, vector_bool mask)
17+__simd_callee__ inline void asc_lt(vector_bool& dst, vector_int8_t src0, vector_int8_t src1, vector_bool mask)
18+__simd_callee__ inline void asc_lt(vector_bool& dst, vector_half src0, vector_half src1, vector_bool mask)
19+__simd_callee__ inline void asc_lt(vector_bool& dst, vector_uint16_t src0, vector_uint16_t src1, vector_bool mask)
20+__simd_callee__ inline void asc_lt(vector_bool& dst, vector_int16_t src0, vector_int16_t src1, vector_bool mask)
21+__simd_callee__ inline void asc_lt(vector_bool& dst, vector_bfloat16_t src0, vector_bfloat16_t src1, vector_bool mask)
22+__simd_callee__ inline void asc_lt(vector_bool& dst, vector_float src0, vector_float src1, vector_bool mask)
23+__simd_callee__ inline void asc_lt(vector_bool& dst, vector_uint32_t src0, vector_uint32_t src1, vector_bool mask)
24+__simd_callee__ inline void asc_lt(vector_bool& dst, vector_int32 src0, vector_int32 src1, vector_bool mask)
25+```
26+ 
27+## 参数说明
28+ 
29+| 参数名 | 输入/输出 | 描述 |
30+| :----- | :------- | :------- |
31+| dst | 输出 | 目的操作数(掩码寄存器)。|
32+| src0 | 输入 | 源操作数(矢量数据寄存器)。|
33+| src1 | 输入 | 源操作数(矢量数据寄存器)。|
34+| mask | 输入 | 源操作数掩码(掩码寄存器),用于指示在计算过程中哪些元素参与计算。对应位置为1时参与计算,为0时不参与计算。mask未筛选的元素在输出中置零。 |
35+ 
36+矢量数据寄存器和掩码寄存器的详细说明请参见[reg数据类型定义.md](../reg数据类型定义.md)。
37+ 
38+## 返回值说明
39+ 
40+
41+ 
42+## 流水类型
43+ 
44+PIPE_V
45+ 
46+## 约束说明
47+ 
48+
49+ 
50+## 调用示例
51+ 
52+```cpp
53+vector_bool dst;
54+vector_half src0;
55+vector_half src1;
56+vector_bool mask = asc_create_mask_b16(Pat::ALL);
57+asc_loadalign(src0, src0_addr); // src0_addr是外部输入的UB内存空间地址。
58+asc_loadalign(src1, src1_addr); // src1_addr是外部输入的UB内存空间地址。
59+asc_lt(dst, src0, src1, mask);
60+```
@@ -0,0 +1,60 @@
1+# asc_lt_scalar
2+ 
3+## 产品支持情况
4+ 
5+| 产品 | 是否支持 |
6+| :-----------------------| :-----:|
7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8+ 
9+## 功能说明
10+ 
11+lt(less than),对源操作数执行逐元素比较。对于src_i < value,若条件成立则目的操作数对应结果位为1,否则为0,每个元素的比较结果占一个bit。
12+ 
13+## 函数原型
14+ 
15+```cpp
16+__simd_callee__ inline void asc_lt_scalar(vector_bool& dst, vector_uint8_t src, uint8_t value, vector_bool mask)
17+__simd_callee__ inline void asc_lt_scalar(vector_bool& dst, vector_int8_t src, int8_t value, vector_bool mask)
18+__simd_callee__ inline void asc_lt_scalar(vector_bool& dst, vector_half src, half value, vector_bool mask)
19+__simd_callee__ inline void asc_lt_scalar(vector_bool& dst, vector_uint16_t src, uint16_t value, vector_bool mask)
20+__simd_callee__ inline void asc_lt_scalar(vector_bool& dst, vector_int16_t src, int16_t value, vector_bool mask)
21+__simd_callee__ inline void asc_lt_scalar(vector_bool& dst, vector_bfloat16_t src, bfloat16_t value, vector_bool mask)
22+__simd_callee__ inline void asc_lt_scalar(vector_bool& dst, vector_float src, float value, vector_bool mask)
23+__simd_callee__ inline void asc_lt_scalar(vector_bool& dst, vector_uint32_t src, uint32_t value, vector_bool mask)
24+__simd_callee__ inline void asc_lt_scalar(vector_bool& dst, vector_int32_t src, int32_t value, vector_bool mask)
25+```
26+ 
27+## 参数说明
28+ 
29+| 参数名 | 输入/输出 | 描述 |
30+| :----- | :------- | :------- |
31+| dst | 输出 | 目的操作数(矢量数据寄存器)。|
32+| src | 输入 | 源操作数(矢量数据寄存器)。|
33+| value | 输入 | 源操作数(标量)。|
34+| mask | 输入 | 源操作数掩码(掩码寄存器),用于指示在计算过程中哪些元素参与计算。对应位置为1时参与计算,为0时不参与计算。mask未筛选的元素在输出中置零。 |
35+ 
36+矢量数据寄存器和掩码寄存器的详细说明请参见[reg数据类型定义.md](../reg数据类型定义.md)。
37+ 
38+## 返回值说明
39+ 
40+
41+ 
42+## 流水类型
43+ 
44+PIPE_V
45+ 
46+## 约束说明
47+ 
48+
49+ 
50+## 调用示例
51+ 
52+```cpp
53+vector_bool dst;
54+vector_half src0;
55+half value = 0.0;
56+vector_bool mask = asc_create_mask_b16(Pat::ALL);
57+asc_loadalign(src0, src0_addr); // src0_addr是外部输入的UB内存空间地址。
58+asc_loadalign(src1, src1_addr); // src1_addr是外部输入的UB内存空间地址。
59+asc_lt_scalar(dst, src0, value, mask);
60+```
@@ -0,0 +1,57 @@
1+# asc_madd
2+ 
3+## 产品支持情况
4+ 
5+| 产品 | 是否支持 |
6+| :-----------------------| :-----:|
7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8+ 
9+## 功能说明
10+ 
11+madd(multiply-add),对源操作数执行逐元素乘法和加法。计算公式如下:
12+ 
13+$$
14+dst_i = src0_i \times src1_i + dst_i
15+$$
16+ 
17+## 函数原型
18+ 
19+```cpp
20+__simd_callee__ inline void asc_madd(vector_bool& dst, vector_half src0, vector_half src1, vector_bool mask)
21+__simd_callee__ inline void asc_madd(vector_bool& dst, vector_float src0, vector_float src1, vector_bool mask)
22+```
23+ 
24+## 参数说明
25+ 
26+| 参数名 | 输入/输出 | 描述 |
27+| :----- | :------- | :------- |
28+| dst | 输出 | 目的操作数(矢量数据寄存器)。|
29+| src0 | 输入 | 源操作数(矢量数据寄存器)。|
30+| src1 | 输入 | 源操作数(矢量数据寄存器)。|
31+| mask | 输入 | 源操作数掩码(掩码寄存器),用于指示在计算过程中哪些元素参与计算。对应位置为1时参与计算,为0时不参与计算。mask未筛选的元素在输出中置零。 |
32+ 
33+矢量数据寄存器和掩码寄存器的详细说明请参见[reg数据类型定义.md](../reg数据类型定义.md)。
34+ 
35+## 返回值说明
36+ 
37+
38+ 
39+## 流水类型
40+ 
41+PIPE_V
42+ 
43+## 约束说明
44+ 
45+
46+ 
47+## 调用示例
48+ 
49+```cpp
50+vector_bool dst;
51+vector_half src0;
52+vector_half src1;
53+vector_bool mask = asc_create_mask_b16(Pat::ALL);
54+asc_loadalign(src0, src0_addr); // src0_addr是外部输入的UB内存空间地址。
55+asc_loadalign(src1, src1_addr); // src1_addr是外部输入的UB内存空间地址。
56+asc_madd(dst, src0, src1, mask);
57+```
@@ -1,11 +1,10 @@
1- 
2# asc_mull1# asc_mull
3 2 
4## 产品支持情况3## 产品支持情况
5 4 
6| 产品 | 是否支持 |5| 产品 | 是否支持 |
7| :-----------------------| :-----:|6| :-----------------------| :-----:|
8-| <term>Ascend 950PR/Ascend 950DT</term> | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
9 8 
10### 功能说明9### 功能说明
11 10 
@@ -4,11 +4,11 @@
4 4 
5|产品|是否支持|5|产品|是否支持|
6| :------------ | :------------: |6| :------------ | :------------: |
7-| Ascend 950PR/Ascend 950DT | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8 8 
9## 功能说明9## 功能说明
10 10 
11-按元素判断src0 != src1是否成立,若成立则输出结果为1,否则为0。每个元素的比较结果占1个bit。11+按元素判断src0_i != src1_i是否成立,若成立则输出结果为1,否则为0。每个元素的比较结果占1个bit。
12 12 
13## 函数原型13## 函数原型
14 14 
@@ -8,7 +8,7 @@
8 8 
9## 功能说明9## 功能说明
10 10 
11-src中的每个元素逐个与标量value比较大小,如果某个位置上的元素不等于value,则输出结果dst对应比特位为1,否则为0。11+src中的每个元素逐个与标量value比较大小,如果src_i != value,则输出结果dst对应比特位为1,否则为0。
12 12 
13## 函数原型13## 函数原型
14 14 
@@ -0,0 +1,62 @@
1+# asc_not
2+ 
3+## 产品支持情况
4+ 
5+| 产品 | 是否支持 |
6+| ----------- |:----:|
7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8+ 
9+## 功能说明
10+ 
11+执行矢量非运算。计算公式如下:
12+ 
13+$$
14+dst_i = \sim src0_i
15+$$
16+ 
17+## 函数原型
18+ 
19+```c++
20+__simd_callee__ inline void asc_not_(vector_bool& dst, vector_int32_t src0, vector_int32_t src1, vector_bool mask)
21+__simd_callee__ inline void asc_not_(vector_uint8_t& dst, vector_uint8_t src0, vector_uint8_t src1, vector_bool mask)
22+__simd_callee__ inline void asc_not_(vector_int8_t& dst, vector_int8_t src0, vector_int8_t src1, vector_bool mask)
23+__simd_callee__ inline void asc_not_(vector_uint16_t& dst, vector_uint16_t src0, vector_uint16_t src1, vector_bool mask)
24+__simd_callee__ inline void asc_not_(vector_int16_t& dst, vector_int16_t src0, vector_int16_t src1, vector_bool mask)
25+__simd_callee__ inline void asc_not_(vector_half& dst, vector_half src0, vector_half src1, vector_bool mask)
26+__simd_callee__ inline void asc_not_(vector_float& dst, vector_float src0, vector_float src1, vector_bool mask)
27+__simd_callee__ inline void asc_not_(vector_int32_t& dst, vector_int32_t src0, vector_int32_t src1, vector_bool mask)
28+__simd_callee__ inline void asc_not_(vector_uint32_t& dst, vector_uint32_t src0, vector_uint32_t src1, vector_bool mask)
29+```
30+ 
31+## 参数说明
32+ 
33+ 
34+| 参数名 | 输入/输出 | 描述 |
35+| --------- | ----- | ----------------- |
36+| dst | 输出 | 目的操作数(矢量数据寄存器)。 |
37+| src0、src1 | 输入 | 源操作数(矢量数据寄存器)。 |
38+| mask | 输入 | 源操作数掩码(掩码寄存器),用于指示在计算过程中哪些元素参与计算。对应位置为1时参与计算,为0时不参与计算。mask未筛选的元素在输出中置零。 |
39+ 
40+矢量数据寄存器和掩码寄存器的详细说明请参见[reg数据类型定义.md](../reg数据类型定义.md)。
41+ 
42+## 返回值说明
43+ 
44+
45+ 
46+## 流水类型
47+ 
48+PIPE_V
49+ 
50+## 约束说明
51+ 
52+
53+ 
54+## 调用示例
55+ 
56+```c++
57+vector_half dst;
58+vector_half src0, src1;
59+half value;
60+vector_bool mask;
61+asc_not(dst, src0, mask);
62+```
@@ -0,0 +1,49 @@
1+# asc_pair_reduce_sum
2+ 
3+## 产品支持情况
4+ 
5+| 产品 | 是否支持 |
6+| ----------- |:----:|
7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8+ 
9+## 功能说明
10+ 
11+PairReduceSum: 相邻两个(奇偶)元素求和,结果写入dst。例如:src={1,2,3,4},则dst={3,7}。
12+ 
13+## 函数原型
14+ 
15+```cpp
16+__simd_callee__ inline void asc_pair_reduce_sum(vector_half& dst, vector_half src, vector_bool mask)
17+__simd_callee__ inline void asc_pair_reduce_sum(vector_float& dst, vector_float src, vector_bool mask)
18+```
19+ 
20+## 参数说明
21+ 
22+| 参数名 | 输入/输出 | 描述 |
23+| --------- | ----- | ----------------- |
24+| dst | 输出 | 目的操作数(矢量数据寄存器)。 |
25+| src | 输入 | 源操作数(矢量数据寄存器)。 |
26+| mask | 输入 | 源操作数掩码(掩码寄存器),用于指示在计算过程中哪些元素参与计算。对应位置为1时参与计算,为0时不参与计算。mask未筛选的元素在输出中置零。 |
27+ 
28+矢量数据寄存器和掩码寄存器的详细说明请参见[reg数据类型定义.md](../reg数据类型定义.md)。
29+ 
30+## 返回值说明
31+ 
32+
33+ 
34+## 流水类型
35+ 
36+PIPE_V
37+ 
38+## 约束说明
39+ 
H
Hhorming2月10日

说明,如果mask是奇数位生效时,结果咋样

likedislike
guojianyang
guojianyang
2月10日 评论:
40+- 当mask为奇数时,最后被mask筛选的元素保持原值输出在dst的低位位置。
41+ 
42+## 调用示例
43+ 
44+```c++
45+vector_half dst;
46+vector_half src;
47+vector_bool mask;
48+asc_pair_reduce_sum(dst, src, mask);
49+```
@@ -0,0 +1,57 @@
1+# asc_shiftleft
2+ 
3+## 产品支持情况
4+ 
5+| 产品 | 是否支持 |
6+| :-----------------------| :-----:|
7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8+ 
9+## 功能说明
10+ 
11+根据掩码mask对输入数据src0,按照src1对应元素进行左移操作,完成后将结果写入dst中。
12+ 
13+## 函数原型
14+ 
15+```cpp
16+__simd_callee__ inline void asc_shiftleft(vector_uint8_t& dst, vector_uint8_t src0, vector_int8 src1, vector_bool mask)
17+__simd_callee__ inline void asc_shiftleft(vector_int8& dst, vector_int8 src0, vector_int8 src1, vector_bool mask)
18+__simd_callee__ inline void asc_shiftleft(vector_uint16_t& dst, vector_uint16_t src0, vector_int16 src1, vector_bool mask)
19+__simd_callee__ inline void asc_shiftleft(vector_int16& dst, vector_int16 src0, vector_int16 src1, vector_bool mask)
20+__simd_callee__ inline void asc_shiftleft(vector_uint32_t& dst, vector_uint32_t src0, vector_int32 src1, vector_bool mask)
21+__simd_callee__ inline void asc_shiftleft(vector_int32& dst, vector_int32 src0, vector_int32 src1, vector_bool mask)
22+```
23+ 
24+## 参数说明
25+ 
26+| 参数名 | 输入/输出 | 描述 |
27+| :----- | :------- | :------- |
28+| dst | 输出 | 目的操作数(矢量数据寄存器)。|
29+| src0 | 输入 | 源操作数(矢量数据寄存器)。|
30+| src1 | 输入 | 源操作数(矢量数据寄存器)。|
31+| mask | 输入 | 源操作数掩码(掩码寄存器),用于指示在计算过程中哪些元素参与计算。对应位置为1时参与计算,为0时不参与计算。mask未筛选的元素在输出中置零。 |
32+ 
33+矢量数据寄存器和掩码寄存器的详细说明请参见[reg数据类型定义.md](../reg数据类型定义.md)。
34+ 
35+## 返回值说明
36+ 
37+
38+ 
39+## 流水类型
40+ 
41+PIPE_V
42+ 
43+## 约束说明
44+ 
45+- 数据类型为无符号类型:执行逻辑右移。逻辑右移会将二进制数整体向右移动指定的位数,最低位被丢弃,最高位用0填充。
46+- 数据类型为有符号类型:执行算术右移。算术右移会将二进制数整体向右移动指定的位数,最低位被丢弃,最高位用原符号位填充。
47+ 
48+## 调用示例
49+ 
50+```cpp
51+vector_uint32_t dst;
52+vector_uint32_t src0, src1;
53+vector_bool mask = asc_create_mask_b16(Pat::ALL);
54+asc_loadalign(src0, src0_addr); // src0_addr是外部输入的UB内存空间地址。
55+asc_loadalign(src1, src1_addr); // src1_addr是外部输入的UB内存空间地址。
56+asc_shiftleft(dst, src0, src1, mask);
57+```
@@ -49,7 +49,7 @@ PIPE_V
49 49 
50## 约束说明50## 约束说明
51 51 
52-value不支持设置为负数。52+- value不支持设置为负数。
53 53 
54## 调用示例54## 调用示例
55 55 
@@ -0,0 +1,57 @@
1+# asc_shiftright
2+ 
3+## 产品支持情况
4+ 
5+| 产品 | 是否支持 |
6+| :-----------------------| :-----:|
7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8+ 
9+## 功能说明
10+ 
11+根据掩码mask对输入数据src0,按照src1对应元素进行右移操作,完成后将结果写入dst中。
12+ 
13+## 函数原型
14+ 
15+```cpp
16+__simd_callee__ inline void asc_shiftright(vector_uint8_t& dst, vector_uint8_t src0, vector_int8 src1, vector_bool mask)
17+__simd_callee__ inline void asc_shiftright(vector_int8& dst, vector_int8 src0, vector_int8 src1, vector_bool mask)
18+__simd_callee__ inline void asc_shiftright(vector_uint16_t& dst, vector_uint16_t src0, vector_int16 src1, vector_bool mask)
19+__simd_callee__ inline void asc_shiftright(vector_int16& dst, vector_int16 src0, vector_int16 src1, vector_bool mask)
20+__simd_callee__ inline void asc_shiftright(vector_uint32_t& dst, vector_uint32_t src0, vector_int32 src1, vector_bool mask)
21+__simd_callee__ inline void asc_shiftright(vector_int32& dst, vector_int32 src0, vector_int32 src1, vector_bool mask)
22+```
23+ 
24+## 参数说明
25+ 
26+| 参数名 | 输入/输出 | 描述 |
27+| :----- | :------- | :------- |
28+| dst | 输出 | 目的操作数(矢量数据寄存器)。|
29+| src0 | 输入 | 源操作数(矢量数据寄存器)。|
30+| src1 | 输入 | 源操作数(矢量数据寄存器)。|
31+| mask | 输入 | 源操作数掩码(掩码寄存器),用于指示在计算过程中哪些元素参与计算。对应位置为1时参与计算,为0时不参与计算。mask未筛选的元素在输出中置零。 |
32+ 
33+矢量数据寄存器和掩码寄存器的详细说明请参见[reg数据类型定义.md](../reg数据类型定义.md)。
34+ 
35+## 返回值说明
36+ 
37+
38+ 
39+## 流水类型
40+ 
41+PIPE_V
42+ 
43+## 约束说明
44+ 
45+- 数据类型为无符号类型:执行逻辑右移。逻辑右移会将二进制数整体向右移动指定的位数,最低位被丢弃,最高位用0填充。
46+- 数据类型为有符号类型:执行算术右移。算术右移会将二进制数整体向右移动指定的位数,最低位被丢弃,最高位用原符号位填充。
47+ 
48+## 调用示例
49+ 
50+```cpp
51+vector_uint32_t dst;
52+vector_uint32_t src0, src1;
53+vector_bool mask = asc_create_mask_b16(Pat::ALL);
54+asc_loadalign(src0, src0_addr); // src0_addr是外部输入的UB内存空间地址。
55+asc_loadalign(src1, src1_addr); // src1_addr是外部输入的UB内存空间地址。
56+asc_shiftright(dst, src0, src1, mask);
57+```
@@ -50,7 +50,7 @@ PIPE_V
50 50 
51## 约束说明51## 约束说明
52 52 
53-value不支持设置为负数。53+- value不支持设置为负数。
54 54 
55## 调用示例55## 调用示例
56 56 
@@ -4,7 +4,7 @@
4 4 
5|产品|是否支持|5|产品|是否支持|
6| :------------ | :------------: |6| :------------ | :------------: |
7-| <term>Ascend 950PR/Ascend 950DT</term> | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8 8 
9## 功能说明9## 功能说明
10 10 
@@ -0,0 +1,52 @@
1+# asc_uint162uint32
2+ 
3+## 产品支持情况
4+ 
5+|产品|是否支持|
6+| :------------ | :------------: |
7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8+ 
9+## 功能说明
10+ 
11+将uint16_t类型数据转为uint32_t类型。
12+ 
13+## 函数原型
14+ 
15+```cpp
16+// 数据写入索引为偶数的位置
17+__simd_callee__ inline void asc_uint162uint32(vector_uint32_t& dst, vector_uint16_t src, vector_bool mask)
18+// 数据写入索引为奇数的位置
19+__simd_callee__ inline void asc_uint162uint32_v2(vector_uint32_t& dst, vector_uint16_t src, vector_bool mask)
20+```
21+ 
22+## 参数说明
23+ 
24+|参数名|输入/输出|描述|
25+| ------------ | ------------ | ------------ |
26+|dst|输出|目的操作数(矢量数据寄存器)。|
27+|src|输入|源操作数(矢量数据寄存器)。|
28+|mask|输入|源操作数掩码(掩码寄存器),用于指示在计算过程中哪些元素参与计算。对应位置为1时参与计算,为0时不参与计算。mask未筛选的元素在输出中置零。|
29+ 
30+矢量数据寄存器和掩码寄存器的详细说明请参见[reg数据类型定义.md](../reg数据类型定义.md)。
31+ 
32+## 返回值说明
33+ 
34+
35+ 
36+## 流水类型
37+ 
38+PIPE_V
39+ 
40+## 约束说明
41+ 
42+
43+ 
44+## 调用示例
45+ 
46+```cpp
47+vector_uint16_t src;
48+vector_uint32_t dst;
49+vector_bool mask = asc_create_mask_b16(Pat::ALL);
50+asc_loadalign(src, src_addr); // src_addr是外部输入的UB内存空间地址。
51+asc_uint162uint32(dst, src, mask);
52+```
@@ -45,6 +45,7 @@ PIPE_V
45 45 
46- 非饱和模式:输入数据超出目标数据范围时,会截断为目标数据格式,例如输入uint16_t值为256,输出uint8_t值为0。46- 非饱和模式:输入数据超出目标数据范围时,会截断为目标数据格式,例如输入uint16_t值为256,输出uint8_t值为0。
47- 饱和模式:输入数据超出目标数据范围时,返回输出类型的对应最值。47- 饱和模式:输入数据超出目标数据范围时,返回输出类型的对应最值。
48+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
48 49 
49## 调用示例50## 调用示例
50 51 
@@ -0,0 +1,56 @@
1+# asc_uint322int16
2+ 
3+## 产品支持情况
4+ 
5+|产品|是否支持|
6+| :------------ | :------------: |
7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8+ 
9+## 功能说明
10+ 
11+将uint32_t类型数据转为int16_t类型。
12+ 
13+## 函数原型
14+ 
15+```cpp
16+// 数据写入索引为偶数的位置,非饱和模式
17+__simd_callee__ inline void asc_uint322int16(vector_int16_t& dst, vector_uint32_t src, vector_bool mask)
18+// 数据写入索引为偶数的位置,饱和模式
19+__simd_callee__ inline void asc_uint322int16_sat(vector_int16_t& dst, vector_uint32_t src, vector_bool mask)
20+// 数据写入索引为奇数的位置,非饱和模式
21+__simd_callee__ inline void asc_uint322int16_v2(vector_int16_t& dst, vector_uint32_t src, vector_bool mask)
22+// 数据写入索引为奇数的位置,饱和模式
23+__simd_callee__ inline void asc_uint322int16_sat_v2(vector_int16_t& dst, vector_uint32_t src, vector_bool mask)
24+```
25+ 
26+## 参数说明
27+ 
28+|参数名|输入/输出|描述|
29+| ------------ | ------------ | ------------ |
30+|dst|输出|目的操作数(矢量数据寄存器)。|
31+|src|输入|源操作数(矢量数据寄存器)。|
32+|mask|输入|源操作数掩码(掩码寄存器),用于指示在计算过程中哪些元素参与计算。对应位置为1时参与计算,为0时不参与计算。mask未筛选的元素在输出中置零。|
33+ 
34+矢量数据寄存器和掩码寄存器的详细说明请参见[reg数据类型定义.md](../reg数据类型定义.md)。
35+ 
36+## 返回值说明
37+ 
38+
39+ 
40+## 流水类型
41+ 
42+PIPE_V
43+ 
44+## 约束说明
45+ 
H
Hhorming2月10日

饱和模式生效依赖的开关 要说明,生效场景

likedislike
horming
2月10日 评论:
guojianyang
guojianyang
2月10日 评论:
46+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
47+ 
48+## 调用示例
49+ 
50+```cpp
51+vector_uint32_t src;
52+vector_int16_t dst;
53+vector_bool mask = asc_create_mask_b16(Pat::ALL);
54+asc_loadalign(src, src_addr); // src_addr是外部输入的UB内存空间地址。
55+asc_uint322int16(dst, src, mask);
56+```
@@ -54,7 +54,7 @@ PIPE_V
54 54 
55## 约束说明55## 约束说明
56 56 
57-57+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
58 58 
59## 调用示例59## 调用示例
60 60 
@@ -4,7 +4,7 @@
4 4 
5|产品|是否支持|5|产品|是否支持|
6| :------------ | :------------: |6| :------------ | :------------: |
7-| <term>Ascend 950PR/Ascend 950DT</term> | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8 8 
9## 功能说明9## 功能说明
10 10 
@@ -64,7 +64,7 @@ PIPE_V
64 64 
65## 约束说明65## 约束说明
66 66 
67-67+- 使能饱和模式和非饱和模式生效时,需配置ctrl寄存器,ctrl寄存器的详细说明请参见[asc_set_ctrl.md](../../sys_var/asc_set_ctrl.md)。
68 68 
69## 调用示例69## 调用示例
70 70 
@@ -0,0 +1,54 @@
1+# asc_uint82half
2+ 
3+## 产品支持情况
4+ 
5+|产品|是否支持|
6+| :------------ | :------------: |
7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8+ 
9+## 功能说明
10+ 
11+将uint8_t类型数据转为half类型。
12+ 
13+ 
14+ 
15+## 函数原型
16+ 
17+```cpp
18+// 数据写入索引为偶数的位置
19+__simd_callee__ inline void asc_uint82half(vector_half& dst, vector_uint8_t src, vector_bool mask)
20+// 数据写入索引为奇数的位置
21+__simd_callee__ inline void asc_uint82half_v2(vector_half& dst, vector_uint8_t src, vector_bool mask)
22+```
23+ 
24+## 参数说明
25+ 
26+|参数名|输入/输出|描述|
27+| ------------ | ------------ | ------------ |
28+|dst|输出|目的操作数(矢量数据寄存器)。|
29+|src|输入|源操作数(矢量数据寄存器)。|
30+|mask|输入|源操作数掩码(掩码寄存器),用于指示在计算过程中哪些元素参与计算。对应位置为1时参与计算,为0时不参与计算。mask未筛选的元素在输出中置零。|
31+ 
32+矢量数据寄存器和掩码寄存器的详细说明请参见[reg数据类型定义.md](../reg数据类型定义.md)。
33+ 
34+## 返回值说明
35+ 
36+
37+ 
38+## 流水类型
39+ 
40+PIPE_V
41+ 
42+## 约束说明
43+ 
44+
45+ 
46+## 调用示例
47+ 
48+```cpp
49+vector_uint8_t src;
50+vector_half dst;
51+vector_bool mask = asc_create_mask_b16(Pat::ALL);
52+asc_loadalign(src, src_addr); // src_addr是外部输入的UB内存空间地址。
53+asc_uint82half(dst, src, mask);
54+```
@@ -1,4 +1,3 @@
1- 
2# asc_unpack1# asc_unpack
3 2 
4## 产品支持情况3## 产品支持情况
@@ -1,10 +1,10 @@
1-# asc_unqueeze1+# asc_unsqueeze
2 2 
3## 产品支持情况3## 产品支持情况
4 4 
5|产品|是否支持|5|产品|是否支持|
6| :------------ | :------------: |6| :------------ | :------------: |
7-| <term>Ascend 950PR/Ascend 950DT</term> | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8 8 
9## 功能说明9## 功能说明
10 10 
@@ -4,7 +4,7 @@
4 4 
5|产品|是否支持|5|产品|是否支持|
6| :------------ | :------------: |6| :------------ | :------------: |
7-| <term>Ascend 950PR/Ascend 950DT</term> | √ |7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
8 8 
9## 功能说明9## 功能说明
10 10 
@@ -4,6 +4,7 @@
4 4 
5|产品 | 是否支持 |5|产品 | 是否支持 |
6| :------------|:----:|6| :------------|:----:|
7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
7| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |8| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
8| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |9| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
9 10 
@@ -4,6 +4,7 @@
4 4 
5| 产品 | 是否支持 |5| 产品 | 是否支持 |
6| :-----------| :------: |6| :-----------| :------: |
7+| <cann-filter npu_type="950"><term>Ascend 950PR/Ascend 950DT</term> | √ </cann-filter>|
7| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |8| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
8| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |9| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
9 10 
@@ -31,6 +31,7 @@ __aicore__ inline void asc_set_ctrl(uint64_t config)
31|CTRL比特位 |功能|31|CTRL比特位 |功能|
32| :------- | :---- |32| :------- | :---- |
33|CTRL[48] |用于控制整数计算指令的饱和模式 <br>- 1'b0:饱和模式,INF输出会被饱和为±MAX,NAN输出会被饱和为0;<br> - 1'b1:非饱和模式,INF/NAN保持原输出。<br> 该控制位仅支持如下数据类型:<br>- 浮点数计算时支持half数据类型;<br>- 浮点数精度转换时支持如下数据类型:hifloat8_t、fp8_e8m0_t、fp8_e5m2_t、fp8_e4m3fn_t、half、bfloat16_t。|33|CTRL[48] |用于控制整数计算指令的饱和模式 <br>- 1'b0:饱和模式,INF输出会被饱和为±MAX,NAN输出会被饱和为0;<br> - 1'b1:非饱和模式,INF/NAN保持原输出。<br> 该控制位仅支持如下数据类型:<br>- 浮点数计算时支持half数据类型;<br>- 浮点数精度转换时支持如下数据类型:hifloat8_t、fp8_e8m0_t、fp8_e5m2_t、fp8_e4m3fn_t、half、bfloat16_t。|
34+|CTRL[49] |用于控制标量单元读取数据时是否通过datacache读取。datacache的读取速度快于ub,因此在对ub进行大量读取,且ub中数据不被vector单元写入时,可选择开启该模式。<br>- 1'b0:标量单元读取数据时,直接从ub中读取;<br> - 1'b1:标量单元读取数据时,从datacache中读取。|
34|CTRL[53] |用于控制整数计算指令的饱和模式 <br>- 1'b0:截断模式,溢出值按目标数据类型位数截断,保留低位,舍弃高位;<br>- 1'b1:饱和模式,溢出值饱和到±MAX。|35|CTRL[53] |用于控制整数计算指令的饱和模式 <br>- 1'b0:截断模式,溢出值按目标数据类型位数截断,保留低位,舍弃高位;<br>- 1'b1:饱和模式,溢出值饱和到±MAX。|
35|CTRL[56] |MASK模式控制位。MASK用于辅助SIMD指令执行,由于CTRL[56]指示两种模式:<br>- 1'b0:向量操作中的掩码寄存器。每位对应向量中一个元素,标记该元素是否参与计算。'1'表示对应元素将被计算;'0'表示对应元素将不被计算;<br>- 1'b1:MASK[31:0]用于指示SIMD指令实际操作的元素数量。实际重复次数由VECTOR自动推断,此时参数repeat time(Xt[63:56])被忽略。|36|CTRL[56] |MASK模式控制位。MASK用于辅助SIMD指令执行,由于CTRL[56]指示两种模式:<br>- 1'b0:向量操作中的掩码寄存器。每位对应向量中一个元素,标记该元素是否参与计算。'1'表示对应元素将被计算;'0'表示对应元素将不被计算;<br>- 1'b1:MASK[31:0]用于指示SIMD指令实际操作的元素数量。实际重复次数由VECTOR自动推断,此时参数repeat time(Xt[63:56])被忽略。|
36|CTRL[59] |用于控制浮点数转整数或整数转整数时的精度转换饱和模式,仅在CTRL[60]使能时生效。<br>- 1'b0:饱和模式,溢出值饱和到±MAX;<br>- 1'b1:截断模式:溢出值按照目标数据类型位数截断,保留低位,舍弃高位。|37|CTRL[59] |用于控制浮点数转整数或整数转整数时的精度转换饱和模式,仅在CTRL[60]使能时生效。<br>- 1'b0:饱和模式,溢出值饱和到±MAX;<br>- 1'b1:截断模式:溢出值按照目标数据类型位数截断,保留低位,舍弃高位。|