接口调用流程
接口调用流程
数据传输的关键接口调用流程如下:
- 申请内存。
- Host上的内存,可以用C++标准库中的new、malloc接口申请内存,也可以使用AscendCL提供的aclrtMallocHost接口申请内存。
- Device上的内存,使用AscendCL提供的aclrtMalloc或aclrtMallocHost接口申请内存。如果涉及媒体数据处理(例如,图片解码、缩放等)时,需使用acldvppMalloc或hi_mpi_dvpp_malloc接口申请内存。
- 将数据读入内存。
- 通过内存复制实现数据传输。数据传输可以通过内存复制的方式实现,分为同步内存复制、异步内存复制:
- 同步内存复制:调用aclrtMemcpy接口。
- 异步内存复制:调用aclrtMemcpyAsync接口,再调用aclrtSynchronizeStream接口实现Stream内任务的同步等待。
对于Host内的数据传输、Device内的数据传输、Host与Device之间的数据传输,可以调用内存复制的接口实现,也可以直接通过指针传递数据。
对于Atlas 200/300/500 推理产品,Ascend RC场景下,不涉及Host上的内存申请、Host内的数据传输、Host与Device之间的数据传输。
注意事项
如果当前版本支持多种运行形态,在这种场景下,若想实现相同的应用程序可支持在多种形态下运行,申请内存的方式不同,会影响数据传输时调用的接口:
- 使用C++标准库的接口或aclrtMallocHost接口申请Host内存、使用aclrtMalloc接口申请Device内存时:
需先调用aclrtGetRunMode接口获取软件栈的运行模式,当查询结果为ACL_HOST,则数据传输时涉及申请Host上的内存;当查询结果为ACL_DEVICE,则数据传输时不涉及申请Host上的内存,仅需申请Device上的内存。该种方式多一些代码逻辑的判断,不需要由用户处理Device上的内存对齐。在Device上运行应用的场景,该种方式少一些内存复制的步骤,性能较好。
- 使用aclrtMallocHost接口申请内存时,系统根据运行形态判断是申请Host内存还是Device内存:
无需调用aclrtGetRunMode接口获取软件栈的运行模式。该种方式代码逻辑相比前一种简单,但需由用户处理Device上的内存对齐。
父主题: 数据传输