当前位置: 首页 > news >正文

cann/runtime主机内存管理

11-02 主机内存管理

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

本章节描述主机(Host)内存的分配、释放、注册及指针获取接口。

  • aclError aclrtMallocHost(void **hostPtr, size_t size):申请Host内存(该内存是锁页内存),由系统保证内存首地址64字节对齐。
  • aclError aclrtMallocHostWithCfg(void **ptr, uint64_t size, aclrtMallocConfig *cfg):申请Host内存(该内存是锁页内存),由系统保证内存首地址64字节对齐。
  • aclError aclrtFreeHost(void *hostPtr):释放通过aclrtMallocHost接口或aclrtMallocHostWithCfg接口申请的Host内存。
  • aclError aclrtFreeHostWithDevSync(void *hostPtr):释放通过aclrtMallocHost接口或aclrtMallocHostWithCfg接口申请的Host内存。
  • aclError aclrtHostRegister(void *ptr, uint64_t size, aclrtHostRegisterType type, void **devPtr):将Host内存映射注册为Device可访问的内存地址,并获取映射后的Device内存地址。映射后的Device内存地址不能用于内存操作,例如内存复制。
  • aclError aclrtHostRegisterV2(void *ptr, uint64_t size, uint32_t flag):注册Host内存地址。
  • aclError aclrtHostGetDevicePointer(void *pHost, void **pDevice, uint32_t flag):获取由aclrtHostRegister或aclrtHostRegisterV2接口注册映射的Device内存地址。映射后的Device内存地址不能用于内存操作,例如内存复制。
  • aclError aclrtHostMemMapCapabilities(uint32_t deviceId, aclrtHacType hacType, aclrtHostMemMapCapability *capabilities):查询指定的硬件驱动加速器是否支持访问通过aclrtHostRegister接口注册的内存。
  • aclError aclrtHostUnregister(void *ptr):取消注册Host内存。

aclrtMallocHost

aclError aclrtMallocHost(void **hostPtr, size_t size)

产品支持情况

  • Ascend 950PR/Ascend 950DT:支持
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
  • Atlas 200I/500 A2 推理产品:支持
  • Atlas 推理系列产品:支持
  • Atlas 训练系列产品:支持
  • IPV350:不支持

功能说明

申请Host内存(该内存是锁页内存),由系统保证内存首地址64字节对齐。

通过本接口申请的内存,需要通过aclrtFreeHost接口或aclrtFreeHostWithDevSync接口释放内存。

参数说明

参数名输入/输出说明
hostPtr输出“已分配内存的指针”的指针。
size输入申请内存的大小,单位Byte。
size不能为0。

返回值说明

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

约束说明

  • 本接口分配的内存不会进行对内容进行初始化,建议在使用内存前先调用aclrtMemset接口先初始化内存,清除内存中的随机数。
  • 本接口内部不会进行隐式的device同步或流同步。如果申请内存成功或申请内存失败会立刻返回结果。
  • 使用aclrtMallocHost接口分配过多的锁页内存,将导致操作系统用于分页的物理内存变少,从而降低系统整体的性能。
  • 频繁调用aclrtMallocHost接口申请内存、调用aclrtFreeHost接口释放内存,会损耗性能,建议用户提前做内存预先分配或二次管理,避免频繁申请/释放内存。
  • 针对Ascend RC形态、Control CPU开放形态,Host与Device是合一的,所以申请Host内存也等同于申请Device内存。此外,申请内存时,按普通页申请。如果需要64字节对齐的首地址,用户需自行处理对齐问题。
<!-- npu="310p,310b" id9 -->
  • 针对Ascend RC形态、Control CPU开放形态,若用户使用本接口申请大块内存并自行划分、管理内存时,每段内存需同时满足以下需求,其中,len表示某段内存的大小,ALIGN_UP[len,k]表示向上按k字节对齐:((len-1)/k+1)*k:
    • 内存大小向上对齐成32整数倍+32字节(m=ALIGN_UP[len,32]+32字节);
    • 内存起始地址需满足64字节对齐(ALIGN_UP[m,64])。



aclrtMallocHostWithCfg

aclError aclrtMallocHostWithCfg(void **ptr, uint64_t size, aclrtMallocConfig *cfg)

产品支持情况

  • Ascend 950PR/Ascend 950DT:支持
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
  • Atlas 200I/500 A2 推理产品:支持
  • Atlas 推理系列产品:支持
  • Atlas 训练系列产品:支持
  • IPV350:不支持

功能说明

申请Host内存(该内存是锁页内存),由系统保证内存首地址64字节对齐。

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

通过本接口申请的内存,需要通过aclrtFreeHost接口或aclrtFreeHostWithDevSync接口释放内存。

针对Ascend RC形态、Control CPU开放形态,Host与Device是合一的,所以申请Host内存也等同于申请Device内存。此外,申请内存时,按普通页申请。如果需要64字节对齐的首地址,用户需自行处理对齐问题。

参数说明

参数名输入/输出说明
ptr输出“已分配内存的指针”的指针。
size输入申请内存的大小,单位Byte。
size不能为0。
cfg输入内存配置信息。类型定义请参见aclrtMallocConfig。
不指定配置时,此处可传NULL。

返回值说明

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




aclrtFreeHost

aclError aclrtFreeHost(void *hostPtr)

产品支持情况

  • Ascend 950PR/Ascend 950DT:支持
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
  • Atlas 200I/500 A2 推理产品:支持
  • Atlas 推理系列产品:支持
  • Atlas 训练系列产品:支持
  • IPV350:不支持

功能说明

释放通过aclrtMallocHost接口或aclrtMallocHostWithCfg接口申请的Host内存。

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

参数说明

参数名输入/输出说明
hostPtr输入待释放内存的指针。

返回值说明

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




aclrtFreeHostWithDevSync

aclError aclrtFreeHostWithDevSync(void *hostPtr)

产品支持情况

  • Ascend 950PR/Ascend 950DT:支持
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
  • Atlas 200I/500 A2 推理产品:支持
  • Atlas 推理系列产品:支持
  • Atlas 训练系列产品:支持
  • IPV350:不支持

功能说明

释放通过aclrtMallocHost接口或aclrtMallocHostWithCfg接口申请的Host内存。

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

参数说明

参数名输入/输出说明
hostPtr输入待释放内存的指针。

返回值说明

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




aclrtHostRegister

aclError aclrtHostRegister(void *ptr, uint64_t size, aclrtHostRegisterType type, void **devPtr)

产品支持情况

  • Ascend 950PR:支持
  • Ascend 950DT:不支持
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
  • Atlas 200I/500 A2 推理产品:不支持
  • Atlas 推理系列产品:不支持
  • Atlas 训练系列产品:不支持
  • IPV350:不支持

功能说明

将Host内存映射注册为Device可访问的内存地址,并获取映射后的Device内存地址,该地址仅支持在Device上访问,例如作为核函数的参数,供Device的AI Core访问。若涉及Host侧的内存处理,需使用原始Host内存地址。

取消注册Host内存需调用aclrtHostUnregister接口。

参数说明

参数名输入/输出说明
ptr输入Host内存地址。
Host内存地址需4K页对齐。
当os内核版本为5.10或更低时,使用非锁页内存会导致异常,因此必须调用aclrtMallocHost接口来申请Host锁页内存。
当os内核版本为5.10以上时,支持使用非锁页的Host内存,因此既支持调用aclrtMallocHost接口申请Host锁页内存,也支持使用malloc接口申请Host非锁页内存。
size输入内存大小,单位Byte。
type输入内存注册类型。类型定义请参见aclrtHostRegisterType。
devPtr输出Host内存映射成的Device可访问的内存地址。

返回值说明

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




aclrtHostRegisterV2

aclError aclrtHostRegisterV2(void *ptr, uint64_t size, uint32_t flag)

产品支持情况

  • Ascend 950PR:支持
  • Ascend 950DT:不支持
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
  • Atlas 200I/500 A2 推理产品:不支持
  • Atlas 推理系列产品:不支持
  • Atlas 训练系列产品:不支持
  • IPV350:不支持

功能说明

注册Host内存地址。

取消注册需调用aclrtHostUnregister接口。

参数说明

参数名输入/输出说明
ptr输入Host内存地址。
Host内存地址需4K页对齐。
当os内核版本为5.10或更低时,使用非锁页内存会导致异常,因此必须调用aclrtMallocHost接口来申请Host锁页内存。
当os内核版本为5.10以上时,支持使用非锁页的Host内存,因此既支持调用aclrtMallocHost接口申请Host锁页内存,也支持使用malloc接口申请Host非锁页内存。
size输入内存大小,单位Byte。
flag输入内存注册类型。
取值为如下宏,支持配置单个宏,也支持配置多个宏位或(例如ACL_HOST_REG_MAPPED | ACL_HOST_REG_PINNED):

- ACL_HOST_REG_MAPPED:将Host内存映射注册为Device可访问的内存地址,再配合调用aclrtHostGetDevicePointer接口获取映射后的Device内存地址。
- ACL_HOST_REG_IOMEMORY:将Host上第三方PCIe设备的IO space(寄存器、缓存)映射注册为Device可访问,包括读写。预留选项,当前不支持。
- ACL_HOST_REG_READONLY:Host内存映射注册为Device只读。预留选项,当前不支持。
- ACL_HOST_REG_PINNED:将Host非锁页内存注册为锁页内存。Host非锁页内存可通过C/C++标准库函数(如malloc、calloc、new)或默认的mmap系统调用等方式申请。

宏定义如下:
#define ACL_HOST_REG_MAPPED 0x2UL
#define ACL_HOST_REG_IOMEMORY 0x4UL
#define ACL_HOST_REG_READONLY 0x8UL
#define ACL_HOST_REG_PINNED 0X10000000UL

返回值说明

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




aclrtHostGetDevicePointer

aclError aclrtHostGetDevicePointer(void *pHost, void **pDevice, uint32_t flag)

产品支持情况

  • Ascend 950PR:支持
  • Ascend 950DT:不支持
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
  • Atlas 200I/500 A2 推理产品:不支持
  • Atlas 推理系列产品:不支持
  • Atlas 训练系列产品:不支持
  • IPV350:不支持

功能说明

获取由aclrtHostRegister或aclrtHostRegisterV2接口注册映射的Device内存地址。映射后的Device内存地址不能用于内存操作,例如内存复制。

参数说明

参数名输入/输出说明
pHost输入通过aclrtHostRegister或aclrtHostRegisterV2接口注册映射的Host内存地址。
pDevice输出Host内存映射成的Device内存地址。
flag输入预留参数,当前固定配置为0。

返回值说明

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




aclrtHostMemMapCapabilities

aclError aclrtHostMemMapCapabilities(uint32_t deviceId, aclrtHacType hacType, aclrtHostMemMapCapability *capabilities)

产品支持情况

  • Ascend 950PR/Ascend 950DT:支持
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
  • Atlas 200I/500 A2 推理产品:支持
  • Atlas 推理系列产品:支持
  • Atlas 训练系列产品:支持
  • IPV350:不支持

功能说明

查询指定的硬件驱动加速器是否支持访问通过aclrtHostRegister接口注册的内存。

参数说明

参数名输入/输出说明
deviceId输入Device ID。
用户调用aclrtGetDeviceCount接口获取可用的Device数量后,这个Device ID的取值范围:[0, (可用的Device数量-1)]
hacType输入HAC(Hardware Accelerator Controller,硬件加速控制器)类型。类型定义请参见aclrtHacType。
capabilities输出是否支持访问通过aclrtHostRegister接口注册的内存。类型定义请参见aclrtHostMemMapCapability。

返回值说明

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




aclrtHostUnregister

aclError aclrtHostUnregister(void *ptr)

产品支持情况

  • Ascend 950PR:支持
  • Ascend 950DT:不支持
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
  • Atlas 200I/500 A2 推理产品:不支持
  • Atlas 推理系列产品:不支持
  • Atlas 训练系列产品:支持
  • IPV350:不支持

功能说明

取消注册Host内存。

本接口与aclrtHostRegister或aclrtHostRegisterV2接口成对使用。

参数说明

参数名输入/输出说明
ptr输入Host侧内存地址。

返回值说明

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

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

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

http://www.jsqmd.com/news/1168077/

相关文章:

  • 城通网盘下载太慢?这个免费开源工具让你的速度提升10倍
  • FanControl:Windows平台开源风扇控制软件完全指南
  • 如何用digiCamControl实现专业级相机遥控:从新手到高手的完整指南
  • Neo4j AuraDB 与 Docker 社区版部署对比:3 大场景下的成本与性能实测
  • 买韩国商标别踩坑!2026 正规韩国商标购买网站深度测评,一文看懂怎么选 - GrowUME
  • 苏州性价比高的美食去哪家?景区核心地段高价值餐饮解析 - 新闻快传
  • Citra 3DS模拟器终极指南:如何在PC上完美运行任天堂3DS游戏
  • 2026年PMP超全指南:考试安排+改版解读+避坑攻略,一篇足够
  • 2026筑宅安|南京阳光房漏水专业修缮,家装商用玻璃顶渗漏、屋面工程一站式根治渗水难题 - 筑宅安
  • 鹤壁办婚宴,烟酒怎么备不浪费又体面?
  • 《2026 家庭住宅防水维修服务白皮书正式发布》 - 徽顺虹
  • UE5.4引擎升级导致UE4SS签名失效?手把手教你定位并修复FText构造函数签名
  • 群晖 DS920plus 部署 MT Photos:docker run 实测(含权限踩坑)
  • 2026年聚成管道领衔防腐钢管品牌盘点 选购避坑与实力梯队梳理 - 资讯报道
  • AI赋能单细胞分析:让细胞注释更精准
  • Firestorm安全最佳实践:保护你的社区数据
  • Unity UGUI Super ScrollView性能优化:对象池与数据驱动实战解析
  • 2026西安醪糟哪家好?看这篇就够了 - 新闻快传
  • XML Notepad完整指南:微软官方XML编辑器的6百万次下载秘诀
  • 洛雪音乐音源终极指南:如何快速获取全网最新音乐资源
  • UDP通信相关问题
  • 终极指南:如何用MidiEditor实现专业级MIDI音乐制作与编辑
  • TMC7300驱动芯片与PIC18F26K20的有刷直流电机控制方案
  • Claude Code深度工作流:252亿token淬炼的工程化实践指南
  • PIC单片机与D类放大器构建可编程警报系统
  • L9958与PIC32MX675F256L电机控制方案优化解析
  • 怎样判定闭循环低温恒温器的好坏呢
  • 突破硬件性能边界:3大核心功能解锁AMD Ryzen隐藏潜力
  • 2026年石家庄大专院校挑选攻略:石家庄康养职业学院等特色院校整理 - 资讯报道
  • 专业相机遥控神器digiCamControl:解锁你的单反相机无限潜能