文档
注册

内存二次分配管理

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

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

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

接口

用途

输入内存/输出内存

aclrtMemcpyAsync

实现异步内存复制。

  • 调用本接口进行内存复制时,源地址和目的地址都必须64字节对齐。

aclrtMalloc

在Device上申请size大小的线性内存,该接口对用户申请的size向上对齐成32字节整数倍后再多加32字节,并通过*devPtr返回已分配内存的指针。同步接口。

  • 若用户使用本接口申请大块内存并自行划分、管理内存时,建议使用aclrtMallocAlign32接口,该接口相比aclrtMalloc接口,只会对用户申请的size向上对齐成32字节整数倍,不会再多加32字节。

    不管是aclrtMalloc接口,还是aclrtMallocAlign32接口,每段内存需同时满足以下需求:

    • 内存大小向上对齐成32整数倍+32字节(m=ALIGN_UP[len,32]+32字节);
    • 内存起始地址需满足64字节对齐(ALIGN_UP[m,64])。
    说明:

    len表示某段内存的大小,ALIGN_UP[len,k]表示向上按k字节对齐:((len-1)/k+1)*k。

acldvppMalloc

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

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

媒体数据处理的输出作为模型推理的输入时,若用户使用本接口申请大块内存并自行划分、管理内存时,每段内存需同时满足以下要求:

  • 内存大小向上对齐成32整数倍+32字节(m=ALIGN_UP[len,32]+32字节);
  • 内存起始地址需满足128字节对齐(ALIGN_UP[m,128])。
说明:

len表示某段内存的大小,ALIGN_UP[len,k]表示向上按k字节对齐:((len-1)/k+1)*k。

hi_mpi_dvpp_malloc

申请Device上的内存,申请的内存满足媒体数据处理的要求(例如,内存首地址128字节对齐)。

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

媒体数据处理的输出作为模型推理的输入时,若用户使用本接口申请大块内存并自行划分、管理时,每段内存需同时满足以下要求:

  • 内存大小向上对齐成32整数倍+32字节(m=ALIGN_UP[len,32]+32字节);
  • 内存起始地址需满足128字节对齐(ALIGN_UP[m,128])。
说明:

len表示某段内存的大小,ALIGN_UP[len,k]表示向上按k字节对齐:((len-1)/k+1)*k。

aclrtMallocHost

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

  • 若用户使用本接口申请大块内存并自行划分、管理内存时,每段内存需同时满足以下需求:
    • 内存大小向上对齐成32整数倍+32字节(m=ALIGN_UP[len,32]+32字节);
    • 内存起始地址需满足64字节对齐(ALIGN_UP[m,64])。
    说明:

    len表示某段内存的大小,ALIGN_UP[len,k]表示向上按k字节对齐:((len-1)/k+1)*k。

aclrtMallocCached

在Device上申请size大小的线性内存,通过*devPtr返回已分配内存的指针,该接口在任何场景下申请的内存都是支持cache缓存。同步接口。

其它约束与aclrtMalloc接口相同。

在计算机视觉领域,一般涉及使用媒体数据处理功能,因此会涉及以上多种内存申请接口,内存首地址涉及64字节或128字节对齐,为方便统一管理,内存首地址对齐值建议选取较大的,比如内存首地址128字节对齐。

关于媒体数据处理时自行管理内存时的典型场景如下,媒体数据处理的功能点介绍请参见媒体数据处理V1
图1 VDEC场景
图2 JPEGD场景
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词