news 2026/5/9 16:51:39

CANN Runtime设备内存分配与释放

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN Runtime设备内存分配与释放

11-01 设备内存分配与释放

【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime

本章节描述设备(Device)内存的分配与释放接口。

  • aclError aclrtMalloc(void **devPtr, size_t size, aclrtMemMallocPolicy policy):在Device上分配size大小的线性内存,并通过*devPtr返回已分配内存的指针,且内存首地址64字节对齐。
  • aclError aclrtMallocAlign32(void **devPtr, size_t size, aclrtMemMallocPolicy policy):在Device上分配size大小的线性内存,并通过*devPtr返回已分配内存的指针。
  • aclError aclrtMallocCached(void **devPtr, size_t size, aclrtMemMallocPolicy policy):在Device上申请size大小的线性内存,通过*devPtr返回已分配内存的指针,该接口在任何场景下申请的内存都是支持Cache缓存。
  • aclError aclrtMallocWithCfg(void **devPtr, size_t size, aclrtMemMallocPolicy policy, aclrtMallocConfig *cfg):在Device上分配size大小的线性内存,并通过*devPtr返回已分配内存的指针,且内存首地址64字节对齐。
  • aclError aclrtMallocForTaskScheduler(void **devPtr, size_t size, aclrtMemMallocPolicy policy, aclrtMallocConfig *cfg):申请AI处理器上Task调度器可使用的内存。
  • aclError aclrtFree(void *devPtr):释放Device上的内存。
  • aclError aclrtFreeWithDevSync(void *devPtr):释放Device上的内存。
  • aclError aclrtGetMemInfo(aclrtMemAttr attr, size_t *free, size_t *total):根据指定属性,获取Device上可用内存的空闲大小和总大小,不包括系统预留内存大小。
  • aclError aclrtGetMemUsageInfo(int32_t deviceId, aclrtMemUsageInfo *memUsageInfo, size_t inputNum, size_t *outputNum):查询组件的内存使用信息,包括组件名称、当前内存大小和峰值内存大小等信息。
  • aclError aclrtCheckMemType(void** addrList, uint32_t size, uint32_t memType, uint32_t *checkResult, uint32_t reserve):检查Device内存类型。

aclrtMalloc

aclError aclrtMalloc(void **devPtr, size_t size, aclrtMemMallocPolicy policy)

产品支持情况

产品是否支持
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品

功能说明

在Device上分配size大小的线性内存,并通过*devPtr返回已分配内存的指针,且内存首地址64字节对齐。使用本接口申请的内存,需要通过aclrtFree接口或aclrtFreeWithDevSync接口释放内存。

本接口分配的内存,会进行字节对齐,对齐规则各产品型号有所不同:

  • 对于Ascend 950PR/Ascend 950DT,本接口分配的内存,会进行字节对齐,会对用户申请的size向上对齐成32字节整数倍。
  • 对于以下产品型号,本接口分配的内存,会进行字节对齐,会对用户申请的size向上对齐成32字节整数倍后再多加32字节。但对于内存申请粒度为1G的大页内存,为节省大页内存,本接口会对用户申请的size仅向上对齐成32字节整数倍,不会再增加32字节。
    • Atlas A3 训练系列产品/Atlas A3 推理系列产品
    • Atlas A2 训练系列产品/Atlas A2 推理系列产品

参数说明

参数名输入/输出说明
devPtr输出“Device上已分配内存的指针”的指针。
size输入申请内存的大小,单位Byte。
size不能为0。
policy输入内存分配规则。类型定义请参见aclrtMemMallocPolicy。
若配置的内存分配规则超出aclrtMemMallocPolicy取值范围,size≥2M时,按大页申请内存,否则按普通页申请内存。

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError。

约束说明

  • 本接口分配的内存不会对内容初始化,建议在使用内存前先调用aclrtMemset接口先初始化内存,清除内存中的随机数。
  • 本接口内部不会进行隐式的Device同步或流同步,如果申请内存成功或申请内存失败会立刻返回结果。
  • 频繁调用aclrtMalloc接口申请内存、调用aclrtFree接口释放内存,会损耗性能,建议用户提前做内存预先分配或二次管理,避免频繁申请/释放内存。
  • 若用户需申请大块内存并自行划分、管理内存时,每段内存需同时满足以下需求,其中,len表示某段内存的大小,ALIGN_UP[len,k]表示向上按k字节对齐:((len-1)/k+1)*k:
    • 内存大小对齐规则,各产品型号有所不同:

      • 对于Ascend 950PR/Ascend 950DT,内存大小向上对齐成32整数倍(m=ALIGN_UP[len,32]字节)。

      • 对于以下产品型号,内存大小向上对齐成32整数倍+32字节(m=ALIGN_UP[len,32]+32字节)。

        Atlas A3 训练系列产品/Atlas A3 推理系列产品

        Atlas A2 训练系列产品/Atlas A2 推理系列产品

    • 内存起始地址需满足64字节对齐(ALIGN_UP[m,64])。




aclrtMallocAlign32

aclError aclrtMallocAlign32(void **devPtr, size_t size, aclrtMemMallocPolicy policy)

产品支持情况

产品是否支持
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品

功能说明

在Device上分配size大小的线性内存,并通过*devPtr返回已分配内存的指针。本接口分配的内存会进行字节对齐,会对用户申请的size向上对齐成32字节整数倍。使用本接口申请的内存,需要通过aclrtFree接口或aclrtFreeWithDevSync接口释放内存。

对于Ascend 950PR/Ascend 950DT,本接口功能等同于aclrtMalloc接口。

对于以下产品型号,与aclrtMalloc接口相比,本接口只会对用户申请的size向上对齐成32字节整数倍,不会再多加32字节。

  • Atlas A3 训练系列产品/Atlas A3 推理系列产品
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品

参数说明

参数名输入/输出说明
devPtr输出“Device上已分配内存的指针”的指针。
size输入申请内存的大小,单位Byte。
size不能为0。
policy输入内存分配规则。类型定义请参见aclrtMemMallocPolicy。
若配置的内存分配规则超出aclrtMemMallocPolicy取值范围,size≥2M时,按大页申请内存,否则按普通页申请内存。

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError。

约束说明

  • 本接口分配的内存不会进行对内容进行初始化。

  • 本接口内部不会进行隐式的Device同步或流同步。如果申请内存成功或申请内存失败会立刻返回结果。

  • 频繁调用aclrtMallocAlign32接口申请内存、调用aclrtFree接口释放内存,会损耗性能,建议用户提前做内存预先分配或二次管理,避免频繁申请/释放内存。

  • 若用户使用本接口申请大块内存并自行划分、管理内存时,每段内存需同时满足以下需求,其中,len表示某段内存的大小,ALIGN_UP[len,k]表示向上按k字节对齐:((len-1)/k+1)*k:

    • 内存大小对齐规则,各产品型号有所不同:

      • 对于Ascend 950PR/Ascend 950DT,内存大小向上对齐成32整数倍(m=ALIGN_UP[len,32]字节)。

      • 对于以下产品型号,内存大小向上对齐成32整数倍+32字节(m=ALIGN_UP[len,32]+32字节)。

        Atlas A3 训练系列产品/Atlas A3 推理系列产品

        Atlas A2 训练系列产品/Atlas A2 推理系列产品

    • 内存起始地址需满足64字节对齐(ALIGN_UP[m,64])。




aclrtMallocCached

aclError aclrtMallocCached(void **devPtr, size_t size, aclrtMemMallocPolicy policy)

产品支持情况

产品是否支持
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品

功能说明

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

使用aclrtMallocCached接口申请的内存与使用aclrtMalloc接口申请的内存是等价的,都支持Cache缓存,不需要用户处理CPU与NPU之间的Cache一致性。

参数说明

参数名输入/输出说明
devPtr输出“Device上已分配内存的指针”的指针。
size输入申请内存的大小,单位Byte。
size不能为0。
policy输入内存分配规则。类型定义请参见aclrtMemMallocPolicy。
若配置的内存分配规则超出aclrtMemMallocPolicy取值范围,size≥2M时,按大页申请内存,否则按普通页申请内存。

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError。




aclrtMallocWithCfg

aclError aclrtMallocWithCfg(void **devPtr, size_t size, aclrtMemMallocPolicy policy, aclrtMallocConfig *cfg)

产品支持情况

产品是否支持
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品

功能说明

在Device上分配size大小的线性内存,并通过*devPtr返回已分配内存的指针,且内存首地址64字节对齐。

与aclrtMalloc接口相比,本接口在申请内存时,还可以指定内存相关的配置信息。

使用本接口申请的内存,需要通过aclrtFree接口或aclrtFreeWithDevSync接口释放内存。

参数说明

参数名输入/输出说明
devPtr输出“Device上已分配内存的指针”的指针。
size输入申请内存的大小,单位Byte。
size不能为0。
policy输入内存分配规则。类型定义请参见aclrtMemMallocPolicy。
若配置的内存分配规则超出aclrtMemMallocPolicy取值范围,size≥2M时,按大页申请内存,否则按普通页申请内存。
cfg输入内存配置信息。类型定义请参见aclrtMallocConfig。
不指定配置时,此处可传NULL。

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError。




aclrtMallocForTaskScheduler

aclError aclrtMallocForTaskScheduler(void **devPtr, size_t size, aclrtMemMallocPolicy policy, aclrtMallocConfig *cfg)

产品支持情况

产品是否支持
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品

功能说明

申请AI处理器上Task调度器可使用的内存。

图模式下有部分算子需要使用该类型的内存。

参数说明

参数名输入/输出说明
devPtr输出“Device上已分配内存的指针”的指针。
size输入申请内存的大小,单位Byte。
size不能为0。
policy输入内存分配规则。类型定义请参见aclrtMemMallocPolicy。
若配置的内存分配规则超出aclrtMemMallocPolicy取值范围,size≥2M时,按大页申请内存,否则按普通页申请内存。
cfg输入内存配置信息。类型定义请参见aclrtMallocConfig。
不指定配置时,此处可传NULL。

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError。




aclrtFree

aclError aclrtFree(void *devPtr)

产品支持情况

产品是否支持
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品

功能说明

释放Device上的内存。

本接口会立刻释放传入的内存,接口内部不会进行隐式的Device同步或流同步、也不会等待使用该内存的任务完成。用户需确保在调用本接口后不再访问该内存指针。

参数说明

参数名输入/输出说明
devPtr输入待释放内存的指针。
如果传入的devPtr为空指针,本接口会返回报错。

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError。

约束说明

aclrtFree接口只能释放通过aclrtMalloc接口或aclrtMallocCached接口或aclrtMallocAlign32接口申请的内存。




aclrtFreeWithDevSync

aclError aclrtFreeWithDevSync(void *devPtr)

产品支持情况

产品是否支持
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品

功能说明

释放Device上的内存。

本接口内部会进行隐式的Device同步,并等待使用该内存的任务完成。

参数说明

参数名输入/输出说明
devPtr输入待释放内存的指针。
如果传入的devPtr为空指针,本接口会返回报错。

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError。




aclrtGetMemInfo

aclError aclrtGetMemInfo(aclrtMemAttr attr, size_t *free, size_t *total)

产品支持情况

产品是否支持
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品

功能说明

根据指定属性,获取Device上可用内存的空闲大小和总大小,不包括系统预留内存大小。

参数说明

参数名输入/输出说明
attr输入需要查询的内存的属性值。类型定义请参见aclrtMemAttr。
free输出对应属性内存空闲大小的指针,单位Byte。
total输出对应属性内存总大小的指针,单位Byte。

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError。

约束说明

  • 调用本接口前必须先指定用于计算的Device(例如调用aclrtSetDevice接口指定用于计算的Device),因此本接口中不体现Device ID。
  • 请根据实际硬件支持的情况选择相应的内存属性;否则,通过本接口获取的空闲大小和总大小都将为0。如果硬件不支持HBM内存,在查询HBM内存信息时,接口将自动转换为查询DDR内存信息,例如,查询ACL_HBM_MEM时,接口实际会查询ACL_DDR_MEM。



aclrtGetMemUsageInfo

aclError aclrtGetMemUsageInfo(int32_t deviceId, aclrtMemUsageInfo *memUsageInfo, size_t inputNum, size_t *outputNum)

产品支持情况

产品是否支持
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品

功能说明

查询组件的内存使用信息,包括组件名称、当前内存大小和峰值内存大小等信息。

参数说明

参数名输入/输出说明
deviceId输入Device ID。
用户调用aclrtGetDeviceCount接口获取可用的Device数量后,这个Device ID的取值范围:[0, (可用的Device数量-1)]
memUsageInfo输入&输出内存使用信息数组。类型定义请参见aclrtMemUsageInfo。
该参数作为输入时,由用户传入aclrtMemUsageInfo结构体指针,其内存大小需确保足以存放inputNum个组件的内存使用信息。
该参数作为输出时,可以获取组件名称、当前内存大小和峰值内存大小等信息。memUsageInfo数组中的元素按照当前内存占用量从大到小排序。
inputNum输入指定需查询的组件数量。
如果实际组件数量少于inputNum,则按实际组件数量查询。
outputNum输出实际查询到的组件数量。

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError。




aclrtCheckMemType

aclError aclrtCheckMemType(void** addrList, uint32_t size, uint32_t memType, uint32_t *checkResult, uint32_t reserve)

产品支持情况

产品是否支持
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品

功能说明

检查Device内存类型。

参数说明

参数名输入/输出说明
addrList输入Device内存地址数组。
size输入addrList数组大小。
memType输入Device内存类型。若addrList数组中有多种不同类型的内存地址,则memType处需配置为多种内存类型位或,例如配置为:RT_MEM_MASK_DEV_TYPERT_MEM_MASK_DVPP_TYPE
当前支持设置为如下宏:

- ACL_RT_MEM_TYPE_DEV:表示调用aclrtMalloc、aclrtMallocWithCfg等接口申请的Device内存。


- ACL_RT_MEM_TYPE_DVPP:表示DVPP专用的Device内存,可调用相关内存申请接口(例如hi_mpi_dvpp_malloc)申请该内存。Ascend 950PR/Ascend 950DT中不再有单独的DVPP Device内存类型,而是当做普通Device内存处理。
- ACL_RT_MEM_TYPE_RSVD:表示调用aclrtReserveMemAddress接口预留的虚拟内存。


宏定义如下:
#define ACL_RT_MEM_TYPE_DEV (0X2U)
#define ACL_RT_MEM_TYPE_DVPP (0X8U)
#define ACL_RT_MEM_TYPE_RSVD (0X10U)
checkResult输出检查addrList数组中内存地址类型与memType处是否匹配。

- 1:匹配
- 0:不匹配
reserve输入预留参数,当前固定配置为0。

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError。

【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 16:50:43

Chrono-Ward:时间感知框架,解决时间相关幽灵问题

1. 项目概述:一个时间维度的安全守护者最近在整理自己的开源项目时,发现一个挺有意思的现象:很多开发者,包括我自己,都曾遇到过类似的问题——某个依赖库在特定时间点之后突然“行为异常”,或者一个线上服务…

作者头像 李华
网站建设 2026/5/9 16:49:33

CANN/community测试策略模板

xx版本测试策略 【免费下载链接】community 本项目是CANN开源社区的核心管理仓库,包含社区的治理章程、治理组织、通用操作指引及流程规范等基础信息 项目地址: https://gitcode.com/cann/community 概述 描述本策略覆盖的范围(新增特性、继承特…

作者头像 李华
网站建设 2026/5/9 16:43:33

CANN/opbase预留执行器接口

预留接口 【免费下载链接】opbase 本项目是CANN算子库的基础框架库,为算子提供公共依赖文件和基础调度能力。 项目地址: https://gitcode.com/cann/opbase 本章接口为预留接口,后续有可能变更或废弃,不建议开发者使用,开发…

作者头像 李华
网站建设 2026/5/9 16:43:04

基于MCP协议的智能核保系统:AI如何重塑保险风险评估流程

1. 项目概述:当保险遇上AI,核保智能化的新引擎最近在和一些保险科技圈的朋友交流时,大家频繁提到一个词:智能核保。传统保险核保,尤其是复杂的人身险、健康险或企业财产险,高度依赖核保师的经验。一份投保申…

作者头像 李华
网站建设 2026/5/9 16:34:13

Python slicing 三重世界:list、NumPy、pandas 的底层规则与工程避坑

1. 项目概述:为什么 slicing 是 Python 开发者每天都在用、却很少真正“懂透”的底层能力你有没有过这种经历:写完一段 slicing 代码,运行结果和预期差了一位——明明想取第2到第4个元素,结果只拿到两个;或者在 NumPy …

作者头像 李华