【2023 · CANN训练营第一季】内存管理&数据运输初探
2023 · CANN训练营第一季】内存管理&数据运输初探
一、接口简介
Note:
1.在Device侧,任何用于参与ACL运算的内存,都不能用C/C++原生的(Malloc、new),需要调用ACL的内存管理接口
2.所有的加速运算(数据集、模型等)都在Device侧运行计算。
3.以下接口都有对应的非同步接口,非同步接口查看是否完成需要用到aclrtSynchronizeStream查看是否Stream运行完成
接口:
aclError aclrtMalloc(void devPtr, size_t size, aclrtMemMallocPolicy policy) //在Device上申请size大小的线性内存,通过*devPtr返回已分配内存的指针,同步接口。通过该接口申请的Device内存都支持cache缓存,不需要用户处理cpu与npu之间的cache一致性。
aclError aclrtFree(void *devPtr)//释放Device上的内存,同步接口。只能释放非Host端申请的内存
aclError aclrtMallocHost(void hostPtr, size_t size) //应用在Host上运行时,调用该接口申请的是Host内存,由系统保证内存首地址64字节对齐。在Device侧用这个接口还是申请的device内存,不过需要首地址用户来对其64字节
aclError aclrtFreeHost(void *hostPtr) //释放aclrtMallocHost申请的内存,同步接口
aclError aclrtMemset (void *devPtr, size_t maxCount, int32_t value, size_t count) //初始化内存,将内存中的内容设置为指定的值,同步接口。
aclError aclrtMemcpy(void *dst, size_t destMax, const void *src, size_t count, aclrtMemcpyKind kind) //实现Host内、Host与Device之间、Device内、Device间的同步内存复制。
aclError aclrtGetMemInfo(aclrtMemAttr attr, size_t free, size_t total) //获取指定属性的内存的空闲大小和总大小。同步接口。
二、代码验证学习
Cmake编译:

运行结果:

三、速度测试
搬移速度测试如下:(只是简单测试。没有测试的很全)

ps:该文仅是为了记录CANN训练营的学习过程所用,不参与任何商业用途,有代码问题可以私下与我交流修改