更新时间:2021-03-18 GMT+08:00
分享

ACL内存申请使用说明

用户内存管理有两种管理方式:

  1. 独立内存管理,根据需要单独申请所需的内存,内存不做拆分或者二次分配。
  2. 内存池管理内存,用户一次性申请一块较大内存,并在使用时从这块较大内存中二次分配所需内存。

在内存二次分配时,使用如下接口从内存池申请对应内存,由于接口对申请的内存地址、大小有约束,在内存池管理时,需要关注,否则容易出现内存越界。

接口

用途

输入内存/输出内存

aclrtMemcpyAsync

实现Host内、Host与Device之间、Device内的异步内存复制。

如果是片内Device到Device的内存复制,源地址和目的地址都必须64字节对齐。

aclrtMalloc

申请Device上的内存,同步接口。

  • 使用aclrtMalloc接口申请的内存,需要通过aclrtFree接口释放内存。
  • 频繁调用aclrtMalloc接口申请内存、调用aclrtFree接口释放内存,会损耗性能,建议用户提前做内存预先分配或二次管理,避免频繁申请/释放内存。
  • 调用aclrtMalloc接口申请内存时,会对用户输入的size按向上对齐成32字节整数倍后,再多加32字节。

acldvppMalloc

该接口主要用于分配内存给Device侧媒体数据处理时使用,申请的大页内存满足数据处理的要求(例如,内存首地址128对齐),同步接口。调用该接口申请内存后,必须使用acldvppFree接口释放内存。

媒体数据处理各功能的详细介绍请参见媒体数据处理

实现VPC功能时,输入/输出内存的要求如下
  • 内存地址起始要求16对齐。调用acldvppMalloc接口/acldvppFree接口申请或释放内存。
  • 内存大小与图片数据的格式相关,计算公式如下:

    YUV400SP、YUV420SP:widthStride*heightStride*3/2

    YUV422SP:widthStride*heightStride*2

    YUV444SP:widthStride*heightStride*3

    YUV422packed:widthStride*heightStride

    YUV444packed、RGB888:widthStride*heightStride

    XRGB8888:widthStride*heightStride

实现JPEGD功能时
  • 输入内存:
    • 输入内存的大小就是指实际的输入图片所占用的大小。
    • 输入内存首地址要求128对齐。Device的内存,调用acldvppMalloc接口/acldvppFree接口申请或释放内存。
  • 输出内存:
    • 输出内存大小与图片数据的格式相关,计算公式如下:

      YUV420SP:widthStride*heightStride*3/2

      YUV422SP:widthStride*heightStride*2

      YUV444SP:widthStride*heightStride*3

    • 输出内存首地址要求128字节对齐。Device的内存,调用acldvppMalloc接口/acldvppFree接口申请或释放内存。如果申请大块内存时,内存申请计算应该是(n表示图片数量):输出内存大小 +(n-1)*AlignTo128(输出内存大小+8)

实现JPEGE功能时

  • 关于输入内存:
    • 输入内存大小与图片数据的格式相关,计算公式如下:

      YUV422packed:widthStride*heightStride

      YUV420SP:widthStride*heightStride*3/2

    • 输入内存首地址要求128对齐。Device的内存,调用acldvppMalloc接口/acldvppFree接口申请或释放内存。
  • 关于输出内存:
    • 输出内存的大小就是指实际的编码后图片所占用的大小。
    • 输出内存首地址要求128对齐。Device的内存,调用acldvppMalloc接口/acldvppFree接口申请或释放内存。

实现VDEC功能时:

  • 关于输入内存:

    Device的内存,支持调用aclrtMalloc接口/aclrtFree接口申请/释放内存,也支持调用acldvppMalloc/acldvppFree接口申请/释放内存。

  • 关于输出内存:
    • 输出内存大小与图片数据的格式相关,计算公式如下:

      YUV420SP:widthStride*heightStride*3/2

    • 输出的内存首地址要求16对齐。Device的内存,调用aclrtMalloc接口/aclrtFree接口申请或释放内存。

实现VENC功能时:

  • 关于输入内存

    Device的内存,调用acldvppMalloc/acldvppFree申请/释放内存。

  • 关于输出内存

    不需要用户管理输出内存,由系统管理内存。

aclrtMallocHost

申请Host上的内存,同步接口。

  • 申请的内存不能在Device使用,需要显式拷贝到Device。
  • 使用aclrtMallocHost接口申请的内存,需要通过aclrtFreeHost接口释放内存。

关于媒体数据处理时自行管理内存时的典型场景:

图1 VDEC场景
图2 JPEGD场景
分享:

    相关文档

    相关产品

关闭导读