news 2026/9/20 5:24:34

CANN Runtime 错误码 EE1011(Invalid_Argument)深度解读:含义、触发场景与定位指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN Runtime 错误码 EE1011(Invalid_Argument)深度解读:含义、触发场景与定位指南

CANN Runtime 错误码 EE1011(Invalid_Argument)深度解读:含义、触发场景与定位指南

【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime

EE1011 是 CANN Runtime(RTS 模块)中用于报告"参数取值非法(Invalid_Argument)"的核心错误码,出现在rtStreamSwitchNrtStreamSwitchExrtStreamActive、设备/内存/SoC 版本查询等大量 Runtime 接口的参数校验路径上。本文基于开源仓库的官方错误码文档与源码实现,逐字段拆解 EE1011 的报错格式,还原典型报错(如stm->modelNum非法)背后的真实代码逻辑,并给出"检查参数范围 + 检查调用关系"两条可落地的排查方法论,帮助开发者快速定位并修复此类问题。

一、错误码概览:EE1011 是什么

EE1011 属于 RTS-Errors 错误码系列(EE10xx段),错误码全称为Invalid_Argument,语义是:接口调用时传入的某个参数值非法。它与其他同类错误码(EE1001、EE1003、EE1012、EE1017、EE1022 等)共同构成 Runtime 层对"入参校验失败"这一类问题的错误上报体系。

从源码看,EE1011 的正式定义位于 src/runtime/core/inc/common/error_code_meta.h 的 X-Macro 错误码元数据表中:

/* EE1011 - Invalid_Argument */ X(EE1011, "EE1011", ("func", "value", "param", "reason"), "%s failed. Value %s for parameter %s is invalid. " "Reason: %s. ErrorCode=EE1011.\n", DLOG_ERROR)

这里给出了该错误码的四个参数与完整消息模板:

参数名含义对应报错字段
func报错阶段(调用的接口或执行的操作)%s failed中的第一个%s
value非法的参数值Value %s
param非法的参数名parameter %s
reason报错原因(补充说明为何非法)Reason: %s

同时该表还声明了错误日志级别为DLOG_ERROR,即 EE1011 属于 Error 级错误,会写入 Runtime 的 plog 日志。这也是 如何获取和解读 Runtime 异步错误码 中排查问题时的关键日志线索。

二、错误信息格式:逐字段拆解占位符

官方错误码文档 EE1011-Invalid_Argument.md 给出的报错格式为:

%s failed. Value %s for parameter %s is invalid. Reason: %s.

其中四个%s占位符的含义依次为:

  1. 报错阶段:通常是被调用的接口名(如rtStreamSwitchN)或内部操作描述;
  2. 参数值:实际传入的非法数值(打印为十进制字符串);
  3. 参数名:触发校验失败的参数标识,如stm->modelNumlogicIdgeModelIdx
  4. 报错原因:对"为什么非法"的补充说明,例如"流未绑定模型"。

需要特别说明的是:完整的运行时日志还会在末尾追加ErrorCode=EE1011后缀,这是error_code_meta.h中消息模板自带的部分,便于日志检索与自动化归因。

三、典型报错示例:StreamSwitchN 与模型流绑定

文档中给出的报错示例如下:

StreamSwitchN failed. Value 0 for parameter stm->modelNum is invalid. Reason: The stream is not bound to a model.

逐字段解读:

  • 报错阶段:StreamSwitchN(即rtStreamSwitchN,流条件切换接口);
  • 参数值:0
  • 参数名:stm->modelNum(目标流的模型编号成员);
  • 报错原因:The stream is not bound to a model(该流未绑定模型)。

该报错对应的真实代码逻辑位于 src/runtime/api/impl/api_impl.cc 的ApiImpl::StreamSwitchN实现中:

for (uint32_t i = 0U; i < elementSize; i++) { NULL_PTR_RETURN_MSG_OUTER_WITH_FUNC_DESC( trueStreamPtr[i], RT_ERROR_STREAM_NULL, "Switching between multi-dimensional streams based on conditional operators"); COND_RETURN_AND_MSG_OUTER( !trueStreamPtr[i]->IsModelStream(), RT_ERROR_STREAM_MODEL, ErrorCode::EE1011, "Switching between multi-dimensional streams based on conditional operators", 0, "trueStreamPtr[" + std::to_string(i) + "]->modelNum", RtFmtMsg("The stream (stream_id=%d) is not bound to a model", trueStreamPtr[i]->Id_())); } COND_RETURN_AND_MSG_INVALID_CONTEXT_STREAM_WITH_FUNC_DESC( stm, curCtx, RT_ERROR_STREAM_CONTEXT, "Switching between multi-dimensional streams based on conditional operators"); COND_RETURN_AND_MSG_OUTER( !stm->IsModelStream(), RT_ERROR_STREAM_MODEL, ErrorCode::EE1011, "Switching between multi-dimensional streams based on conditional operators", 0, "stm->modelNum", RtFmtMsg("The stream (stream_id=%d) is not bound to a model", stm->Id_()));

可以清晰看到 EE1011 的产生路径:当条件流切换接口被调用时,Runtime 会逐一校验trueStreamPtr[]中每个流以及目标流stm是否为"模型流"(IsModelStream())。只要某个流尚未与模型绑定(modelNum为 0),就会以RT_ERROR_STREAM_MODEL为内部错误码、以 EE1011 为对外错误码上报。

同样的校验逻辑也出现在流激活接口ApiImpl::StreamActive(api_impl.cc)和条件流切换接口ApiImpl::StreamSwitchEx(api_impl.cc)中,它们的报错字段分别指向stm->modelNumactiveStream->modelNum,报错原因一致。这说明"流必须先绑定模型,才能参与条件切换/激活"是 Runtime 层的通用约束。

四、触发场景:EE1011 在哪些接口中会出现

通过检索源码,EE1011 被广泛用于多个 Runtime 接口的入参校验,主要可分为以下几类场景:

1. 流管理类接口(模型流绑定校验)

  • rtStreamSwitchEx/rtStreamSwitchN/rtStreamActive:见上文 api_impl.cc,校验modelNum是否为 0。

2. 流管理类接口(参数规模与越界校验)

  • rtStreamSwitchN的对外入口 api_c_stream.cc 中,除了空指针与零值校验外,还专门用 EE1011 报告elementSize溢出:
COND_RETURN_EXT_ERRCODE_AND_MSG_OUTER( ((INVALID_UINT32 / size) <= elementSize), RT_ERROR_INVALID_VALUE, ErrorCode::EE1011, __func__, std::to_string(elementSize), "elementSize", "elementSize should be less than INVALID_UINT32 / size to avoid total data size overflow");

3. 设备管理类接口

  • api_c_device.cc:校验geModelIdx(GE 模型索引)取值非法。

4. 内存管理类接口

  • api_c_memory.cc:校验logicId(逻辑设备 ID)取值非法,包括0与非法非零值的两种分支。

5. SoC 版本与平台查询类接口

  • api_c_soc.cc:上报"输入 SoC 版本不受支持"(The input SoC version is not supported),参数名为ver
  • api_c_standard_soc.cc:校验流优先级priority非法。

6. 算子加载与参数解析类接口

  • api_error.cc:校验blockDim(block 维度)在 SIMT 参数场景下为 0 的非法情况。

可以看到,EE1011 覆盖了"数值越界、非法取值、受支持范围不符、对象状态不满足前提"等多类参数非法问题,凡接口文档中标注了参数取值范围或前提条件的地方,都可能触发该错误码。

五、解决方法:从两条主线入手

官方文档给出的解决方法高度凝练为两条,这里结合源码展开为可执行的排查步骤。

1. 检查接口的输入参数范围

EE1011 的报错信息中已经精确指出了参数名非法参数值,因此第一步是定位到具体参数并核对取值范围:

  1. 从报错中提取parameter %sValue %s:例如stm->modelNum值为0logicId值非法、priority值非法;
  2. 对照接口头文件确认取值要求:Runtime 对外接口声明位于 include/external/acl 目录(如acl_rt.hacl_base_rt.h),各接口的入参约束以头文件注释与 API 参考文档(流管理见 06_stream_management.md)为准;
  3. 检查数值是否溢出:如elementSize过大导致size * elementSize溢出(对应 api_c_stream.cc 的INVALID_UINT32 / size保护);
  4. 检查对象是否为空指针:EE1011 通常与空指针校验(对应 EE1004)配合使用,若报错前还有NULL提示,需先处理指针生命周期问题。

2. 检查接口的调用关系

EE1011 的报错原因(Reason字段)往往会透出"调用前提不满足",例如示例中的The stream is not bound to a model。这类问题的根因不在参数值本身,而在于调用顺序或对象状态

  1. 确认对象是否完成前置初始化:例如参与条件切换(rtStreamSwitchN/rtStreamSwitchEx)与流激活(rtStreamActive)的流必须先与模型绑定,使IsModelStream()返回真;
  2. 梳理接口调用时序:对照接口文档中"前置条件"章节,确认诸如aclrtSetDevice→ 建流 → 模型绑定 → 条件切换的执行顺序;
  3. 确认上下文归属:Runtime 接口通常要求流、事件、模型等对象归属当前上下文(对应 EE1010、EE1018 等相邻错误码的排查逻辑),上下文不匹配可能被归因为参数非法。

3. 结合日志与错误码体系进一步定位

  • EE1011 以DLOG_ERROR级别写入日志,可依据 设置日志级别 与 查看日志 的方法定位到具体报错点;
  • 异步执行场景下,错误码通过 错误上报相关 API 在流/回调中传递,可参考 如何获取和解读 Runtime 异步错误码 建立完整的错误归因链路;
  • 若日志中出现ErrorCode=EE1011后缀,说明错误已由 Runtime 错误码表统一格式化输出,直接以该字符串检索日志即可。

六、与相邻错误码的区分

EE1011 属于 RTS-Errors 系列中"参数校验"一族,实际排查中容易与以下错误码混淆,可通过报错信息形态快速区分:

错误码名称报错特征典型场景
EE1001Invalid_Argument仅携带扩展信息Reason通用参数非法,无参数名/参数值字段
EE1003Invalid_ArgumentExpected value,给出期望值参数值越界且文档明确期望范围
EE1004Invalid_Argument_Null_Pointercannot be a NULL pointer空指针入参
EE1011Invalid_ArgumentValueparameterReason三个字段参数值非法,且附带具体原因
EE1012Invalid_Argument消息模板为for %s is invalid(无parameter字样)同族变体
EE1017Invalid_Argument消息模板为Parameter %s is invalid(无Value字段)参数非法但未打印值
EE1018Invalid_Argument_API_Call_Sequence报错含API call sequence相关原因接口调用顺序错误

各错误码的完整模板均可从 error_code_meta.h 的错误码表中查阅,整个系列的全量索引见 RTS-Errors.md。定位时建议先按"报错信息是否包含Value/parameter/Reason三段式"来判断是否命中 EE1011,再按本文第五节的方法排查。

七、小结

EE1011 是 CANN Runtime 上报"参数值非法"的标准错误码,其三段式报错信息(值、参数名、原因)本身就提供了相当精确的定位线索。面对该错误码时,遵循"先核对参数取值范围、再核对接口调用关系与对象状态"的两步排查法,并善用日志与错误码家族对照表,绝大多数参数非法问题都能快速收敛;尤其对条件流切换、流激活这类依赖"模型流绑定"状态的接口,务必确认流对象已先完成模型绑定再参与后续操作。

【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 5:23:28

OpenToonz 音画同步 5 步实战:从音频导入到帧级对齐

OpenToonz 音画同步 5 步实战&#xff1a;从音频导入到帧级对齐 【免费下载链接】opentoonz OpenToonz - An open-source full-featured 2D animation creation software 项目地址: https://gitcode.com/GitHub_Trending/op/opentoonz OpenToonz 是开源的 2D 动画创作软…

作者头像 李华
网站建设 2026/9/20 5:22:44

二叉树数据结构:核心概念、类型与工程实践

1. 二叉树基础概念解析二叉树是计算机科学中最基础且重要的数据结构之一&#xff0c;它由节点&#xff08;Node&#xff09;组成的有限集合&#xff0c;这个集合要么为空&#xff0c;要么由一个根节点和两棵互不相交的、分别称为左子树和右子树的二叉树组成。这种递归定义赋予了…

作者头像 李华
网站建设 2026/9/20 5:22:39

操作系统进程管理课程设计:PCB、调度算法与死锁验证

简介&#xff1a;这份资源是面向计算机、网络工程等专业学生的操作系统课程设计实验报告&#xff0c;聚焦进程管理系统的设计与实现&#xff0c;适合正在完成操作系统课程设计或准备相关实验答辩的本科学习者参考。报告围绕进程调度、存储管理、文件管理、多道程序转换调度及操…

作者头像 李华
网站建设 2026/9/20 5:22:20

并行AI Agent必备:用Worktrunk管理Git Worktree,彻底解决代码隔离

最近把 Codex CLI 和 Claude Code 这类编程 Agent 真正并行起来跑的时候&#xff0c;我发现 Git 分支切换很快就成了最大的瓶颈。两个 Agent 同时开工&#xff0c;每个都要在同一个仓库里“写自己的那部分”&#xff0c;但大家都挤在主分支的工作目录里&#xff0c;结果就是代码…

作者头像 李华
网站建设 2026/9/20 5:21:26

DLT 5222-2005在变电设计中的导体与电器选型要点

简介&#xff1a;《DLT 5222-2005 导体和电器选择设计技术规定》是电力行业重要的设计标准&#xff0c;面向电气工程设计与施工人员&#xff0c;用于规范发电、输电、变电及配电环节中导体和电器的选型与设计&#xff0c;保障系统安全稳定运行。这份PDF共1个文件&#xff0c;大…

作者头像 李华