vec_ln_high_preci
函数原型
vec_ln_high_preci(mask, dst, src, work_tensor, repeat_times, dst_rep_stride, src_rep_stride)
参数说明
请参见参数说明。下面仅对dst/src/work_tensor参数进行说明:
dst/src/work_tensor数据类型保持一致,支持的数据类型为Tensor(float16)。
- 如果传入tensor带有偏移,则作为参数传入时应写成tensor[offset1:offset2],表示从offset1开始到offset2结束,也可以写成tensor[offset1:],表示从offset1开始;如果仅仅输入tensor[offset],代表仅传入一个元素,该接口内部实现过程中会对tensor进行切片,无法切分一个元素,运行时可能会产生错误,因此不支持该形式;
- 如果传入操作数tensor不带偏移,可以直接写成tensor传入。
【work_tensor参数说明】:
work_tensor为用户定义的临时buffer空间,存储中间结果,空间限定在scope_ubuf,用于内部计算使用。
【work_tensor空间计算说明】:
- 根据repeat_times、mask、src_rep_stride计算出src所需要的最小空间:src_extent_size = (repeat_times - 1)*src_rep_stride*16 + mask_len
如果mask是连续模式,mask_len即为mask值;如果mask为逐bit模式,mask_len为最高有效位的位数值。
- 对src最小空间进行32Byte向上取整对齐: wk_size_unit = (src_extent_size+15)//16*16
- 计算work_tensor大小: 10*wk_size_unit
【work_tensor空间计算举例】:
- 如果mask = 128,rep_times = 2,src_rep_stride = 8,则对应的mask_len = 128, src_extent_size = (2 - 1)*8*16 + mask_len = 256,wk_size_unit = (src_extent_size + 15)//16*16 = 256,最后计算work_tensor需要的空间大小为 10*wk_size_unit = 2560。
- 如果mask = [3, 2**64-1], rep_times = 2,src_rep_stride = 8,则对应的mask_len = 66,mask高位是3,对应的二进制bit位为"11",所以mask_len = 2 + 64;src_extent_size = (2 - 1)*8*16 + mask_len = 194,wk_size_unit = (src_extent_size + 15)//16*16 = 208,最后计算work_tensor需要的空间大小为10*wk_size_unit= 2080。
返回值
无。
支持的型号
Atlas 200/300/500 推理产品
Atlas 训练系列产品
Atlas推理系列产品AI Core
Atlas推理系列产品Vector Core
Atlas A2训练系列产品/Atlas 800I A2推理产品
Atlas 200/500 A2推理产品
注意事项
- dst、src、work_tensor应声明在scope_ubuf中。
- dst、src、work_tensor三个tensor的空间不能重叠。
- src的输入数据需要保证是正数,如果src的数值为非正数,可能会产生未知结果。
- 对于Atlas 200/300/500 推理产品,该接口计算精度高于vec_ln,解决了vec_ln对于部分数据区间精度不足的问题。
- 对于Atlas 训练系列产品,该接口和vec_ln使用效果无差异。
- 对于Atlas推理系列产品AI Core,该接口和vec_ln使用效果无差异。
- 对于Atlas推理系列产品Vector Core,该接口和vec_ln使用效果无差异。
- Atlas A2训练系列产品/Atlas 800I A2推理产品,该接口和vec_ln使用效果无差异。
- Atlas 200/500 A2推理产品,该接口和vec_ln使用效果无差异。
- 其它注意事项请参考注意事项。
调用示例
- mask为连续模式
from tbe import tik tik_instance = tik.Tik() # 定义计算tensor src_gm = tik_instance.Tensor("float16", (2, 128), tik.scope_gm, "src_gm") src_ub = tik_instance.Tensor("float16", (2, 128), tik.scope_ubuf, "src_ub") dst_ub = tik_instance.Tensor("float16", (2, 128), tik.scope_ubuf, "dst_ub") # work_tensor大小为src大小的10倍 work_tensor = tik_instance.Tensor("float16", (10, 2, 128), tik.scope_ubuf, "work_tensor") dst_gm = tik_instance.Tensor("float16", (2, 128), tik.scope_gm, "dst_gm") # 将输入数据从gm搬运到ub tik_instance.data_move(src_ub, src_gm, 0, 1, 16, 0, 0) tik_instance.vec_dup(128, dst_ub, 0.0, 2, 8) mask = 128 rep_times = 2 src_rep_stride = 8 dst_rep_stride = 8 # 如果输入work_tensor有索引需要写成work_tensor[index:] tik_instance.vec_ln_high_preci(mask, dst_ub, src_ub, work_tensor[0:], rep_times, dst_rep_stride, src_rep_stride) # 将计算结果数据从ub搬运到gm tik_instance.data_move(dst_gm, dst_ub, 0, 1, 16, 0, 0) tik_instance.BuildCCE(kernel_name="vln_rep_8_src_rep_8", inputs=[src_gm], outputs=[dst_gm])
结果示例:
输入数据: [ [1, 2, 3, 4, ......, 128], [1, 2, 3, 4, ......, 128] ] 输出结果: [ [0, 0.6931, 1.0986, 1.3863, ......, 4.8520], [0, 0.6931, 1.0986, 1.3863, ......, 4.8520] ]
- mask为逐bit模式
from tbe import tik tik_instance = tik.Tik() kernel_name = "vln_rep_8_src_rep_8" # 申请需要的tensor src_gm = tik_instance.Tensor("float16", (2, 128), tik.scope_gm, "src_gm") src_ub = tik_instance.Tensor("float16", (2, 128), tik.scope_ubuf, "src_ub") dst_ub = tik_instance.Tensor("float16", (2, 128), tik.scope_ubuf, "dst_ub") # 计算work_tensor大小 rep_times = 2 src_rep_stride = 8 dst_rep_stride = 8 mask = [3, 2**64-1] mask_len = 66 src_extent_size = (rep_times - 1)*src_rep_stride*16 + mask_len wk_size_unit = (src_extent_size + 15)//16*16 wk_size = 10*wk_size_unit work_tensor = tik_instance.Tensor("float16", (wk_size, ), tik.scope_ubuf, "work_tensor") dst_gm = tik_instance.Tensor("float16", (2, 128,), tik.scope_gm, "dst_gm") # 将用户输入数据拷贝到src ubuf tik_instance.data_move(src_ub, src_gm, 0, 1, 16, 0, 0) # 初始化dst ubuf空间 tik_instance.vec_dup(128, dst_ub, 0.0, 2, 8) tik_instance.vec_ln_high_preci(mask, dst_ub, src_ub, work_tensor, rep_times, dst_rep_stride, src_rep_stride) # 将计算结果拷贝到目标gm tik_instance.data_move(dst_gm, dst_ub, 0, 1, 16, 0, 0) tik_instance.BuildCCE(kernel_name="vln_rep_8_src_rep_8", inputs=[src_gm], outputs=[dst_gm])
结果示例:
输入数据: [ [1, 2, 3, 4, ......, 65, 66, 67, ......, 128], [1, 2, 3, 4, ......, 65, 66, 67, ......, 128] ] 输出数据: [ [0, 0.6931, 1.0986, 1.3863, ......, 4.1744, 4.1897, 0, ......, 0], [0, 0.6931, 1.0986, 1.3863, ......, 4.1744, 4.1897, 0, ......, 0] ]
父主题: 单目