两个Device间的数据传输
注意点说明:
- 可使用acl.rt.device_can_access_peer接口查询两个Device之间是否支持数据交互,若支持,需调用两次acl.rt.device_enable_peer_access接口使能两个Device之间的数据交互功能(例如,调用一次acl.rt.device_enable_peer_access接口使能Device 0到Device 1的数据交互,再调用一次acl.rt.device_enable_peer_access接口使能Device 1到Device 0的数据交互),再调用acl.rt.memcpy接口(同步接口)或acl.rt.memcpy_async接口(异步接口)通过内存复制的方式实现数据传输。
- 当前仅支持同一个PCIe Switch内Device之间的数据交互。
- 仅支持同一个进程内的同一个线程或不同线程间的Device之间的数据交互,不支持不同进程间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() |
父主题: 数据传输