CANN Runtime 错误码 EH0006(Not_Supported)深度解读:格式、触发原理与排查方法

📅 发布时间:2026/9/19 18:23:00
CANN Runtime 错误码 EH0006(Not_Supported)深度解读:格式、触发原理与排查方法
CANNAscend人工智能任务调度【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址https://gitcode.com/cann/runtime点击查看免费下载导读EH0006Not_Supported是 CANN Runtime 的 ACLAscend Computing Language错误码体系中用于标识特性或接口不受支持的专用错误码。当应用程序调用某个接口时若该操作因非芯片原因如配置参数限制、软件版本约束、固有限制等无法执行ACL 层会通过统一的报错格式%s is not supported. Reason: %s.输出该错误码并将返回值置为ACL_ERROR_FEATURE_UNSUPPORTED。阅读完本文你将掌握 EH0006 的报错格式与占位符语义、其在错误码注册表与源码中的定义方式、典型触发场景以acltdtAddDataItem为例的底层判断逻辑以及 EH0006 与芯片不支持错误码 EH0011 的正确区分与排查思路。EH0006 错误码概览EH0006 归属于 ACL Errors 错误类别错误码主题为 Not_Supported不支持。其核心定义位于仓库的错误码注册文件 src/dfx/error_manager/error_code.json 中{ errClass: ACL Errors, errTitle: Not_Supported, ErrCode: EH0006, ErrMessage: %s is not supported. Reason: %s., Arglist: feature, reason, suggestion: { Possible Cause: N/A, Solution: N/A } }从注册信息可以看出ErrCodeEH0006其中EH前缀代表 ACLEH 系列错误码用于区分 Runtime 侧EE 系列等其他错误类别ErrMessage统一的模板消息%s is not supported. Reason: %s.Arglist模板中两个占位符依次对应feature特性或接口与reason报错原因。报错格式与占位符语义按照错误码参考文档 docs/zh/error_code_ref/ACL-Errors/EH0006-Not_Supported.md 的说明EH0006 的报错格式如下其中两个%s占位符的含义依次为特性或接口、报错原因%s is not supported. Reason: %s.报错示例如下acltdtAddDataItem is not supported. Reason: item cannot be added because internal item already exists.该示例中第一个%s被替换为接口名acltdtAddDataItem明确指出不受支持的接口第二个%s被替换为具体原因item cannot be added because internal item already exists.说明为何该操作不被支持。EH0006 在源码中的定义与使用方式错误码常量定义在 ACL 层错误码宏定义文件 src/acl/common/log_inner.h 中EH0006 被定义为常量宏UNSUPPORTED_FEATURE_MSGconstexpr const char_t* const INVALID_PARAM_MSG EH0001; constexpr const char_t* const INVALID_NULL_POINTER_MSG EH0002; // ... constexpr const char_t* const UNSUPPORTED_FEATURE_MSG EH0006; // ... constexpr const char_t* const UNSUPPORTED_SYSTEM_MSG EH0011;该文件集中定义了 ACL 层从 EH0001 到 EH0014 的全部错误码宏。当业务代码需要报告特性不支持类错误时统一通过acl::AclErrorLogManager::ReportInputError(acl::UNSUPPORTED_FEATURE_MSG, ...)的形式上报保证错误码模板与参数次序的一致性。错误码的生成与上报链路从源码结构看EH0006 的完整链路为业务接口如acltdtAddDataItem在检测到不满足支持条件时调用AclErrorLogManager::ReportInputErrorReportInputError以UNSUPPORTED_FEATURE_MSG即 EH0006为模板 ID从 src/dfx/error_manager/error_code.json 中取出注册的模板消息%s is not supported. Reason: %s.将feature、reason两个参数依次填入占位符生成完整的错误文本并记录日志接口向调用方返回对应的错误码ACL_ERROR_FEATURE_UNSUPPORTED。典型触发场景剖析以 acltdtAddDataItem 为例文档中给出的报错示例指向接口acltdtAddDataItem该接口用于向 TDTTensor Data Transfer数据集acltdtDataset中添加数据项acltdtDataItem其实现位于 src/acl/acl_tdt_channel/tensor_data_transfer.cppaclError acltdtAddDataItem(acltdtDataset* dataset, acltdtDataItem* dataItem) { ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(dataset); ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(dataItem); if (dataset-freeSelf) { acl::AclErrorLogManager::ReportInputError( acl::UNSUPPORTED_FEATURE_MSG, std::vectorconst char*({feature, reason}), std::vectorconst char*({__func__, item cannot be added because internal item already exists})); return ACL_ERROR_FEATURE_UNSUPPORTED; } // ... 后续内存类型校验与 blobs 追加逻辑 dataset-blobs.push_back(dataItem); return ACL_SUCCESS; }触发条件dataset-freeSelf 标志从上述实现可以看出EH0006 在此场景下的触发条件是dataset-freeSelf为 true。freeSelf是acltdtDataset的一个内部标志位表示该数据集自身拥有并管理内部数据项。在acltdtReceiveTensorV2接收数据的流程中数据经TensorDatasetDeserializesV2反序列化填充到数据集后会把dataset-freeSelf置为 true见 src/acl/acl_tdt_channel/tensor_data_transfer.cpp 与 L401 处的第一版反序列化实现。这意味着数据集已经由接收流程自动填充了内部数据项数据项的归属权归数据集所有此时若调用方继续调用acltdtAddDataItem手工追加数据项会与数据集内部已有的数据产生归属与生命周期冲突因此该操作被判定为不支持触发后接口返回ACL_ERROR_FEATURE_UNSUPPORTED并上报 EH0006 错误信息acltdtAddDataItem is not supported. Reason: item cannot be added because internal item already exists.其他相关校验需要注意的是acltdtAddDataItem中除 EH0006 分支外还包含两类校验它们的失败路径不会触发 EH0006空指针校验dataset或dataItem为 null 时通过ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT上报空指针类错误内存类型一致性校验同一数据集中的多个数据项地址必须全部为 Host 侧或全部为 Device 侧混用时会通过INVALID_PARAM_REASON_MSG上报参数非法类错误返回ACL_ERROR_INVALID_PARAM而不是 EH0006。从源码结构可以推断EH0006 被严格限定用于操作本身在数据状态层面不被支持的场景而参数取值类问题则由其他错误码负责体现了错误码职责的单一划分。EH0006 与 EH0011 的区分非芯片不支持 vs 芯片不支持EH0006 最容易与另一个不支持类错误码 EH0011Not_Supported芯片混淆。错误码选择指南 docs/zh/guidelines/error_message_guide/error-code-guide.md 中给出了明确的选择方法├─ 是 → EH0011 └─ 否 → EH0006即根因是当前芯片不支持换芯片可解决→ 使用EH0011模板为The current system or device does not support %s.根因是非芯片原因配置参数、版本约束、固有限制、软件限制→ 使用EH0006。该指南进一步列出了 EH0006 覆盖的具体场景见 docs/zh/guidelines/error_message_guide/error-code-guide.md场景错误码说明完整功能芯片不支持EH0011换芯片可解决非完整功能配置参数EH0006reason 注明详细要求固有不支持EH0006reason 说明是固有限制完整功能不支持EH0006reason 注明详细要求以本文示例为例acltdtAddDataItem报 EH0006 属于当前数据集状态不允许该操作的软件层限制并非芯片能力缺失因此使用 EH0006 而非 EH0011。解决方法与排查步骤EH0006 参考文档给出的解决方法为根据报错提示调整代码逻辑。由于 EH0006 的Reason字段会明确说明不受支持的具体原因排查时应以 Reason 为切入点。结合源码实现可归纳为以下排查与处理步骤读取 Reason 定位约束EH0006 的报错文本中Reason部分会精确描述该操作为何不被支持如item cannot be added because internal item already exists.。根据 Reason 判断是配置参数限制、软件版本约束、固有限制还是数据状态冲突。调整接口调用时序或数据流对于acltdtAddDataItem场景报错说明数据集已通过接收流程如acltdtReceiveTensorV2自动填充了内部数据项freeSelf标志已被置位。此时不应再对同一数据集调用acltdtAddDataItem追加数据而应直接使用接收到的数据集通过acltdtGetDataItem、acltdtGetDatasetSize等接口读取内部数据项或先acltdtDestroyDataset销毁旧数据集再创建新的空数据集用于手工组装或使用专用于手工构造的数据集实例避免复用已被接收流程填充过的数据集。区分软硬件限制若 Reason 指向的是配置参数或版本约束需检查运行环境CANN 版本、芯片型号、配套驱动固件是否满足接口的适用前提若错误属于固有限制则需调整业务方案规避。验证返回值接口调用失败时返回值应为ACL_ERROR_FEATURE_UNSUPPORTED。在编码上建议先判断返回值再继续后续逻辑避免在不受支持的操作上继续执行无效流程。测试用例对 EH0006 行为的验证仓库单元测试 tests/ut/acl/testcase/acl_tensorDataTransfer_unittest.cpp 中的TestTdtAddDataItem用例直接验证了 EH0006 的触发行为TEST_F(UTEST_tensor_data_transfer, TestTdtAddDataItem) { const int64_t dims[] {1, 3, 224, 224}; void* data (void*)0x1f; acltdtDataset* dataSet acltdtCreateDataset(); acltdtDataItem* dataItem acltdtCreateDataItem(ACL_TENSOR_DATA_TENSOR, dims, 4, ACL_INT64, data, 1); EXPECT_EQ(acltdtAddDataItem(dataSet, dataItem), ACL_SUCCESS); EXPECT_EQ(acltdtDestroyDataset(dataSet), ACL_SUCCESS); EXPECT_EQ(acltdtDestroyDataItem(dataItem), ACL_SUCCESS); dataSet acltdtCreateDataset(); dataItem acltdtCreateDataItem(ACL_TENSOR_DATA_TENSOR, dims, 4, ACL_INT64, data, 1); dataSet-freeSelf true; EXPECT_EQ(acltdtAddDataItem(dataSet, dataItem), ACL_ERROR_FEATURE_UNSUPPORTED); EXPECT_EQ(acltdtDestroyDataset(dataSet), ACL_SUCCESS); EXPECT_EQ(acltdtDestroyDataItem(dataItem), ACL_SUCCESS); }该用例清晰地覆盖了两条路径正常路径新建数据集freeSelf默认为 falseacltdtAddDataItem返回ACL_SUCCESS数据项成功追加异常路径将dataSet-freeSelf显式置为 true模拟数据集已由接收流程填充的状态acltdtAddDataItem返回ACL_ERROR_FEATURE_UNSUPPORTED即 EH0006 对应的返回值。该测试用例同时印证了文档示例报错文本item cannot be added because internal item already exists.与源码分支的一致性只要freeSelf为 true无论追加何种数据项都会被拒绝并触发 EH0006。总结EH0006Not_Supported是 CANN Runtime ACL 错误码体系中用于表达特性或接口在软件层不受支持的专用错误码。其报错格式%s is not supported. Reason: %s.中的两个占位符分别对应特性/接口名与具体原因错误消息模板在 src/dfx/error_manager/error_code.json 中统一注册并通过 src/acl/common/log_inner.h 中的UNSUPPORTED_FEATURE_MSG宏在 ACL 各接口间复用。以acltdtAddDataItem为例当数据集的freeSelf标志被置位后继续追加数据项即会触发 EH0006 并返回ACL_ERROR_FEATURE_UNSUPPORTED。排查 EH0006 时核心依据是报错文本中的Reason字段结合错误码选择指南区分非芯片不支持EH0006与芯片不支持EH0011并根据具体原因调整接口调用时序、数据集使用方式或运行环境配置。若要进一步了解 ACL 错误码的完整体系与选择规则可参阅 ACL-Errors 错误码总览 与 错误码选择指南。赞分享CANNAscend人工智能任务调度【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址https://gitcode.com/cann/runtime点击查看免费下载相关推荐CANN Runtime 错误码 EH0006Not Supported详解报错格式、TDT 数据集触发场景与排查实践CANN Runtime 错误码 EH0006Not Supported详解报错格式、TDT 数据集触发场景与排查实践 EH0006 是 CANN RunCANNAscend人工智能任务调度CANN Runtime 错误码 E20101Invalid Argument详解格式、触发场景与排查方法CANN Runtime 错误码 E20101Invalid Argument详解格式、触发场景与排查方法 E20101 是 CANN 前端FE错误族CANNAscend人工智能任务调度CANN Runtime Dump 错误码 EP0006 深度解析Invalid_Argument 报错格式、触发场景与排查指南CANN Runtime Dump 错误码 EP0006 深度解析Invalid_Argument 报错格式、触发场景与排查指南 本文围绕 CANN RuntCANNAscend人工智能任务调度创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考