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)
参数说明
参数名称 |
输入/输出 |
含义 |
---|---|---|
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 |
输入 |
扩展参数。 |
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.]