已合并
【fix】: 修复acl对外获取地址属性时的错误type以及修正内部对于loc_type在部分驱动返回值的映射逻辑 #3833
【fix】: 修复acl对外获取地址属性时的错误type以及修正内部对于loc_type在部分驱动返回值的映射逻辑 #3833
已合并
YzQnWyx创建于 7月25日
YzQnWyx
YzQnWyx成员
7月25日

Pull Request

描述

修复acl对外获取地址属性时的错误type以及修正内部对于loc_type在部分驱动返回值的映射逻辑。

变更类型

请选择本次引入的变更类型:

关联的Issue

如何测试

描述测试此变更的步骤和前提条件:
1.
2.

核对清单

其他信息

在此添加任何其他关于本次 PR 的说明。

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 YzQnWyx 的贡献)
YzQnWyxYzQnWyx成员
7月25日 添加了label:enhancement
YzQnWyxYzQnWyx成员
7月25日 创建了 pull request,commit 853f3e28
atomgit-bot
atomgit-bot
7月25日 评论:

变更摘要

此 PR 主要引入了 ACL_MEM_LOCATION_TYPE_MANAGED 托管内存位置类型,统一了 ACL 与 Runtime 层对 UVM(统一虚拟内存)的语义表达。同时,移除了旧的 RT_MEMORY_LOC_UVM_MANAGED 枚举值,将 RT_MEMORY_LOC_MANAGED 作为 UVM 托管内存的唯一标识,并重构了驱动层中各类内存类型到位置类型的映射逻辑,使 SVM 子类型不再笼统地映射为 MANAGED,而是按实际物理位置映射为 DEVICEHOST

主要改动

  • 新增 ACL_MEM_LOCATION_TYPE_MANAGED 枚举值:在 aclrtMemLocationType 枚举中添加了 ACL_MEM_LOCATION_TYPE_MANAGED(值为 3),同时移除 mem_base.h 中旧的 RT_MEMORY_LOC_UVM_MANAGED,使 RT_MEMORY_LOC_MANAGED 成为托管内存的唯一枚举标识
  • aclrtMallocPhysicalImpl 参数校验扩展:将 ACL_MEM_LOCATION_TYPE_MANAGEDACL_MEM_LOCATION_TYPE_UNREGISTERED 一并列为不支持的位置类型,统一通过 AclErrorLogManager 报告参数错误
  • GetMemLocationTypeDesc 描述映射补充:新增 ACL_MEM_LOCATION_TYPE_MANAGED 的描述条目,并统一调整描述字符串格式(如 "ACL_MEM_LOCATION_TYPE_DEVICE(1)"
  • 驱动层内存位置映射重构:在 PtrGetAttributesPtrGetRealLocation 中,将 DV_MEM_SVM_DEVICE/DV_MEM_SVMRT_MEMORY_LOC_MANAGED 改为 RT_MEMORY_LOC_DEVICEDV_MEM_SVM_HOST 改为 RT_MEMORY_LOC_HOST,而 DV_MEM_UVM 专门映射为 RT_MEMORY_LOC_MANAGED
  • UVM 回调及单元测试适配UvmCallback::IsUvmMem 中改用 RT_MEMORY_LOC_MANAGED 判断;新增 drvMemGetAttribute_10 stub 及对应测试用例,覆盖 DV_MEM_UVMPtrGetRealLocation 的正确性
likedislike
atomgit-bot
atomgit-bot
7月25日 评论:

代码审查

经过对所有 12 个变更文件的逐一审查,此 diff 并未引入任何正确性、安全性、可靠性或破坏性变更方面的问题。所有变更均一致且正确。

以下是各文件审查结果汇总:

  • docs/03_api_ref/25_数据类型及其操作接口.md — 文档新增 ACL_MEM_LOCATION_TYPE_MANAGED 枚举值及其平台支持说明,无问题。
  • include/external/acl/acl_rt.h — 在 aclrtMemLocationType 枚举中新增 ACL_MEM_LOCATION_TYPE_MANAGED,枚举值位置正确(隐式值为 3),无问题。
  • pkg_inc/runtime/runtime/mem_base.h — 移除 RT_MEMORY_LOC_UVM_MANAGED,保留 RT_MEMORY_LOC_MANAGEDRT_MEMORY_LOC_MAX,所有引用均已同步更新,无问题。
  • src/acl/aclrt_impl/memory.cppaclrtMallocPhysicalImpl 新增对 ACL_MEM_LOCATION_TYPE_MANAGED 的拒绝逻辑,与 ACL_MEM_LOCATION_TYPE_UNREGISTERED 一并拦截,逻辑正确。
  • src/acl/utils/data_type_utils.h — 描述映射表新增 ACL_MEM_LOCATION_TYPE_MANAGED(3) 条目,同时将前缀从 MEM_LOCATION_TYPE_ 统一为 ACL_MEM_LOCATION_TYPE_,无问题。
  • src/runtime/core/src/uvm/uvm_callback.ccIsUvmMem 中将 RT_MEMORY_LOC_UVM_MANAGED 替换为 RT_MEMORY_LOC_MANAGED,与枚举变更一致,且 PtrGetRealLocation 中 UVM 类型现正确返回 RT_MEMORY_LOC_MANAGED,行为正确。
  • src/runtime/driver/npu_driver_mem.ccPtrGetAttributesPtrGetRealLocation 中 SVM 子类型现映射到更准确的 DEVICE/HOST,新增 DV_MEM_UVM 处理并映射到 RT_MEMORY_LOC_MANAGED。逻辑正确,else if 链中比特位独立无冲突。
  • tests/ut/acl/testcase/acl_runtime_unittest.cpp — 新增 ACL_MEM_LOCATION_TYPE_MANAGED 被拒绝的测试用例,测试覆盖正确。
  • tests/ut/runtime/runtime/test/platform/910B/stub/rt_utest_api_common_defination.cc — 新增 drvMemGetAttribute_10 stub,设置 DV_MEM_UVM,无问题。
  • tests/ut/runtime/runtime/test/platform/others/rt_utest_api.cc — 新增 drvMemGetAttribute_10 调用测试 PtrGetRealLocation 对 UVM 返回成功,无问题。
  • tests/ut/runtime/runtime/test/rt_utest_api.hpp — 新增 drvMemGetAttribute_10 声明,无问题。
  • tests/ut/runtime/runtime/test/rt_utest_api_common_defination.cc — 新增 drvMemGetAttribute_10 stub(同 910B 版本),无问题。

结论:0 个 P0/P1/P2/P3 问题,此变更风险低,可以合入。

类型 数量
🔴 阻塞 0
🟡 建议 1

💬 仅评论

likedislike
CANN-robotCANN-robot成员
7月25日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
7月25日 评论:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here
You can get sig-info at here


PR Approval Progress

Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
** gcw_kUomxQ2l, 卢煜坤 (2/2) gcw_kUomxQ2l (1/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

YzQnWyx, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
CANN-robotCANN-robot成员
7月25日 将wangtao43,zhangpengpeng8,yanmingxiang,Reyn52166,jiangtao_rts,ykl999,houyanbao,hanxiaolong,gcw_kUomxQ2l,Andy-lb,tingwood设为评审人
CANN-robotCANN-robot成员
7月25日 将jiangtao_rts,hanxiaolong,gcw_kUomxQ2l,Andy-lb设为审查人
YzQnWyxYzQnWyx成员
7月25日 修改标题为 “【fix】: 修复acl对外获取地址属性时的错误type以及修正内部对于loc_type在部分驱动返回值的映射逻辑”,原标题为“【PR】: 简要描述”
YzQnWyxYzQnWyx成员
7月25日 修改了pull request 的描述
YzQnWyx
YzQnWyx成员
7月25日 评论:

compile

likedislike
YzQnWyxYzQnWyx成员
7月25日 update merge request[project id: 8810053, iid: 3833, commit_id: 8facb74014d0a011ffe0832f3fdaa4156765f0dd] virtual merging success
CANN-robotCANN-robot成员
7月25日 添加了label:ci-pipeline-running
CANN-robot
CANN-robot成员
7月25日 评论:

流水线任务触发成功
任务链接 [609fb40c998948da89c2a01d8a167cf4][流水线指导]

任务名称状态日志下载链接
Compile_Ascend_X86 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_ARM ✅ SUCCESS >>>>> >>>>>
pre_comment ✅ SUCCESS >>>>>
UT_Test_acl ✅ SUCCESS >>>>>
UT_Test_rts_v201 ✅ SUCCESS >>>>>
UT_Test_rts_c ✅ SUCCESS >>>>>
UT_Test_rts_david ✅ SUCCESS >>>>>
UT_Test_rts_910b ✅ SUCCESS >>>>>
UT_Test_rts_common ✅ SUCCESS >>>>>
UT_Test_platform ✅ SUCCESS >>>>>
UT_Test_qs ✅ SUCCESS >>>>>
UT_Test_aicpusd ✅ SUCCESS >>>>>
UT_Test_tsd ✅ SUCCESS >>>>>
UT_Test_error_manager ✅ SUCCESS >>>>>
UT_Test_slog ✅ SUCCESS >>>>>
UT_Test_atrace ✅ SUCCESS >>>>>
UT_Test_adump ✅ SUCCESS >>>>>
UT_Test_mmpa ✅ SUCCESS >>>>>
PreSmoke_A900_npupool ✅ SUCCESS >>>>>
UT_Test_msprof ✅ SUCCESS >>>>>
UT_Test_rts_report ✅ SUCCESS >>>>>
UT_Test_msprof_report ✅ SUCCESS

[2026-07-25 10:34:18]    CI执行结束

likedislike
CANN-robot
CANN-robot成员
7月25日 评论:

流水线任务触发成功
任务链接 [5a33c06658dc490f844cc3031125d61e][流水线指导]

任务名称状态日志下载链接
codecheck ✅ SUCCESS >>>>>
SCA ✅ SUCCESS >>>>>
antipoison ✅ SUCCESS >>>>>
codecheck_Check_Pr ✅ SUCCESS
codecheck_style ✅ SUCCESS >>>>>
codecheck_precommit ⚠️ WARNING >>>>> >>>>>
StaticCheck_codespell_check ✅ SUCCESS
StaticCheck_link_validity_check ✅ SUCCESS
StaticCheck_resource_existence_check ✅ SUCCESS
StaticCheck_tag_closed_check ✅ SUCCESS
StaticCheck_markdownlint ✅ SUCCESS

[2026-07-25 10:18:37]    CI执行结束

likedislike
atomgit-bot
atomgit-bot7月25日进行代码检视1
src/runtime/driver/npu_driver_mem.cc
@@ -2042,7 +2042,7 @@
20422042 attributes->locationType = RT_MEMORY_LOC_MANAGED;
20432043 } else if ((dvAttributes.memType & DV_MEM_SVM_HOST) != 0U) {
20442044 attributes->memoryType = RT_MEMORY_TYPE_SVM;
20452045 attributes->locationType = RT_MEMORY_LOC_MANAGED;
atomgit-bot
atomgit-bot7月25日评论:

🟡 Medium Priority

变更文件 src/runtime/driver/npu_driver_mem.cc 中,PtrGetAttributes(第 2116-2121 行)已将 DV_MEM_SVM_DEVICEDV_MEM_SVM_HOSTDV_MEM_SVM 的 location type 从原来的 RT_MEMORY_LOC_MANAGED 分别改为 RT_MEMORY_LOC_DEVICERT_MEMORY_LOC_HOSTRT_MEMORY_LOC_DEVICE。但同一文件中的 PointerGetAttributes(第 2037-2045 行,未被此次 diff 修改)仍然将这些 SVM 类型映射为 RT_MEMORY_LOC_MANAGED。这两个函数服务于不同的调用者(rtPointerGetAttributes 公开 API vs rtPtrGetAttributes 内部 API),如果设计上要求它们对同种内存类型返回一致的 location type,则此处存在遗漏。否则调用者根据所选 API 不同将得到矛盾的 location type,可能导致内存释放校验(如 DevMemFree 中的 locationType != RT_MEMORY_LOC_DEVICE && locationType != RT_MEMORY_LOC_MANAGED 检查)或拷贝方向校验出现非预期行为。

建议:确认 PointerGetAttributes 是否需要同步更新 SVM 分类逻辑。如果 PointerGetAttributes(rtPointerGetAttributes 公开 API)有意保持向后兼容而维持 SVM → MANAGED 的映射,建议添加注释说明两个函数的分类差异是设计如此;否则应同步修改 PointerGetAttributes 中 SVM_DEVICE/SVM_HOST/SVM 的 locationType 赋值以与 PtrGetAttributes 保持一致。

likedislike
CANN-robotCANN-robot成员
7月25日 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
7月25日 添加了label:ci-pipeline-passed
ykl999
ykl999成员
7月25日 评论:

/lgtm

likedislike
YzQnWyxYzQnWyx成员
7月25日 解决了最后一个问题
liulun0308成员
7月25日 评论:

/approve

likedislike
CANN-robotCANN-robot成员
7月25日 添加了label:lgtmapproved
CANN-robotCANN-robot成员
7月25日 合入了pull request