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

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

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

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

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

接口

用途

输入内存/输出内存

acl.rt.memcpy_async

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

  • 不支持异步Host内的内存复制功能,调用本接口选择ACL_MEMCPY_HOST_TO_HOST类型进行内存复制时,任务下发成功,但系统内部处理该任务时会返回失败。
  • 调用本接口进行内存复制时,源地址和目的地址都必须64字节对齐。
  • 昇腾310 AI处理器Atlas 200 AI加速模块(RC场景)下,在板端运行应用时,选择涉及Host的内存复制类型后,系统内部会默认使用Device内的内存复制。

acl.rt.malloc

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

  • 使用acl.rt.malloc接口申请的内存,需要通过acl.rt.free接口释放内存。
  • 频繁调用acl.rt.malloc接口申请内存、调用acl.rt.free接口释放内存,会损耗性能,建议用户提前做内存预先分配或二次管理,避免频繁申请/释放内存。
  • 调用acl.rt.malloc接口申请内存时,会对用户输入的size按向上对齐成32字节整数倍后,再多加32字节。
  • 若用户使用acl.rt.malloc接口申请大块内存并自行划分、管理内存时,用户在管理内存时,每段内存需满足:内存大小向上对齐成32整数倍+32字节,且内存起始地址需满足64字节对齐。

acl.media.dvpp_malloc

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

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

实现VPC功能时,输入/输出内存的要求如下:
  • 内存地址起始要求16对齐。其中128对齐性能最高。调用acl.media.dvpp_malloc接口/acl.media.dvpp_free接口申请或释放内存。
  • 内存大小(单位Byte)与图片数据的格式相关,计算公式如下:
    • YUV400:

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

      昇腾910 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功能时:
  • 输入内存:
  • 输出内存:
    • 输出内存大小与图片数据的格式相关,计算公式如下(也可以调用acl.media.dvpp_jpeg_predict_dec_size接口预估输出内存大小):

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

      YUV422SP/YUV440SP:大于或等于widthStride*heightStride*2

      YUV444SP:大于或等于widthStride*heightStride*3

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

实现JPEGE功能时:

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

      YUV422packed:widthStride*heightStride

      YUV420SP:widthStride*heightStride*3/2

    • 输入内存首地址要求128对齐。调用acl.media.dvpp_malloc接口/acl.media.dvpp_free接口申请或释放内存。
  • 输出内存:

实现VDEC功能时:

实现VENC功能时:

实现PNGD功能时:

acl.rt.malloc_host

申请Host或Device上的内存,Device上的内存按普通页申请。同步接口。

  • 使用acl.rt.malloc_host接口申请的内存,需要通过acl.rt.free_host接口释放内存。
  • 应用在Host上运行时,调用该接口申请的是Host内存,由系统保证64字节对齐;应用在Device上运行时,调用该接口申请的是Device内存,如需64字节对齐,需要用户自行处理对齐。
  • 频繁调用acl.rt.malloc_host接口申请内存、调用acl.rt.free_host接口释放内存,会损耗性能,建议用户提前做内存预先分配或二次管理,避免频繁申请/释放内存。
  • 若用户使用acl.rt.malloc_host接口申请大块内存并自行划分、管理内存时,用户在管理内存时,每段内存需满足:内存大小向上对齐成32整数倍+32字节,且内存起始地址需满足64字节对齐。

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

图1 VDEC场景
图2 JPEGD场景