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

vec_ln_high_preci

功能说明

按element取自然对数:。该接口的精度高于vec_ln

函数原型

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空间计算说明】:

  1. 根据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为最高有效位的位数值。

  2. 对src最小空间进行32Byte向上取整对齐: wk_size_unit = (src_extent_size+15)//16*16
  3. 计算work_tensor大小: 10*wk_size_unit

【work_tensor空间计算举例】:

  1. 如果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。
  2. 如果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]
    ]
搜索结果
找到“0”个结果

当前产品无相关内容

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