Host内的数据传输

对于Host内的数据传输,是通过调用内存复制接口实现的。

当前支持调用aclrtMemcpy接口执行同步Host内的内存复制任务,不支持调用aclrtMemcpyAsync接口执行异步Host内的内存复制功能,若调用aclrtMemcpyAsync接口时选择ACL_MEMCPY_HOST_TO_HOST类型时,由于是异步接口,虽然接口调用成功,下发了内存复制任务,但在调用aclrtSynchronizeStream接口等待该任务执行时会返回失败。

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

// 1. 申请内存
uint64_t size = 1 * 1024 * 1024;
void* hostPtrA = NULL;
void* hostPtrB = NULL;
aclrtMallocHost(&hostPtrA, size);
aclrtMallocHost(&hostPtrB, size);

// 2. 申请内存后,可向内存中读入数据,该自定义函数ReadFile由用户实现
ReadFile(fileName, hostPtrA, size);

// 3. 内存复制,可以选择同步或异步
// 同步内存复制,hostPtrA表示Host上源内存地址指针,hostPtrB表示Host上目的内存地址指针,size表示内存大小
aclrtMemcpy(hostPtrB, size, hostPtrA, size, ACL_MEMCPY_HOST_TO_HOST);

// 4. 使用完内存中的数据后,需及时释放资源
aclrtFreeHost(hostPtrA);
aclrtFreeHost(hostPtrB);
// ......