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_TYPE | RT_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),仅供参考