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)。
【work_tensor参数说明】:
work_tensor为用户定义的临时buffer空间,存储中间结果,空间限定在scope_ubuf,用于内部计算使用。
【work_tensor空间计算说明】:
如果mask是连续模式,mask_len即为mask值;如果mask为逐bit模式,mask_len为最高有效位的位数值。
【work_tensor空间计算举例】:
无。
Atlas 200/300/500 推理产品
Atlas 训练系列产品
Atlas 推理系列产品AI Core
Atlas 推理系列产品Vector Core
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] ]
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] ]