文档
注册
评分
提单
论坛
小AI

data_move

功能说明

在src与dst间进行数据传输。支持src与dst的类型同时为Tensor。

Atlas 200/300/500 推理产品,支持UB->UB/UB->OUT/OUT->UB/OUT->L1

Atlas 训练系列产品,支持UB->UB/UB->OUT/OUT->UB/OUT->L1

Atlas推理系列产品(Ascend 310P处理器)AI Core,支持UB->UB/UB->OUT/OUT->UB/OUT->L1

Atlas推理系列产品(Ascend 310P处理器)Vector Core,支持UB->OUT/UB->UB/OUT->UB

Atlas A2训练系列产品/Atlas 800I A2推理产品,支持UB->UB/UB->OUT/OUT->UB/OUT->L1/L1->OUT

Atlas 200/500 A2推理产品,支持UB->UB/UB->OUT/OUT->UB/OUT->L1/L1->OUT

函数原型

data_move (dst, src, sid, nburst, burst, src_stride, dst_stride, *args, **argv)

参数说明

表1 参数说明

参数名称

输入/输出

含义

dst

输出

目的操作数,支持数据类型参考表2

若dst的scope为L1, 则要求地址偏移32Byte对齐

若dst的scope为UB,则要求地址偏移block_size对齐

src

输入

源操作数,支持数据类型参考表2

若src的scope为L1, 则要求地址偏移32Byte对齐

若src的scope为UB, 则要求地址偏移block_size对齐

sid

输入

SMMU ID,为硬件保留接口,输入0即可,取值范围:sid∈[0, 15],支持数据类型:Scalar(int32)、立即数(int32)、Expr(int32)。

nburst

输入

传输数据片段数据,即需要执行的搬运次数,取值范围:nburst∈[1, 4095],支持的数据类型为:Scalar(int32)、立即数(int32)、Expr(int32)。

burst

输入

每次搬运的连续传输数据片段长度,取值范围:burst∈[1, 65535],单位:32B。

支持的数据类型为:Scalar(int16/int32/int64/uint16/uint32/uint64)、立即数(int)、Expr(int16/int32/int64/uint16/uint32/uint64)。

src_stride

输入

源tensor相邻连续数据片段间隔(前 burst 尾与后 burst 头),取值范围:src_stride∈[0, 65535]。支持的数据类型为:Scalar(int16/int32/int64/uint16/uint32/uint64)、立即数(int)、Expr(int16/int32/int64/uint16/uint32/uint64)。

dst_stride

输入

目的tensor相邻连续数据片段间隔(前 burst 尾与后 burst 头),取值范围:dst_stride∈[0, 65535]。支持的数据类型为:Scalar(int16/int32/int64/uint16/uint32/uint64)、立即数(int)、Expr(int16/int32/int64/uint16/uint32/uint64)。

*args

输入

扩展参数个数。

**argv

输入

扩展参数。

表2 data_move相关数据类型、scope及参数单位

src.scope

dst.scope

dtype

(src需与dst保持一致)

burst

单位

src_stride

单位

dst_stride

单位

OUT

L1

uint8, int8, float16, uint16, int16, float32, int32, uint32, uint64, int64

32B

32B

32B

L1

OUT

uint8, int8, float16, uint16, int16, float32, int32, uint32, uint64, int64

32B

32B

32B

OUT

UB

uint8, int8, float16, uint16, int16, float32, int32, uint32, uint64, int64,

32B

32B

32B

UB

OUT

uint8, int8, float16, uint16, int16, float32, int32, uint32, uint64, int64,

32B

32B

32B

UB

UB

uint8, int8, float16, uint16, int16, float32, int32, uint32, uint64, int64

32B

32B

32B

支持的型号

Atlas 200/300/500 推理产品

Atlas 训练系列产品

Atlas推理系列产品(Ascend 310P处理器)AI Core

Atlas推理系列产品(Ascend 310P处理器)Vector Core

Atlas A2训练系列产品/Atlas 800I A2推理产品

Atlas 200/500 A2推理产品

注意事项

返回值

调用示例

  • 示例1:一次搬运完成所有数据传输场景
    from tbe import tik
    tik_instance = tik.Tik()
    src_gm = tik_instance.Tensor("float16", (512,), name="src_gm", scope=tik.scope_gm)
    dst_gm = tik_instance.Tensor("float16", (512,), name="dst_gm", scope=tik.scope_gm)
    tensor_ub = tik_instance.Tensor("float16", (512,), name="tensor_ub", scope=tik.scope_ubuf)
    # 将用户输入数据从gm搬运到ub
    # nburst表示传输片段数目,相当于传输次数;burst表示单次传输所传输的数据片段长度,单位是32B;src_stride/dst_stride表示每次传输之间的间隔
    # 为提高运行性能,建议尽量减少传输次数、加大单次传输的片段长度,即nburst尽量小、burst尽量大
    # 本例中,nburst为1,即一次完成所有数据传输;burst=512*2//32=32,即每次传输片段长度为32;src_stride/dst_stride都为0,表示连续传输
    tik_instance.data_move(tensor_ub, src_gm, 0, 1, 32, 0, 0)
    # 将计算结果拷贝到目标gm
    tik_instance.data_move(dst_gm, tensor_ub, 0, 1, 32, 0, 0)
    
    tik_instance.BuildCCE(kernel_name="data_move", inputs=[src_gm], outputs=[dst_gm])

    结果示例:

    输入数据(src_gm):
    [-1.539    1.418   -6.418   -9.55    -9.336   -6.484    4.117    7.914
     -2.012    3.201   -5.375    7.32     4.       9.99     3.502    8.27
     -8.125   -9.33    -6.812   -8.695    9.87    -4.914   -5.992    1.233
     -3.662    3.477   -4.9     -3.924    6.438    8.266    7.31     8.97
      6.06    -3.646    9.695    0.623    9.84    -5.234    4.715   -8.07
      ...
      2.19     3.709   -3.611   -6.97    -0.772   -0.5938   2.953    7.043
      6.63     8.55     1.873    0.1703  -0.715   -5.35    -4.52     7.31
      4.336   -7.113   -5.875    9.44    -2.812   -6.5     -0.742   -6.703
      3.297   -7.605    0.3582  -1.62     2.578   -6.35    -2.166    9.95
      4.57     2.746    9.88    -3.354    5.645   -6.434   -2.32     2.59   ]
    
    输出数据(dst_gm):
    [-1.539    1.418   -6.418   -9.55    -9.336   -6.484    4.117    7.914
     -2.012    3.201   -5.375    7.32     4.       9.99     3.502    8.27
     -8.125   -9.33    -6.812   -8.695    9.87    -4.914   -5.992    1.233
     -3.662    3.477   -4.9     -3.924    6.438    8.266    7.31     8.97
      6.06    -3.646    9.695    0.623    9.84    -5.234    4.715   -8.07
      ...
      2.19     3.709   -3.611   -6.97    -0.772   -0.5938   2.953    7.043
      6.63     8.55     1.873    0.1703  -0.715   -5.35    -4.52     7.31
      4.336   -7.113   -5.875    9.44    -2.812   -6.5     -0.742   -6.703
      3.297   -7.605    0.3582  -1.62     2.578   -6.35    -2.166    9.95
      4.57     2.746    9.88    -3.354    5.645   -6.434   -2.32     2.59   ]
  • 示例2:输入数据不满足32Byte对齐的场景
    from tbe import tik
    tik_instance = tik.Tik()
    src_gm = tik_instance.Tensor("float16", (23, ), name="src_gm", scope=tik.scope_gm)
    dst_gm = tik_instance.Tensor("float16", (23, ), name="dst_gm", scope=tik.scope_gm)
    src_ub = tik_instance.Tensor("float16", (32, ), name="src_ub", scope=tik.scope_ubuf)
    dst_ub = tik_instance.Tensor("float16", (32, ), name="dst_ub", scope=tik.scope_ubuf)
    tik_instance.vec_dup(32, src_ub, 0, 1, 1)
    tik_instance.vec_dup(32, dst_ub, 0, 1, 1)
    with tik_instance.for_range(0, 2) as i:
        # 可以进行两次搬运,第一次32Byte对齐搬运,第二次数据前移再按照32Byte对齐方式搬运到ub
        tik_instance.data_move(src_ub[i*16], src_gm[i*(23-16)], 0, 1, 1, 0, 0)
    tik_instance.vec_add(32, dst_ub, src_ub, src_ub, 1, 1, 1, 1)
    # ub -> gm 采取相同搬运方式,第一次搬运32Byte的数据到gm;第二次将gm进行地址回退,满足32Byte对齐后,存储剩余ub中的数据
    with tik_instance.for_range(0, 2) as i:
        tik_instance.data_move(dst_gm[i*(23-16)], dst_ub[i*16], 0, 1, 1, 0, 0)
    tik_instance.BuildCCE(kernel_name="data_move", inputs=[src_gm], outputs=[dst_gm])

    输入数据(src_gm):

    [ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.

    18. 19. 20. 21. 22.]

    输出数据(dst_gm):

    [ 0. 2. 4. 6. 8. 10. 12. 14. 16. 18. 20. 22. 24. 26. 28. 30. 32. 34.

    36. 38. 40. 42. 44.]

  • 示例3:输入数据超过UB大小时的场景
    本示例中,vec_add的两个源操作数以及目的操作数都使用相同的Tensor,即地址完全重叠。假设UB的可用空间为248KB,代码示例如下:
    from tbe import tik
    tik_instance = tik.Tik()
    src_gm = tik_instance.Tensor("float16", (126976, 2), name="src_gm", scope=tik.scope_gm)
    dst_gm = tik_instance.Tensor("float16", (126976, 2), name="dst_gm", scope=tik.scope_gm)
    dst_ub = tik_instance.Tensor("float16", (126976, ), name="dst_ub", scope=tik.scope_ubuf)
    with tik_instance.for_range(0, 2) as i:
        # gm数据超过ub最大内存,先搬运一部分到ub进行计算,完成之后再搬回gm,可多次重复
        tik_instance.data_move(dst_ub, src_gm[i*126976], 0, 1, 7936, 0, 0)
        with tik_instance.for_range(0, 3) as j:
            # repeat_times最大为255 一次无法全部计算完,可以分多次计算,此处为节省空间src和dst 为同一个ub
            tik_instance.vec_add(128, dst_ub[j*128*255], dst_ub[j*128*255], dst_ub[j*128*255], 255, 8, 8, 8)     
        tik_instance.vec_add(128, dst_ub[3 * 128 * 255], dst_ub[3 * 128 * 255], dst_ub[3 * 128 * 255], 227, 8, 8, 8)
        # 将计算好的数据搬回至gm,再计算另外剩余的数据    
        tik_instance.data_move(dst_gm[i*126976], dst_ub, 0, 1, 7936, 0, 0)
    tik_instance.BuildCCE(kernel_name="data_move", inputs=[src_gm], outputs=[dst_gm])

    输入数据(src_gm):

    [2. 2. 2. ... 2. 2. 2.]

    输出数据(dst_gm):

    [4. 4. 4. ... 4. 4. 4.]

搜索结果
找到“0”个结果

当前产品无相关内容

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