下载
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助
昇腾小AI

vec_rsqrt_high_preci

功能说明

按element做开方后,再取倒数:。该接口的精度高于vec_rsqrt

函数原型

vec_rsqrt_high_preci(mask, dst, src, work_tensor, repeat_times, dst_rep_stride, src_rep_stride)

参数说明

请参见参数说明。下面仅对dst/src/work_tensor参数进行说明:

dst与src的数据类型需要保持一致,支持的数据类型为:Tensor(float16/float32);work_tensor支持的数据类型为Tensor(float32)。

  • 如果传入tensor带有偏移,则作为参数传入时应写成tensor[offset1:offset2],表示从offset1开始到offset2结束,也可以写成tensor[offset1:],表示从offset1开始;如果仅仅输入tensor[offset],代表仅传入一个元素,该接口内部实现过程中会对tensor进行切片,无法切分一个元素,运行时可能会产生错误,因此不支持该形式;
  • 如果传入操作数tensor不带偏移,可以直接写成tensor传入。

【work_tensor参数说明】:

work_tensor为用户定义的临时buffer空间,存储中间结果,空间限定在scope_ubuf,用于内部计算使用。

【work_tensor空间计算说明】:

  1. 根据repeat_times、mask、src_rep_stride计算出src计算所需要的最小空间:src_extent_size = (repeat_times- 1)*src_rep_stride*block_len + mask_len

    当源操作数数据类型为float16时,block_len=16;

    当源操作数数据类型为float32时,block_len=8;

    当mask是连续模式,mask_len 即mask值;

    当mask为逐bits模式,mask_len为最高有效位的位数值。

  2. 对src最小空间进行32B向上取整对齐: wk_size_unit = ((src_extent_size+block_len-1)//block_len)*block_len
  3. 计算work_tensor大小:

    对于Atlas 200/300/500 推理产品:当源操作数数据类型为float16时,则work_tensor需要申请的大小为6*wk_size_unit;当源操作数数据类型为float32时,则work_tensor需要申请的大小为4*wk_size_unit。例如当src数据类型为float16,mask = 128, repeat_times=2, src_rep_stride=8时,block_len=16, mask_len=128, src_extent_size=(2-1)*8*16+128=256;对src_extent_size进行32Byte对齐后wk_size_unit=256;则work_tensor申请的空间大小为6*256=1536。

    对于Atlas 训练系列产品,当源操作数数据类型为float16时,则work_tensor需要申请的大小为5*wk_size_unit;当源操作数数据类型为float32时,则work_tensor需要申请的大小为3*wk_size_unit。例如当src数据类型为float16,mask = 128, repeat_times=2, src_rep_stride=8时,block_len=16, mask_len=128, src_extent_size=(2-1)*8*16+128=256;对src_extent_size进行32Byte对齐后wk_size_unit=256;则work_tensor申请空间大小为5*256=1280。

    对于Atlas推理系列产品AI Core,当源操作数数据类型为float16时,则work_tensor需要申请的大小为5*wk_size_unit;当源操作数数据类型为float32时,则work_tensor需要申请的大小为3*wk_size_unit。例如当src数据类型为float16,mask = 128, repeat_times=2, src_rep_stride=8时,block_len=16, mask_len=128, src_extent_size=(2-1)*8*16+128=256;对src_extent_size进行32Byte对齐后wk_size_unit=256;则work_tensor申请空间大小为5*256=1280。

    对于Atlas推理系列产品Vector Core,当源操作数数据类型为float16时,则work_tensor需要申请的大小为5*wk_size_unit;当源操作数数据类型为float32时,则work_tensor需要申请的大小为3*wk_size_unit。例如当src数据类型为float16,mask = 128, repeat_times=2, src_rep_stride=8时,block_len=16, mask_len=128, src_extent_size=(2-1)*8*16+128=256;对src_extent_size进行32Byte对齐后wk_size_unit=256;则work_tensor申请空间大小为5*256=1280。

    Atlas A2训练系列产品/Atlas 800I A2推理产品,当源操作数数据类型为float16时,则work_tensor需要申请的大小为5*wk_size_unit;当源操作数数据类型为float32时,则work_tensor需要申请的大小为3*wk_size_unit。例如当src数据类型为float16,mask = 128, repeat_times=2, src_rep_stride=8时,block_len=16, mask_len=128, src_extent_size=(2-1)*8*16+128=256;对src_extent_size进行32Byte对齐后wk_size_unit=256;则work_tensor申请空间大小为5*256=1280。

    Atlas 200/500 A2推理产品,当源操作数数据类型为float16时,则work_tensor需要申请的大小为5*wk_size_unit;当源操作数数据类型为float32时,则work_tensor需要申请的大小为3*wk_size_unit。例如当src数据类型为float16,mask = 128, repeat_times=2, src_rep_stride=8时,block_len=16, mask_len=128, src_extent_size=(2-1)*8*16+128=256;对src_extent_size进行32Byte对齐后wk_size_unit=256;则work_tensor申请空间大小为5*256=1280。

返回值

支持的型号

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的数值为非正数,可能会产生未知结果。
  • 该接口计算精度高于vec_rsqrt,解决了vec_rsqrt精度不足问题。
  • 其它注意事项请参考注意事项

调用示例1

from tbe import tik
tik_instance = tik.Tik()
# 定义tensor
dst_gm = tik_instance.Tensor("float16", (128,), name="dst_gm", scope=tik.scope_gm)
src_gm = tik_instance.Tensor("float16", (128,), name="src_gm", scope=tik.scope_gm)
src_ub = tik_instance.Tensor("float16", (128,), name="src_ub", scope=tik.scope_ubuf)
dst_ub = tik_instance.Tensor("float16", (128,), name="dst_ub", scope=tik.scope_ubuf)
# 将输入数据从gm搬运到ub
tik_instance.data_move(src_ub, src_gm, 0, 1, 128*2 // 32, 0, 0)
mask = 128
mask_len = mask  # mask 是连续模式,mask_len则等于mask的值
repeat_times = 1
dst_rep_stride = 8
src_rep_stride = 8
block_len = 16  # src dtype is float16
src_extent_size = (repeat_times - 1)*src_rep_stride*block_len  + mask_len
wk_size_unit = ((src_extent_size + block_len - 1) // block_len)*block_len
wk_size = 6*wk_size_unit  # 得到work_tensor的大小
# 申请work_tensor
work_tensor = tik_instance.Tensor("float32", (wk_size ,), name="work_tensor", scope=tik.scope_ubuf)
# 指令传入tensor时,若有下标偏移请按照如下格式传入,在下标后加':'符号;否则可能导致程序报错
tik_instance.vec_rsqrt_high_preci(mask, dst_ub, src_ub, work_tesnor[0:], repeat_times, dst_rep_stride, src_rep_stride)
# 将计算结果从ub搬运到目标gm
tik_instance.data_move(dst_gm, dst_ub, 0, 1, 128*2 // 32, 0, 0)
tik_instance.BuildCCE("test_vec_rsqrt_high_preci", inputs=[src_gm], outputs=[dst_gm])

结果示例:

输入:
src_gm=
   [6.996   1.381   5.996   7.902   ...  5.113   5.78    1.672   5.418  ]
输出:
dst_gm:
   [0.3782 0.851  0.4084 0.3557 ...  0.4421 0.416  0.7734 0.4297]

调用示例2

from tbe import tik
tik_instance = tik.Tik()
# 定义tensor
dst_gm = tik_instance.Tensor("float32", (128,), name="dst_gm", scope=tik.scope_gm)
src_gm = tik_instance.Tensor("float32", (128,), name="src_gm", scope=tik.scope_gm)
src_ub = tik_instance.Tensor("float32", (128,), name="src_ub", scope=tik.scope_ubuf)
dst_ub = tik_instance.Tensor("float32", (128,), name="dst_ub", scope=tik.scope_ubuf)
# 将输入数据从gm搬运到ub
tik_instance.data_move(src_ub, src_gm, 0, 1, 128*4 // 32, 0, 0)
mask = [0, 2**64 - 1]
mask_len = 64  # mask是逐bits模式,mask_len等于mask的最高有效位的位数值
repeat_times = 2
dst_rep_stride = 8
src_rep_stride = 8
block_len = 8  # src dtype is float32
src_extent_size = (repeat_times - 1)*src_rep_stride*block_len  + mask_len
wk_size_unit = ((src_extent_size + block_len - 1)//block_len)*block_len
wk_size = 4*wk_size_unit # 得到work_tensor的大小
# 申请work_tensor
work_tensor = tik_instance.Tensor("float32", (wk_size ,), name="work_tensor", scope=tik.scope_ubuf)
# 指令传入tensor时,若有下标偏移请按照如下格式传入,在下标后加':'符号;否则可能导致程序报错
tik_instance.vec_rsqrt_high_preci(mask, dst_ub, src_ub, work_tesnor[0:], repeat_times, dst_rep_stride, src_rep_stride)
# 将计算结果从ub拷贝到目标gm
tik_instance.data_move(dst_gm, dst_ub, 0, 1, 128*4 // 32, 0, 0)
tik_instance.BuildCCE("test_vec_rsqrt_high_preci", inputs=[src_gm], outputs=[dst_gm])

结果示例:

输入:
src_gm=
   [5.349619, 0.4301902, 4.7152824, 9.539162, ..., 5.7243876, 4.4785686, 7.030495, 7.489954]
输出:
dst_gm:
   [0.43235308, 1.5246484, 0.46051747, 0.32377616, ..., 0.41796073, 0.47253108, 0.37714386, 0.36539316]
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词