内存管理(昇腾310 AI处理器

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

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

内存管理的总体说明请参见总体说明

接口

用途

输入内存/输出内存

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

实现VPC功能时,输入/输出内存的要求如下
  • 内存地址起始要求16对齐。其中128对齐性能最高。调用acldvppMalloc接口/acldvppFree接口申请或释放内存,这部分内存的生命周期由用户自行管理。
  • 内存大小(单位Byte)与图片数据的格式相关,计算公式如下:
    • YUV400:

      昇腾310 AI处理器,计算公式:widthStride*heightStride*3/2

    • YUV420SP:widthStride*heightStride*3/2
    • YUV422SP:widthStride*heightStride*2
    • YUV444SP:widthStride*heightStride*3
    • YUV422packed:widthStride*heightStride
    • YUV444packed、RGB888:widthStride*heightStride
    • ARGB8888:widthStride*heightStride
实现JPEGD功能时
  • 输入内存:
    • 输入内存首地址要求128对齐。调用acldvppMalloc接口/acldvppFree接口申请或释放内存,这部分内存的生命周期由用户自行管理。
    • 输入内存的大小就是指实际的输入图片所占用的大小。
  • 输出内存:
    • 输出内存首地址要求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功能时

  • 输入内存:
    • 输入内存首地址要求128对齐。调用acldvppMalloc接口/acldvppFree接口申请或释放内存,这部分内存的生命周期由用户自行管理。
    • 输入内存大小(单位Byte)与图片数据的格式相关,计算公式如下:

      YUV422packed:widthStride*heightStride

      YUV420SP:widthStride*heightStride*3/2

  • 输出内存:
    • 输出内存的大小就是指实际的编码后图片所占用的大小。可调用acldvppJpegPredictEncSize接口预估输出内存大小。
    • 输出内存首地址要求128对齐。调用acldvppMalloc接口/acldvppFree接口申请或释放内存,这部分内存的生命周期由用户自行管理。

实现VDEC功能时:

  • 输入内存:

    支持调用aclrtMalloc/aclrtFree接口或aclrtMallocHost/aclrtFreeHost接口申请/释放内存,也支持调用acldvppMalloc/acldvppFree接口申请/释放内存,这部分内存的生命周期由用户自行管理。

  • 输出内存:
    • 输出的内存首地址要求16对齐。调用acldvppMalloc接口/acldvppFree接口申请或释放内存,这部分内存的生命周期由用户自行管理。
    • 输出内存大小(单位Byte)与图片数据的格式相关,计算公式如下:

      YUV420SP:大于或等于widthStride*heightStride*3/2

实现VENC功能时:

  • 输入内存:

    输入内存首地址要求16对齐。Device的内存,调用acldvppMalloc/acldvppFree接口申请/释放内存,这部分内存的生命周期由用户自行管理。

    输入内存大小(单位Byte)计算公式:widthStride*heightStride*3/2。

  • 输出内存

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

实现PNGD功能时:

  • 输入内存:
    • 输入内存首地址要求128对齐。调用acldvppMalloc接口/acldvppFree接口申请或释放内存,这部分内存的生命周期由用户自行管理。
    • 输入内存的大小就是指实际的输入图片所占用的大小。
  • 输出内存:

aclrtMallocHost

应用在Host上运行时,调用该接口申请的是Host内存,由系统保证内存首地址64字节对齐。应用在Device上运行时,调用该接口申请的是Device内存,,且Device上的内存按普通页申请,如需首地址64字节对齐,需要用户自行处理对齐。同步接口。

  • 使用aclrtMallocHost接口申请的内存,需要通过aclrtFreeHost接口释放内存。
  • 频繁调用aclrtMallocHost接口申请内存、调用aclrtFreeHost接口释放内存,会损耗性能,建议用户提前做内存预先分配或二次管理,避免频繁申请/释放内存。
  • 若用户使用aclrtMallocHost接口申请大块内存并自行划分、管理内存时,用户在管理内存时,每段内存需满足:内存大小向上对齐成32整数倍+32字节,且内存起始地址需满足64字节对齐。
关于媒体数据处理时自行管理内存时的典型场景如下,媒体数据处理的功能点介绍请参见媒体数据处理V1
图1 VDEC场景
图2 JPEGD场景