用户内存管理有两种管理方式:
- 独立内存管理,根据需要单独申请所需的内存,内存不做拆分或者二次分配。
- 内存池管理内存,用户一次性申请一块较大内存,并在使用时从这块较大内存中二次分配所需内存。
在内存二次分配时,使用如下接口从内存池申请对应内存,由于接口对申请的内存地址、大小有约束,在内存池管理时,需要关注,否则容易出现内存越界。
内存管理的总体说明请参见总体说明。
接口 |
用途 |
输入内存/输出内存 |
aclrtMemcpyAsync |
实现Host内、Host与Device之间、Device内、Device间的异步内存复制。 |
- 调用本接口进行内存复制时,源地址和目的地址都必须64字节对齐。
- 本接口是异步接口,调用接口成功仅表示任务下发成功,不表示任务执行成功。调用该接口后,一定要调用aclrtSynchronizeStream接口确保内存复制的任务已执行完成。
- 本接口不支持异步Host内的内存复制功能,因此调用本接口选择ACL_MEMCPY_HOST_TO_HOST类型进行内存复制时,任务下发成功,但系统内部处理该任务时会返回失败。
|
aclrtMalloc |
在Device上申请size大小的线性内存,通过*devPtr返回已分配内存的指针,同步接口。 |
- 使用aclrtMalloc接口申请的内存,需要通过aclrtFree接口释放内存。
- 频繁调用aclrtMalloc接口申请内存、调用aclrtFree接口释放内存,会损耗性能,建议用户提前做内存预先分配或二次管理,避免频繁申请/释放内存。
- 调用aclrtMalloc接口申请内存时,会对用户输入的size按向上对齐成32字节整数倍后,再多加32字节。
- 若用户使用aclrtMalloc接口申请大块内存并自行划分、管理内存时,每段内存需满足:内存大小向上对齐成32整数倍+32字节,且内存起始地址需满足64字节对齐。
|
acldvppMalloc |
该接口主要用于分配内存给Device侧媒体数据处理时使用,申请的大页内存满足数据处理的要求(例如,内存首地址128对齐),同步接口。调用该接口申请内存后,必须使用acldvppFree接口释放内存。 媒体数据处理各功能的详细介绍请参见媒体数据处理V1。 |
|
实现JPEGD功能时:
- 输入内存:
- 输出内存:
- 输出内存首地址要求128字节对齐。调用acldvppMalloc接口/acldvppFree接口申请或释放内存,这部分内存的生命周期由用户自行管理。
如果申请大块内存时,内存申请计算应该是(n表示图片数量):输出内存大小 +(n-1)*AlignTo128(输出内存大小+8)
- 输出内存大小(单位Byte)与图片数据的格式相关,计算公式如下(也可以调用acldvppJpegPredictDecSize接口预估输出内存大小):
YUV420SP:大于或等于widthStride*heightStride*3/2 YUV422SP/YUV440SP:大于或等于widthStride*heightStride*2 YUV444SP:大于或等于widthStride*heightStride*3
|
实现JPEGE功能时:
|
实现VDEC功能时:
|
实现VENC功能时:
|
实现PNGD功能时:
|
aclrtMallocHost |
应用在Host上运行时,调用该接口申请的是Host内存,由系统保证内存首地址64字节对齐。应用在Device上运行时,调用该接口申请的是Device内存,,且Device上的内存按普通页申请,如需首地址64字节对齐,需要用户自行处理对齐。同步接口。 |
- 使用aclrtMallocHost接口申请的内存,需要通过aclrtFreeHost接口释放内存。
- 频繁调用aclrtMallocHost接口申请内存、调用aclrtFreeHost接口释放内存,会损耗性能,建议用户提前做内存预先分配或二次管理,避免频繁申请/释放内存。
- 若用户使用aclrtMallocHost接口申请大块内存并自行划分、管理内存时,用户在管理内存时,每段内存需满足:内存大小向上对齐成32整数倍+32字节,且内存起始地址需满足64字节对齐。
|
关于媒体数据处理时自行管理内存时的典型场景如下,媒体数据处理的功能点介绍请参见
媒体数据处理V1:
图1 VDEC场景
图2 JPEGD场景