已合并
[C API]新增Reg计算部分文档 #217
guojianyang创建于 1月31日
[C API]新增Reg计算部分文档 #217
已合并
共 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 | |||
| 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 | ```cpp | 30 | ```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 | ```cpp | 44 | ```cpp |
| 43 | int64_t prefetch_length = 32; | 45 | int64_t prefetch_length = 32; |
| 44 | -int64_t pc = asc_get_program_counter_impl() & 0xFFFFFFFFFFFF; | 46 | +int64_t pc = asc_get_program_counter() & 0xFFFFFFFFFFFF; |
| 45 | asc_icache_preload(reinterpret_cast<void *>(pc), prefetch_length); | 47 | asc_icache_preload(reinterpret_cast<void *>(pc), prefetch_length); |
| 46 | ``` | 48 | ``` |
| @@ -109,8 +109,8 @@ PIPE_MTE1 | |||
| 109 | ```cpp | 109 | ```cpp |
| 110 | // 设置源操作数和目的操作数,total_length 指参与计算的数据长度 | 110 | // 设置源操作数和目的操作数,total_length 指参与计算的数据长度 |
| 111 | constexpr uint64_t total_length = 512; | 111 | constexpr 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 | // 设置搬运过程中的配置 |
| 116 | uint8_t n = 64; | 116 | uint8_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数据。 |
| 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 | + | ||
| 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); | ||
| 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_abs | 1 | # 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 | $$ |
| 14 | dst_i = |src_i| | 13 | dst_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 | + | ||
| 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 | ```cpp | 30 | ```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 | ```cpp | 101 | ```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 | + | ||
| 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 | ```cpp | 30 | ```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 | ```cpp | 30 | ```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_mull | 1 | # 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 | + | ||
| 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 | + | ||
| 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_unpack | 1 | # asc_unpack |
| 3 | 2 | ||
| 4 | ## 产品支持情况 | 3 | ## 产品支持情况 |
| @@ -1,10 +1,10 @@ | |||
| 1 | -# asc_unqueeze | 1 | +# 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:截断模式:溢出值按照目标数据类型位数截断,保留低位,舍弃高位。| |


需要加950标签