跨Device的数据交互
本节中的“跨Device的数据交互”是指一个进程内、根据硬件组网(例如处于PCIe或者HCCS互联的组网拓扑下)、Device之间能够访问彼此的内存。可以使用aclrtDeviceCanAccessPeer接口查询两个Device之间是否支持数据交互,若支持,再根据访问方向,分别调用aclrtDeviceEnablePeerAccess接口开启一个Device到另一个Device的数据交互功能,例如,调用一次aclrtDeviceEnablePeerAccess接口开启Device 0到Device 1的数据交互,再调用一次aclrtDeviceEnablePeerAccess接口开启Device 1到Device 0的数据交互。若需关闭Device之间的数据交互,可调用aclrtDeviceDisablePeerAccess接口。对于两个进程之间的通信请参见进程间通信。
以下是跨Device内存复制的代码示例,不可以直接拷贝编译运行,仅供参考。完整样例代码请参见Link。
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 | aclInit(NULL); // 初始化 int32_t canAccessPeer = 0; aclrtDeviceCanAccessPeer(&canAccessPeer, 0, 1); // 查询Device 0和Device 1之间是否支持数据交互 if (canAccessPeer == 1) { aclrtSetDevice(0); // Device 0下的操作 uint32_t reserveFlag = 0U; aclrtDeviceEnablePeerAccess(1, reserveFlag); // 开启当前Device(Device 0)到指定Device(Device 1)的数据交互 void *dev0Mem = nullptr; aclrtMalloc(&dev0Mem, 10, ACL_MEM_MALLOC_HUGE_FIRST_P2P); aclrtSetDevice(1); // Device 1下的操作 aclrtDeviceEnablePeerAccess(0, reserveFlag); // 开启当前Device(Device 1)到指定Device(Device 0)的数据交互 void *dev1Mem = nullptr; aclrtMalloc(&dev1Mem, 10, ACL_MEM_MALLOC_HUGE_FIRST_P2P); aclrtMemcpy(dev1Mem, 10, dev0Mem, 10, ACL_MEMCPY_DEVICE_TO_DEVICE); // 将Device 0上的内存数据复制到Device 1上 aclrtDeviceDisablePeerAccess(0); // 关闭当前Device(Device 1)到指定Device(Device 0)的数据交互 aclrtFree(dev1Mem); aclrtResetDevice(1); // 释放Device 1的资源 aclrtSetDevice(0); // 切换到Device 0上进行操作 aclrtDeviceDisablePeerAccess(1); // 关闭当前Device(Device 0)到指定Device(Device 1)的数据交互 aclrtFree(dev0Mem); aclrtResetDeviceForce(0); // Device 0下的操作,调用aclrtResetDevice接口释放Device 0的资源 printf("P2P copy success\n"); } else { printf("current device doesn't support p2p feature\n"); } aclFinalize(); // 去初始化 |
父主题: 多设备编程