CANN Runtime 错误码 EE1011(Invalid_Argument)深度解读:含义、触发场景与定位指南
【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime
EE1011 是 CANN Runtime(RTS 模块)中用于报告"参数取值非法(Invalid_Argument)"的核心错误码,出现在rtStreamSwitchN、rtStreamSwitchEx、rtStreamActive、设备/内存/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占位符的含义依次为:
- 报错阶段:通常是被调用的接口名(如
rtStreamSwitchN)或内部操作描述; - 参数值:实际传入的非法数值(打印为十进制字符串);
- 参数名:触发校验失败的参数标识,如
stm->modelNum、logicId、geModelIdx; - 报错原因:对"为什么非法"的补充说明,例如"流未绑定模型"。
需要特别说明的是:完整的运行时日志还会在末尾追加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->modelNum与activeStream->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 的报错信息中已经精确指出了参数名与非法参数值,因此第一步是定位到具体参数并核对取值范围:
- 从报错中提取
parameter %s与Value %s:例如stm->modelNum值为0、logicId值非法、priority值非法; - 对照接口头文件确认取值要求:Runtime 对外接口声明位于 include/external/acl 目录(如
acl_rt.h、acl_base_rt.h),各接口的入参约束以头文件注释与 API 参考文档(流管理见 06_stream_management.md)为准; - 检查数值是否溢出:如
elementSize过大导致size * elementSize溢出(对应 api_c_stream.cc 的INVALID_UINT32 / size保护); - 检查对象是否为空指针:EE1011 通常与空指针校验(对应 EE1004)配合使用,若报错前还有
NULL提示,需先处理指针生命周期问题。
2. 检查接口的调用关系
EE1011 的报错原因(Reason字段)往往会透出"调用前提不满足",例如示例中的The stream is not bound to a model。这类问题的根因不在参数值本身,而在于调用顺序或对象状态:
- 确认对象是否完成前置初始化:例如参与条件切换(
rtStreamSwitchN/rtStreamSwitchEx)与流激活(rtStreamActive)的流必须先与模型绑定,使IsModelStream()返回真; - 梳理接口调用时序:对照接口文档中"前置条件"章节,确认诸如
aclrtSetDevice→ 建流 → 模型绑定 → 条件切换的执行顺序; - 确认上下文归属:Runtime 接口通常要求流、事件、模型等对象归属当前上下文(对应 EE1010、EE1018 等相邻错误码的排查逻辑),上下文不匹配可能被归因为参数非法。
3. 结合日志与错误码体系进一步定位
- EE1011 以
DLOG_ERROR级别写入日志,可依据 设置日志级别 与 查看日志 的方法定位到具体报错点; - 异步执行场景下,错误码通过 错误上报相关 API 在流/回调中传递,可参考 如何获取和解读 Runtime 异步错误码 建立完整的错误归因链路;
- 若日志中出现
ErrorCode=EE1011后缀,说明错误已由 Runtime 错误码表统一格式化输出,直接以该字符串检索日志即可。
六、与相邻错误码的区分
EE1011 属于 RTS-Errors 系列中"参数校验"一族,实际排查中容易与以下错误码混淆,可通过报错信息形态快速区分:
| 错误码 | 名称 | 报错特征 | 典型场景 |
|---|---|---|---|
| EE1001 | Invalid_Argument | 仅携带扩展信息Reason | 通用参数非法,无参数名/参数值字段 |
| EE1003 | Invalid_Argument | 含Expected value,给出期望值 | 参数值越界且文档明确期望范围 |
| EE1004 | Invalid_Argument_Null_Pointer | cannot be a NULL pointer | 空指针入参 |
| EE1011 | Invalid_Argument | 含Value、parameter、Reason三个字段 | 参数值非法,且附带具体原因 |
| EE1012 | Invalid_Argument | 消息模板为for %s is invalid(无parameter字样) | 同族变体 |
| EE1017 | Invalid_Argument | 消息模板为Parameter %s is invalid(无Value字段) | 参数非法但未打印值 |
| EE1018 | Invalid_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),仅供参考