昇腾社区首页
中文
注册

两个Device间的数据传输

注意点说明:

调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import acl

ACL_MEM_MALLOC_NORMAL_ONLY_P2P = 5 # 申请P2P内存
ACL_MEMCPY_DEVICE_TO_DEVICE = 3    # Device内或Device间的内存复制

dev0, dev1 = 0, 1

ret = acl.init("")

ret = acl.rt.set_device(dev0)
# 查询Device 0和Device 1之间是否支持内存复制
can_access_peer, ret = acl.rt.device_can_access_peer(dev0, dev1)
# 使能当前Device 0与Device 1之间的内存复制
ret = acl.rt.device_enable_peer_access(dev1, 0)
size = 1024
# 申请P2P内存
dev0_mem, ret = acl.rt.malloc(size, ACL_MEM_MALLOC_NORMAL_ONLY_P2P)

ret = acl.rt.set_device(dev1)
# 使能当前Device 1与Device 0之间的内存复制
ret = acl.rt.device_enable_peer_access(dev0, 0)
dev1_mem, ret = acl.rt.malloc(size, ACL_MEM_MALLOC_NORMAL_ONLY_P2P)

ret = acl.rt.memcpy(dev0_mem, size, dev1_mem, size, ACL_MEMCPY_DEVICE_TO_DEVICE)
ret = acl.rt.memcpy(dev1_mem, size, dev0_mem, size, ACL_MEMCPY_DEVICE_TO_DEVICE)

ret = acl.rt.free(dev1_mem)
ret = acl.rt.free(dev0_mem)

ret = acl.rt.reset_device(dev1)
ret = acl.rt.set_device(dev0)
ret = acl.rt.reset_device(dev0)

ret = acl.finalize()