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、页表大小等信息。aclrtMemAllocManagedaclError aclrtMemAllocManaged(void **ptr, uint64_t size, uint32_t flag)产品支持情况产品是否支持Ascend 950PR/Ascend 950DT☓Atlas A3 训练系列产品/Atlas A3 推理系列产品☓Atlas A2 训练系列产品/Atlas A2 推理系列产品√功能说明申请统一虚拟内存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接口先初始化内存清除内存中的随机数。aclrtMemManagedAdviseaclError aclrtMemManagedAdvise(const void *const ptr, uint64_t size, aclrtMemManagedAdviseType advise, aclrtMemManagedLocation location)产品支持情况产品是否支持Ascend 950PR/Ascend 950DT☓Atlas A3 训练系列产品/Atlas A3 推理系列产品☓Atlas A2 训练系列产品/Atlas A2 推理系列产品√功能说明管理统一虚拟内存Unified Virtual Memory, UVM的策略属性既支持设置策略属性也支持取消设置。本接口操作的内存必须是通过aclrtMemAllocManaged接口申请的内存设置的策略属性值可使用aclrtMemManagedGetAttr和aclrtMemManagedGetAttrs接口查询。参数说明参数名输入/输出说明ptr输入待设置属性的内存地址地址范围必须在UVM内存范围之内即[0x90000000000ULL, 0x90000000000ULL3T)。size输入内存大小单位Byte要求2MB对齐。取值范围为(0, 3T]。advise输入内存策略属性。类型定义请参见aclrtMemManagedAdviseType。location输入物理内存的位置信息location参数包含id和type两个成员。类型定义请参见aclrtMemManagedLocation。返回值说明返回0表示成功返回其他值表示失败请参见aclError。aclrtMemManagedGetAttraclError 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 推理系列产品√功能说明查询指定大小的UVM内存的策略属性值。本接口操作的内存必须是通过aclrtMemAllocManaged接口分配的。若查询的这段内存范围内的策略属性值不一致则查询结果为无效值。与aclrtMemManagedGetAttrs接口不同本接口仅支持一次查询一个内存策略属性的值。参数说明参数名输入/输出说明attribute输入待查询的属性。类型定义请参见aclrtMemManagedRangeAttribute。ptr输入待查询属性的内存首地址范围必须在UVM内存范围之内即[0x90000000000ULL, 0x90000000000ULL3T)。size输入待查询属性的内存大小单位Byte。取值范围为(0, 3T]。data输出查询结果。dataSize输入存放查询结果的内存大小单位Byte。返回值说明返回0表示成功返回其他值表示失败请参见aclError。aclrtMemManagedGetAttrsaclError 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 推理系列产品√功能说明查询指定大小的UVM内存的策略属性值。本接口操作的内存必须是通过aclrtMemAllocManaged接口分配的。若查询的这段内存范围内的策略属性值不一致则查询结果为无效值。与aclrtMemManagedGetAttr接口不同本接口支持一次查询多个内存策略属性的值。参数说明参数名输入/输出说明attributes输入待查询的属性数组。类型定义请参见aclrtMemManagedRangeAttribute。numAttributes输入待查询的属性数组大小。ptr输入待查询属性的内存首地址范围必须在UVM内存范围之内即[0x90000000000ULL, 0x90000000000ULL3T)。size输入待查询属性的内存大小单位Byte。取值范围为(0, 3T]。data输出查询结果数组。dataSizes输入存放查询结果数组的内存大小单位Byte。返回值说明返回0表示成功返回其他值表示失败请参见aclError。aclrtMemManagedPrefetchAsyncaclError 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 推理系列产品√功能说明管理统一虚拟内存Unified Virtual Memory, UVM的预取。本接口操作的内存必须是通过aclrtMemAllocManaged接口分配的。本接口是异步接口调用接口仅表示任务下发成功不表示任务执行成功调用本接口后需调用同步等待接口例如aclrtSynchronizeStream确保内存预取的任务已执行完成。参数说明参数名输入/输出说明ptr输入待预取的内存地址地址范围必须在UVM内存范围内存即[0x90000000000ULL, 0x90000000000ULL3T)。size输入待预取的内存长度单位Byte要求2MB对齐。取值范围为(0, 3T]。location输入物理内存的位置信息location参数包含id和type两个成员。类型定义请参见aclrtMemManagedLocation。flags输入预留参数。当前固定配置为0。stream输入指定执行内存预取任务的Stream。类型定义请参见aclrtStream。返回值说明返回0表示成功返回其他值表示失败请参见aclError。aclrtMemManagedPrefetchBatchAsyncaclError 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 推理系列产品√功能说明管理统一虚拟内存Unified Virtual Memory, UVM的批量预取。本接口操作的内存必须是通过aclrtMemAllocManaged接口分配的。本接口是异步接口调用接口仅表示任务下发成功不表示任务执行成功调用本接口后需调用同步等待接口例如aclrtSynchronizeStream确保内存预取的任务已执行完成。参数说明参数名输入/输出说明ptrs输入待预取的内存地址数组每个地址范围必须在UVM内存范围内存即[0x90000000000ULL, 0x90000000000ULL3T)。sizes输入内存预取长度数组用于存放每一段要预取的UVM内存长度单位Byte。每段长度要求2MB对齐取值范围为(0, 3T]。count输入ptrs和sizes数组长度。prefetchLocs输入物理内存的位置信息数组每个位置信息都包含id和type两个成员。类型定义请参见aclrtMemManagedLocation。prefetchLocIdxs输入物理内存预取信息索引数组用于指定prefetchLocs数组中的每个物理地址适用的预取范围。对于prefetchLocs[k]指定的物理地址将预取ptrs数组中从第prefetchLocIdxs[k]个下标到第prefetchLocIdxs[k1]-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为2prefetchLocIdxs为{0,6}prefetchLocs包含两组物理内存的位置信息。注意prefetchLocIdxs的首个条目必须为0且每个条目必须大于前一个条目最后一个条目应小于count。此外numPrefetchLocs必须小于等于count。aclrtMemP2PMapaclError aclrtMemP2PMap(void *devPtr, size_t size, int32_t dstDevId, uint64_t flags)产品支持情况产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产品√Atlas A2 训练系列产品/Atlas A2 推理系列产品√功能说明本接口用于建立同一进程内两个Device之间的内存页表映射以实现跨Device的内存访问但在进行此操作前需先调用aclrtDeviceEnablePeerAccess接口以开启两个Device间的数据交互。调用本接口建立页表映射后跨Device访问时不会出现内存缺页的问题首次访问内存时性能更优。参数说明参数名输入/输出说明devPtr输入Device内存地址例如调用aclrtMalloc接口申请的Device内存此处指共享内存提供方的内存地址。size输入内存大小单位Byte。dstDevId输入Device ID此处指共享内存使用方的ID。flags输入预留参数当前固定设置为0。返回值说明返回0表示成功返回其他值表示失败请参见aclError。aclrtPointerGetAttributesaclError aclrtPointerGetAttributes(const void *ptr, aclrtPtrAttributes *attributes)产品支持情况产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产品√Atlas A2 训练系列产品/Atlas A2 推理系列产品√功能说明获取内存属性信息包括内存是位于Host还是Device、页表大小等信息。参数说明参数名输入/输出说明ptr输入内存地址。attributes输出内存属性信息。类型定义请参见aclrtPtrAttributes。返回值说明返回0表示成功返回其他值表示失败请参见aclError。【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考