已关闭
【需求】aclrtGetDeviceInfo 新增产品形态(Product Type)查询能力 #692
黄桂军创建于  7月6日关闭于  7月16日
黄桂军
黄桂军
7月6日 创建

【需求】aclrtGetDeviceInfo 新增产品形态(Product Type)查询能力

背景

torch_npu 中 AclrtMallocHostWithCfgExist() 用于判定 HDK 特性(aclrtMallocHostWithCfg + ACL_RT_MEM_ATTR_VA_FLAG)是否可用。该特性在 Ascend950(A5)上是支持的,但最低驱动版本随产品形态不同而不同:

产品形态 最低驱动版本
标卡(PCIe card) 25.7
Pod 25.1
Server 25.6

当前 torch_npu 仅通过 c10_npu::GetSocVersion() 判断芯片代际,而 soc version 字符串(来自 aclrtGetSocName,源于芯片 HSM 烧录的 soc_ver)只标识芯片型号,不含拓扑/产品形态维度。同一 Ascend950 在标卡、Pod、Server 上取值完全相同,无法区分。

因此 torch_npu 对 A5 保守地一刀切返回 false(GetSocVersion() < Ascend950),导致即便驱动版本已满足对应形态的门槛,A5 上 HDK 特性仍被禁用,影响两个用户接口:

  1. empty_with_swapped_memory:丢失主机侧直接指针访问(零拷贝 SVM 共享语义)
  2. pin_memory + pinned_mem_register:pinned_mem_register 配置被强制降级为 False,pin 内存无设备映射视图

现状分析

driver 层已具备区分产品形态的能力:

  • INFO_TYPE_PRODUCT_TYPE(ascend_hal_base.h:413)经 halGetDeviceInfo(devId, MODULE_TYPE_SYSTEM, INFO_TYPE_PRODUCT_TYPE, &value) 返回产品形态,值类型为 enum hal_product_type(ascend_hal_base.h:1104):

    值 枚举 含义
    0 HAL_PRODUCT_TYPE_POD Pod
    1 HAL_PRODUCT_TYPE_A_K A.K(Server 类形态)
    2 HAL_PRODUCT_TYPE_A_X A.X(Server 类形态)
    3 HAL_PRODUCT_TYPE_PCIE_CARD PCIe 标卡
    4 HAL_PRODUCT_TYPE_EVB 评估板
  • A5 构建已开启 CFG_FEATURE_PRODUCT_TYPE(src/ascend_hal/dms/drv_devmng/feature/host/ascend950.cmake),驱动侧无需改动。

  • driver 内核态 dev_info->product_type 由 soc_resmng_dev_get_key_value(dev_id, "PRODUCT_TYPE", ...) 填充,经 drvGetDevInfo ioctl 透传到用户态。

但该信息未通过 ACL 公开接口暴露:aclrtGetDeviceInfo 支持的 aclrtDevAttr 中没有 PRODUCT_TYPE 对应项,torch_npu 无法查询。

期望方案

参考 ACL_DEV_ATTR_HD_CONNECT_TYPE(commit 11838aeb)的既有先例,在 ACL/runtime 层新增产品形态查询能力。

1. runtime 侧

pkg_inc/runtime/runtime/rts/rts_device.h —— rtDevAttr 枚举新增:

RT_DEV_ATTR_HD_CONNECT_TYPE = 408U,         // host-device connect type
RT_DEV_ATTR_PRODUCT_TYPE = 409U,            // product type (pod/server/pcie card)   // 新增

src/runtime/core/src/api_impl/api_impl.cc —— GetDeviceInfoByAttr 的 devInfoMap 新增映射(与 HD_CONNECT_TYPE 同模式,原样透传 driver 值,值一致无需转换):

{RT_DEV_ATTR_HD_CONNECT_TYPE, {MODULE_TYPE_SYSTEM, INFO_TYPE_HD_CONNECT_TYPE}},
{RT_DEV_ATTR_PRODUCT_TYPE, {MODULE_TYPE_SYSTEM, INFO_TYPE_PRODUCT_TYPE}},   // 新增

2. ACL 侧

include/external/acl/acl_rt.h —— aclrtDevAttr 枚举新增 attr,并新增值宏(与 ACL_HOST_DEVICE_CONNECT_TYPE_* 写法一致,使用 #define 而非 typedef enum):

ACL_DEV_ATTR_HD_CONNECT_TYPE = 408U,        // host-device connect type
ACL_DEV_ATTR_PRODUCT_TYPE = 409U,           // product type (pod/server/pcie card)   // 新增

// Product form factor returned by aclrtGetDeviceInfo with ACL_DEV_ATTR_PRODUCT_TYPE.
#define ACL_PRODUCT_TYPE_POD       0  // pod form factor
#define ACL_PRODUCT_TYPE_A_K       1  // A.K (server-like) form factor
#define ACL_PRODUCT_TYPE_A_X       2  // A.X (server-like) form factor
#define ACL_PRODUCT_TYPE_PCIE_CARD 3  // PCIe card form factor
#define ACL_PRODUCT_TYPE_EVB       4  // evaluation board

3. driver 侧

无需改动。INFO_TYPE_PRODUCT_TYPE、enum hal_product_type、CFG_FEATURE_PRODUCT_TYPE(A5 构建已开启)均已就绪。

影响范围

  • runtime:rts_device.h +1 行,api_impl.cc +1 行
  • ACL:acl_rt.h +1 attr + 5 值宏
  • driver:无改动
  • 兼容性:新增 attr/宏,不影响既有接口;
likedislike
黄桂军黄桂军
7月6日 关联了pull request:feat: 新增产品形态设备属性查询(#692)
ykl999
ykl999成员
7月6日 评论:

请根据pr上库后关闭此issue

likedislike
ykl999
ykl999成员
7月6日 评论:

/assign @stevenaw0

likedislike
CANN-robotCANN-robot成员
7月6日 将 stevenaw0 设为负责人
黄桂军
黄桂军
7月7日 评论:

2026.7.7 领域评审
1、子菁:另外一个思路:HDK要提供特性枚举,aclrt做一个封装,pta判断cann版本号 > xx.x.x,再调用aclrt接口。 aclrt屏蔽底层差异。
2、aclrtMallocHostWithCfg + ACL_RT_MEM_ATTR_VA_FLAG 如果不支持,runtime有error日志,drv没有error日志?如果没有error日志,可以直接先调用,返回NOT_SUPPORT后,走第二条路线。

likedislike
黄桂军
黄桂军
7月7日 评论:

最终方案:
pta先调用一次aclrtMallocHostWithCfg + ACL_RT_MEM_ATTR_VA_FLAG,返回not_support 就走第二条路线

为了避免产生error日志,pta需要判断cann版本号 > xx.xx.x,再这样做。否则认为A5不支持。

runtime: not_support错误码不报error日志,改为warning.

likedislike
黄桂军黄桂军
7月7日 关联了pull request:fix: suppress not support log for aclrtMallocHostWithCfg (#692)
黄桂军
黄桂军
7月8日 评论:

2026.7.8 评审
入参枚举定义:DEVICE_FORM_FACTOR

#define ACL_DEVICE_FORM_FACTOR_POD 0 // pod form factor
#define ACL_DEVICE_FORM_FACTOR_A_K 1 // A.K (server-like) form factor
#define ACL_DEVICE_FORM_FACTOR_A_X 2 // A.X (server-like) form factor
#define ACL_DEVICE_FORM_FACTOR_PCIE_CARD 3 // PCIe card form factor

#define ACL_DEVICE_FORM_FACTOR_EVB 4 // evaluation board 这个不用。

#define ACL_DEVICE_FORM_FACTOR_UNDEFINED 4 // 未定义。 跟驱动,讨论下 出参 ,

likedislike
黄桂军
黄桂军
7月9日 评论:

补充驱动在A3上该接口的行为, 在 A3上,halGetDeviceInfo(devId, MODULE_TYPE_SYSTEM, INFO_TYPE_PRODUCT_TYPE, &value) 会直接返回 DRV_ERROR_NOT_SUPPORT,不会对value赋值,不会打印error日志

关键分支受宏控制 — drv_get_system_info 对 INFO_TYPE_PRODUCT_TYPE 用 #ifdef CFG_FEATURE_PRODUCT_TYPE 包裹:

case INFO_TYPE_PRODUCT_TYPE:
#ifdef CFG_FEATURE_PRODUCT_TYPE
return drv_get_info_from_dev_info(devId, info_type, value);
#else
return DRV_ERROR_NOT_SUPPORT;
#endif

likedislike
黄桂军黄桂军
7月16日 issue状态由 进行中 改变为 已完成
黄桂军黄桂军
7月16日 关闭了 issue