news 2026/7/11 15:13:47

CANN Runtime统一寻址API

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN Runtime统一寻址API

11-05 统一寻址

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

本章节描述统一/托管内存(Unified/Managed Memory)接口,用于自动迁移的内存分配、预取及属性查询。

  • aclError aclrtMemAllocManaged(void **ptr, uint64_t size, uint32_t flag):申请统一虚拟内存(Unified Virtual Memory, UVM),通过*ptr返回已申请内存的指针,且申请的内存大小会根据用户指定的size向上按2M对齐。
  • aclError aclrtMemManagedAdvise(const void *const ptr, uint64_t size, aclrtMemManagedAdviseType advise, aclrtMemManagedLocation location):管理统一虚拟内存(Unified Virtual Memory, UVM)的策略属性,既支持设置策略属性,也支持取消设置。
  • aclError aclrtMemManagedGetAttr(aclrtMemManagedRangeAttribute attribute, const void *ptr, size_t size, void *data, size_t dataSize):查询指定大小的UVM内存的策略属性值。
  • aclError aclrtMemManagedGetAttrs(aclrtMemManagedRangeAttribute *attributes, size_t numAttributes, const void *ptr, size_t size, void **data, size_t *dataSizes):查询指定大小的UVM内存的策略属性值。
  • aclError aclrtMemManagedPrefetchAsync(const void* ptr, size_t size, aclrtMemManagedLocation location, uint32_t flags, aclrtStream stream):管理统一虚拟内存(Unified Virtual Memory, UVM)的预取。
  • aclError aclrtMemManagedPrefetchBatchAsync(const void** ptrs, size_t* sizes, size_t count, aclrtMemManagedLocation* prefetchLocs, size_t* prefetchLocIdxs, size_t numPrefetchLocs, uint64_t flags, aclrtStream stream):管理统一虚拟内存(Unified Virtual Memory, UVM)的批量预取。
  • aclError aclrtMemP2PMap(void *devPtr, size_t size, int32_t dstDevId, uint64_t flags):本接口用于建立同一进程内两个Device之间的内存页表映射,以实现跨Device的内存访问,但在进行此操作前,需先调用aclrtDeviceEnablePeerAccess接口以开启两个Device间的数据交互。
  • aclError aclrtPointerGetAttributes(const void *ptr, aclrtPtrAttributes *attributes):获取内存属性信息,包括内存是位于Host还是Device、页表大小等信息。

aclrtMemAllocManaged

aclError aclrtMemAllocManaged(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:不支持

功能说明

申请统一虚拟内存(Unified Virtual Memory, UVM),通过*ptr返回已申请内存的指针,且申请的内存大小会根据用户指定的size向上按2M对齐。使用本接口申请的内存,若需释放内存,需调用aclrtFree接口。

通过本接口申请的内存仅在实际访问时才会建立虚拟内存到物理内存的页表映射关系。如果内存访问发生在Host上,则映射Host的物理内存;如果内存访问发生在Device上,则映射Device的物理内存。后续使用该内存时,每当访问内存的对象发生变更,例如,从Host变更为Device,从一个Device变更为另一个Device等,在新的访问对象上会触发缺页中断,需要将内存数据迁移到新的访问对象上,并重新建立虚拟内存到物理内存的页表映射关系,此时前一个访问对象上的页表映射关系将失效、物理内存也会释放。若频繁的更换访问对象,则会频繁触发缺页中断、频繁迁移内存数据和重新建立页表映射关系,影响性能。为了减少这种情况带来的性能开销,Runtime还提供了aclrtMemManagedAdvise接口来设置内存管理策略。

参数说明

参数名输入/输出说明
ptr输出“已分配内存的指针”的指针,由于Host和Device虚拟地址统一编址,该参数不区分申请位置。
size输入内存大小,单位Byte。
size不能为0,单个应用进程最大可申请3T UVM类型的虚拟内存。
flag输入内存标识。
当前flag仅支持设置为ACL_RT_MEM_ATTACH_GLOBAL,所对应数值为1。设置为ACL_RT_MEM_ATTACH_GLOBAL后,通过本接口申请的内存在Device和Host侧都可以被访问。
宏定义如下:
#define ACL_RT_MEM_ATTACH_GLOBAL (0x01U)

返回值说明

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

约束说明

本接口分配的内存不会进行对内容进行初始化,建议在使用内存前先调用aclrtMemset接口先初始化内存,清除内存中的随机数。




aclrtMemManagedAdvise

aclError aclrtMemManagedAdvise(const void *const ptr, uint64_t size, aclrtMemManagedAdviseType advise, aclrtMemManagedLocation location)

产品支持情况

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

功能说明

管理统一虚拟内存(Unified Virtual Memory, UVM)的策略属性,既支持设置策略属性,也支持取消设置。

本接口操作的内存必须是通过aclrtMemAllocManaged接口申请的内存,设置的策略属性值可使用aclrtMemManagedGetAttr和aclrtMemManagedGetAttrs接口查询。

参数说明

参数名输入/输出说明
ptr输入待设置属性的内存地址,地址范围必须在UVM内存范围之内,即[0x90000000000ULL, 0x90000000000ULL+3T)。
size输入内存大小,单位Byte,要求2MB对齐。取值范围为(0, 3T]。
advise输入内存策略属性。
类型定义请参见aclrtMemManagedAdviseType。
location输入物理内存的位置信息,location参数包含id和type两个成员。
类型定义请参见aclrtMemManagedLocation。

返回值说明

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




aclrtMemManagedGetAttr

aclError aclrtMemManagedGetAttr(aclrtMemManagedRangeAttribute attribute, const void *ptr, size_t size, void *data, size_t dataSize)

产品支持情况

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

功能说明

查询指定大小的UVM内存的策略属性值。

本接口操作的内存必须是通过aclrtMemAllocManaged接口分配的。若查询的这段内存范围内的策略属性值不一致,则查询结果为无效值。

与aclrtMemManagedGetAttrs接口不同,本接口仅支持一次查询一个内存策略属性的值。

参数说明

参数名输入/输出说明
attribute输入待查询的属性。类型定义请参见aclrtMemManagedRangeAttribute。
ptr输入待查询属性的内存首地址,范围必须在UVM内存范围之内,即[0x90000000000ULL, 0x90000000000ULL+3T)。
size输入待查询属性的内存大小,单位Byte。取值范围为(0, 3T]。
data输出查询结果。
dataSize输入存放查询结果的内存大小,单位Byte。

返回值说明

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




aclrtMemManagedGetAttrs

aclError aclrtMemManagedGetAttrs(aclrtMemManagedRangeAttribute *attributes, size_t numAttributes, const void *ptr, size_t size, void **data, size_t *dataSizes)

产品支持情况

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

功能说明

查询指定大小的UVM内存的策略属性值。

本接口操作的内存必须是通过aclrtMemAllocManaged接口分配的。若查询的这段内存范围内的策略属性值不一致,则查询结果为无效值。

与aclrtMemManagedGetAttr接口不同,本接口支持一次查询多个内存策略属性的值。

参数说明

参数名输入/输出说明
attributes输入待查询的属性数组。类型定义请参见aclrtMemManagedRangeAttribute。
numAttributes输入待查询的属性数组大小。
ptr输入待查询属性的内存首地址,范围必须在UVM内存范围之内,即[0x90000000000ULL, 0x90000000000ULL+3T)。
size输入待查询属性的内存大小,单位Byte。取值范围为(0, 3T]。
data输出查询结果数组。
dataSizes输入存放查询结果数组的内存大小,单位Byte。

返回值说明

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




aclrtMemManagedPrefetchAsync

aclError aclrtMemManagedPrefetchAsync(const void* ptr, size_t size, aclrtMemManagedLocation location, uint32_t flags, aclrtStream stream)

产品支持情况

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

功能说明

管理统一虚拟内存(Unified Virtual Memory, UVM)的预取。

本接口操作的内存必须是通过aclrtMemAllocManaged接口分配的。本接口是异步接口,调用接口仅表示任务下发成功,不表示任务执行成功,调用本接口后,需调用同步等待接口(例如aclrtSynchronizeStream)确保内存预取的任务已执行完成。

参数说明

参数名输入/输出说明
ptr输入待预取的内存地址,地址范围必须在UVM内存范围内存,即[0x90000000000ULL, 0x90000000000ULL+3T)。
size输入待预取的内存长度,单位Byte,要求2MB对齐。取值范围为(0, 3T]。
location输入物理内存的位置信息,location参数包含id和type两个成员。类型定义请参见aclrtMemManagedLocation。
flags输入预留参数。当前固定配置为0。
stream输入指定执行内存预取任务的Stream。类型定义请参见aclrtStream。

返回值说明

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




aclrtMemManagedPrefetchBatchAsync

aclError aclrtMemManagedPrefetchBatchAsync(const void** ptrs, size_t* sizes, size_t count, aclrtMemManagedLocation* prefetchLocs, size_t* prefetchLocIdxs, size_t numPrefetchLocs, uint64_t flags, aclrtStream stream)

产品支持情况

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

功能说明

管理统一虚拟内存(Unified Virtual Memory, UVM)的批量预取。

本接口操作的内存必须是通过aclrtMemAllocManaged接口分配的。本接口是异步接口,调用接口仅表示任务下发成功,不表示任务执行成功,调用本接口后,需调用同步等待接口(例如aclrtSynchronizeStream)确保内存预取的任务已执行完成。

参数说明

参数名输入/输出说明
ptrs输入待预取的内存地址数组,每个地址范围必须在UVM内存范围内存,即[0x90000000000ULL, 0x90000000000ULL+3T)。
sizes输入内存预取长度数组,用于存放每一段要预取的UVM内存长度,单位Byte。每段长度要求2MB对齐,取值范围为(0, 3T]。
count输入ptrs和sizes数组长度。
prefetchLocs输入物理内存的位置信息数组,每个位置信息都包含id和type两个成员。类型定义请参见aclrtMemManagedLocation。
prefetchLocIdxs输入物理内存预取信息索引数组,用于指定prefetchLocs数组中的每个物理地址适用的预取范围。对于prefetchLocs[k]指定的物理地址,将预取ptrs数组中从第prefetchLocIdxs[k]个下标到第prefetchLocIdxs[k+1]-1个下标指向元素的UVM内存地址,同时对于prefetchLocs[numPrefetchLocs-1]指定的物理地址,将预取ptrs数组中从第prefetchLocs[numPrefetchLocs-1]个下标到第count-1个下标指向元素的UVM内存地址。
numPrefetchLocs输入prefetchLocs和prefetchLocIdxs数组的长度。
flags输入预留参数。当前固定配置为0。
stream输入指定执行内存预取任务的Stream。类型定义请参见aclrtStream。

返回值说明

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

约束说明

  • 将ptrs中指定的数据预取到prefetchLocs中指定的物理内存区域,每个预取操作的大小由sizes指定,ptrs、sizes这两个数组必须具有count指定的相同长度。
  • 在预取批处理操作中,prefetchLocs数组中的每个条目可应用与多个预取操作,具体通过prefetchLocIdxs数组指定对应物理地址区域需要预取的起始UVM地址索引。prefetchLocs和prefetchLocIdxs这两个数组必须具有numPrefetchLocs指定的相同长度。例如:若批处理包含ptrs/sizes列出的10个预取操作,其中前6个需要被预取到同一块物理内存区域,后4个需要被预取到另一块物理内存区域,则numPrefetchLocs为2,prefetchLocIdxs为{0,6},prefetchLocs包含两组物理内存的位置信息。注意,prefetchLocIdxs的首个条目必须为0,且每个条目必须大于前一个条目,最后一个条目应小于count。此外numPrefetchLocs必须小于等于count。



aclrtMemP2PMap

aclError aclrtMemP2PMap(void *devPtr, size_t size, int32_t dstDevId, uint64_t flags)

产品支持情况

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

功能说明

本接口用于建立同一进程内两个Device之间的内存页表映射,以实现跨Device的内存访问,但在进行此操作前,需先调用aclrtDeviceEnablePeerAccess接口以开启两个Device间的数据交互。

调用本接口建立页表映射后,跨Device访问时不会出现内存缺页的问题,首次访问内存时性能更优。

参数说明

参数名输入/输出说明
devPtr输入Device内存地址(例如调用aclrtMalloc接口申请的Device内存),此处指共享内存提供方的内存地址。
size输入内存大小,单位Byte。
dstDevId输入Device ID,此处指共享内存使用方的ID。
flags输入预留参数,当前固定设置为0。

返回值说明

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


aclrtPointerGetAttributes

aclError aclrtPointerGetAttributes(const void *ptr, aclrtPtrAttributes *attributes)

产品支持情况

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

功能说明

获取内存属性信息,包括内存是位于Host还是Device、页表大小等信息。

参数说明

参数名输入/输出说明
ptr输入内存地址。
此处不允许传入通过aclrtHostRegister接口映射的Device地址,也不允许传入通过aclrtHostGetDevicePointer接口获取的Device地址,否则会导致未定义行为。
attributes输出内存属性信息。类型定义请参见aclrtPtrAttributes。

返回值说明

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




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

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

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

免疫调理消费需求持续攀升 牛初乳科学选购成公众关注焦点

近日,结合知乎、什么值得买等多平台公开搜索热度数据及国内营养保健品消费调研结果,牛初乳品类的选购避坑相关内容搜索量年同比上涨127%,消费者正逐步建立以资质、核心成分为核心的科学选购逻辑。 近年国内主动健康管理意识持续普及&#xff…

作者头像 李华
网站建设 2026/7/11 15:12:38

STM32F072RB与ADS131M02高精度ADC系统设计与优化

1. 为什么选择ADS131M02与STM32F072RB组合?在工业测量和精密仪器领域,ADC(模数转换器)的性能往往决定整个系统的精度上限。ADS131M02是TI推出的24位Δ-Σ型ADC,具有双通道同步采样、内置PGA和基准电压的特性&#xff0…

作者头像 李华
网站建设 2026/7/11 15:12:20

ComfyUI视频工作流插件:3种高效方法构建专业级AI视频生成管道

ComfyUI视频工作流插件:3种高效方法构建专业级AI视频生成管道 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite ComfyUI-VideoHelperSuite是专为ComfyUI…

作者头像 李华
网站建设 2026/7/11 15:11:50

AI泡沫下的技术落地:从数据准备到模型部署的实战指南

最近在技术圈和投资圈,AI 泡沫成了一个高频词。不少开发者困惑:现在学 AI 还有前途吗?企业投入 AI 项目到底值不值?本文从技术落地视角,拆解 AI 领域的真实需求与过热现象,帮开发者理性看待技术趋势&#x…

作者头像 李华
网站建设 2026/7/11 15:10:20

选择重庆广播音响设备,有哪些通用的选型标准?

大家好,我是广播音响领域无利益关联的中立资深从业者,今天为大家分享重庆广播音响设备的选型方法,不做产品推荐,仅提供选型思路。通用选型标准音质表现:音质是音响的核心,可从频率响应、失真度等方面判断。…

作者头像 李华
网站建设 2026/7/11 15:09:45

Java 转大模型开发:把关键能力落到项目里

《Java 转大模型开发:一次新的项目切入》看起来是个大话题,但真落到项目里,常常就是几个具体选择。下面我尽量按实际开发时会遇到的问题来讲。 摘要 先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做…

作者头像 李华