拓冰建站拓冰建站
首页 / 资讯中心 / 正文

CANN Runtime EE1006 Not_Supported 错误码详解:格式解析、触发场景与排查思路

CANN Runtime EE1006 Not_Supported 错误码详解格式解析、触发场景与排查思路【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime导读EE1006Not_Supported是 CANN Runtime 在接口功能、参数取值或 Stream/Event 标志位超出当前软硬件支持范围时抛出的一类通用错误码。当应用调用 StreamWaitEvent、EventCreate、StreamCreate 等接口传入了与当前 SoC 特性、接口约束或对象类型不匹配的参数时Runtime 会以该错误码明确告知某项能力不被支持及其具体原因。读完本文你将掌握 EE1006 的完整报错格式与占位符语义、源码层面的典型触发场景、以及基于报错信息定位并调整代码的排查方法。错误码定位EE1006 在错误码体系中的位置在 CANN Runtime 中错误码的注册与模板统一定义在 error_code_meta.h 与 error_code.json 中。在error_code.json中EE1006 被归类为RTS Errors、标题为Not_Supported其定义如下{ errClass: RTS Errors, errTitle: Not_Supported, ErrCode: EE1006, ErrMessage: %s failed. %s is not supported. Reason: %s., Arglist: func, type, reason, suggestion: { Possible Cause: N/A, Solution: N/A } }对应地在 C/C 侧的宏定义中error_code_meta.hEE1006 携带三个格式化参数func、type、reason最终以DLOG_ERROR级别输出/* EE1006 - Not_Supported */ X(EE1006, EE1006, (func, type, reason), %s failed. %s is not supported. Reason: %s. ErrorCodeEE1006.\n, DLOG_ERROR)值得注意的是同属Not_Supported标题的还有EE1005The current system or device does not support %s.它表达的是系统或设备整体不支持某个能力而EE1006则更具体地指向某个接口调用因参数/标志位/组合方式不被支持而失败两者在排查思路上有明确区别详见下文与相邻错误码的区分。错误信息格式与占位符语义EE1006 的报错格式固定为%s failed. %s is not supported. Reason: %s.三个占位符%s的含义依次为占位符语义典型内容示例第 1 个%s接口功能哪个操作失败StreamWaitEvent、Event creation、Triggering event waiting、Checking stream flags第 2 个%s不支持的参数或参数值哪个输入不被支持Parameter evt.eventFlag_ value 0x10、Parameter flags value 1、FusionList value AICAI第 3 个%s报错原因为什么不被支持Device-only events can be called only on the device.、RT_EVENT_MC2(0x10U) ... do not support OR combination with other flags在日志输出时模板尾部还会追加ErrorCodeEE1006.字样便于在 plog 日志中通过EE1006关键字快速检索定位可参考 如何通过plog日志定位Device侧异常 中关于日志检索的思路。报错示例逐字解读原文档给出的示例为StreamWaitEvent failed. Parameter evt.eventFlag_ value 0x10 is not supported. Reason: Device-only events can be called only on the device.按占位符拆解接口功能StreamWaitEvent即用户调用了 Stream 等待 Event 的接口对应 ACL 层aclrtStreamWaitEvent/ RT 层rtStreamWaitEvent不支持的参数值evt.eventFlag_的值为0x10。对照 event.h 中定义的 Event 标志位RT_EVENT_DDSYNC_NS(0x01U)、RT_EVENT_STREAM_MARK(0x02U)、RT_EVENT_DDSYNC(0x04U)、RT_EVENT_TIME_LINE(0x08U)、RT_EVENT_MC2(0x10U)、RT_EVENT_EXTERNAL(0x20U)、RT_EVENT_IPC(0x40U)——0x10正是RT_EVENT_MC2报错原因MC2Device-only类型的 Event 是设备侧专用事件只能在设备侧调用Host 侧通过StreamWaitEvent等待它是非法的。该示例的源码校验逻辑位于 api_error.cc 的ApiErrorDecorator::StreamWaitEventCOND_RETURN_AND_MSG_OUTER( ((evt-GetEventFlag() static_castuint32_t(RT_EVENT_MC2)) || (((evt-GetEventFlag() static_castuint32_t(RT_EVENT_MC2)) ! 0U) ((evt-GetEventFlag() (~static_castuint32_t(RT_EVENT_MC2))) ! 0U))), RT_ERROR_INVALID_VALUE, ErrorCode::EE1006, Triggering event waiting, Parameter evt.eventFlag_ value std::to_string(evt-GetEventFlag()), Device-only events can be called only on the device);可以看到只要 Event 的 flag 等于RT_EVENT_MC2或RT_EVENT_MC2与其他标志位做了 OR 组合就会命中该检查并抛出 EE1006。典型触发场景结合源码的深入分析EE1006 在 Runtime 的ApiErrorDecorator层被广泛用于参数合法性/支持性校验。从源码结构看主要可归纳为以下几类场景场景一Event 标志位非法OR 组合约束在ApiErrorDecorator::EventCreateapi_error.cc中RT_EVENT_MC2(0x10U)与RT_EVENT_EXTERNAL(0x20U)被设计为只能单独使用的标志位不允许与其他 flag 做按位或constexpr uint64_t solelyFlag[] {RT_EVENT_MC2, RT_EVENT_EXTERNAL}; for (const uint64_t itemFlag : solelyFlag) { COND_RETURN_AND_MSG_OUTER( (((flag (itemFlag)) ! 0UL) ((flag (~itemFlag)) ! 0UL)), RT_ERROR_INVALID_VALUE, ErrorCode::EE1006, Event creation, Parameter flag value std::to_string(flag), RT_EVENT_MC2(0x10U) and RT_EVENT_EXTERNAL(0x20U) do not support OR combination with other flags); }EventCreateExapi_error.cc在此基础上进一步将RT_EVENT_IPC(0x40U)也纳入不可 OR 组合约束并提示RT_EVENT_MC2(0x10U), RT_EVENT_EXTERNAL(0x20U), and RT_EVENT_IPC(0x40U) do not support OR combination。该约束与头文件 event.h 中的注释一一对应RT_EVENT_MC2 does not support OR with other flags说明这是接口层面的硬性设计约束。实践要点创建 Event 时若使用aclrtCreateEventExWithFlag/rtEventCreateEx请确认flag要么是RT_EVENT_DDSYNC_NS/STREAM_MARK/DDSYNC/TIME_LINE的合法 OR 组合或RT_EVENT_DEFAULT要么是RT_EVENT_MC2、RT_EVENT_EXTERNAL、RT_EVENT_IPC中的某一个单独使用。场景二IPC Event 接口误用在 api_impl_event.cc 的ApiImplEvent::IpcGetEventHandle中仅当 Event 的 flag 为RT_EVENT_IPC时才允许获取 IPC 句柄COND_RETURN_AND_MSG_OUTER( event-GetEventFlag() ! RT_EVENT_IPC, RT_ERROR_INVALID_VALUE, ErrorCode::EE1006, Obtaining the IPC event handle, RtFmtMsg(Parameter event.eventFlag_ value % PRIu64, event-GetEventFlag()), Only IPC events are supported);即对非 IPC 类型 Event 调用rtIpcGetEventHandle会触发 EE1006。排查时请确认该 Event 是否通过aclrtCreateEventExWithFlag(..., ACL_EVENT_IPC)创建并核对 IPC 句柄获取/导入IpcOpenEventHandle的对象类型一致性。场景三Stream 标志位不合法或组合约束ApiErrorDecorator::CheckStreamFlagsapi_error.cc是 Stream 创建时的核心校验包含两类 EE1006 触发点SoC 不支持大深度 Stream当flags RT_STREAM_HUGE且当前芯片特性不支持RT_FEATURE_STREAM_HUGE_DEPTH时报错Parameter flags value %d is not supported. Reason: The current SoC supports only streams with a normal number of tasks and does not support huge streams.标志位强绑定约束RT_STREAM_CP_PROCESS_USE(0x800U)必须与RT_STREAM_ACSQ_LOCK(0x2000U)一起使用Parameter flags value %d is not supported. Reason: The flag RT_STREAM_CP_PROCESS_USE(0x800U) must be used together with RT_STREAM_ACSQ_LOCK(0x2000U).RT_STREAM_CP_PROCESS_USE的定义可参见 stream.h。此外StreamSynchronize、Stream 销毁等路径中还存在基于RT_STREAM_AICPU、RT_STREAM_PERSISTENT、RT_STREAM_FORBIDDEN_DEFAULT、RT_STREAM_CP_PROCESS_USE等标志位的 EE1006 校验api_error.cc例如带RT_STREAM_AICPU标志的 Stream 不支持某些操作。api_impl_david.cc中同样存在对RT_STREAM_PERSISTENT流的限制如Stream aborting场景见 api_impl_david.cc。场景四融合算子任务组合不被支持在 api_error_standard_soc.cc 的FusionLaunch校验中会检查融合任务FusionList的子任务类型组合COND_RETURN_AND_MSG_OUTER( g_fusionAllowedList.find(fusionList) g_fusionAllowedList.end(), RT_ERROR_INVALID_VALUE, ErrorCode::EE1006, Fused operator task delivery, FusionList value fusionList, Fusion tasks support only the combinations of HCOMM and AI Core, AI CPU and AI Core, CCU and AIC, or a single CCU task);而在仅支持 A3 形态RT_FEATURE_TASK_FUSION_DOT_ONLY_AICPUAIC的 SoC 上进一步收紧为仅允许AICPUAIC组合。即调用rtFusionLaunch时子任务类型组合必须落在当前芯片支持的集合内否则报 EE1006。场景五内存类型与 AI CPU 相关限制在ApiErrorDecorator的CpuKernelLaunchExWithArgs中api_error.cc带RT_STREAM_CP_PROCESS_USE标志的 Stream 不能用于 AI CPU 算子下发报错Stream (stream_id%d) with the flag RT_STREAM_CP_PROCESS_USE(0x800U) cannot be used for kernel launch在设备内存类型检查路径中api_error.ccmemType超出当前支持集合时也会触发 EE1006Device memory type check当 AI CPU 核数为 0 时相关 AI CPU 特性查询/下发会被判为不支持api_impl.cc。解决方法与排查流程原文档给出的解决方向非常明确功能不支持需调整代码逻辑。展开来说推荐按以下流程排查解析报错三段信息从%s failed.确认是哪个接口从第二个%s确认是哪个参数/标志位/组合值不被支持从Reason:确认不支持的具体原因。对照接口约束修正参数Event 相关核对flag是否误用了RT_EVENT_MC2/RT_EVENT_EXTERNAL/RT_EVENT_IPC与其他标志的 OR 组合对非 IPC Event 调用 IPC 接口时改用正确 Event 类型Stream 相关核对RT_STREAM_HUGE是否在目标 SoC 上受支持RT_STREAM_CP_PROCESS_USE是否与RT_STREAM_ACSQ_LOCK成对使用Fusion 相关核对融合子任务类型组合是否落在当前芯片支持的 FusionList 集合内内存类型核对设备内存类型枚举是否在当前芯片支持范围内。区分能力限制与参数错误若Reason为当前 SoC/系统不支持某能力如 huge stream、特定融合组合应从更换硬件/能力适配角度处理若为参数组合不合法如标志位 OR 约束、IPC 类型不匹配则应修正代码逻辑使传入参数满足接口约束。检索日志确认触发点EE1006 以DLOG_ERROR级别输出并携带ErrorCodeEE1006字样可在 plog 日志中以EE1006关键字结合接口名进一步确认触发路径。在多数场景下正确的做法是调整应用代码要么更换为接口支持的参数取值例如将 MC2 事件改用普通事件、将 IPC 句柄获取限制在 IPC 事件上要么在调用前通过能力查询接口如芯片特性查询判断当前环境是否支持目标能力再进行分支处理。与相邻错误码的区分错误码报错模板语义侧重EE1005The current system or device does not support %s.系统/设备级能力缺失与具体参数无关EE1006%s failed. %s is not supported. Reason: %s.接口调用中某个参数/标志位/组合不被支持带明确原因EE1011%s failed. Value %s for parameter %s is invalid. Reason: %s.参数取值非法通常是取值范围问题而非能力支持问题EE1012%s failed. Value %s for %s is invalid. Reason: %s.与 EE1011 类似面向对象/属性场景的参数非法从源码实现看ApiErrorDecorator层对支持性support问题优先选用 EE1006对合法性/取值范围问题选用 EE1011/EE1012对系统设备级不支持选用 EE1005。排查时建议结合Reason:描述判断问题性质避免与参数非法类错误码混淆。总结EE1006 是 CANN Runtime 中用于表达接口功能/参数/标志位不被支持的通用错误码其价值在于通过三段式报错失败接口 不支持对象 具体原因将问题定位成本降到最低。处理此类错误的核心原则是以Reason为纲判断是能力限制还是参数使用错误进而调整代码逻辑或进行能力适配。本文结合 error_code.json、error_code_meta.h 及 api_error.cc 等源码路径梳理了 Event/Stream 标志位、IPC 事件、Fusion 任务组合、内存类型等典型触发场景可作为你排查 EE1006 的对照清单。如需了解更细的接口参数约束可进一步查阅 事件管理接口说明 与 流管理接口说明。【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门