CANN opbase 算子参数值校验日志宏 OP_LOGE_FOR_INVALID_VALUE 使用指南

发布时间:2026/9/18 19:32:56

CANN opbase 算子参数值校验日志宏 OP_LOGE_FOR_INVALID_VALUE 使用指南 CANN opbase 算子参数值校验日志宏 OP_LOGE_FOR_INVALID_VALUE 使用指南【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase导读OP_LOGE_FOR_INVALID_VALUE是 CANN opbase 基础框架库为算子与 aclnn 接口实现提供的参数值校验日志宏用于在算子的某个参数取值与预期不符时输出 ERROR 级别日志并同步上报 EZ0024 预定义错误码。本指南围绕该宏的功能说明、函数原型、参数语义、底层实现与调用示例展开帮助算子开发者在宿主侧Host的参数合法性检查场景中用一行代码完成日志打印 错误码上报的标准化错误处理。功能说明在算子实现尤其是 Shape 推导、Tiling 计算等 Host 侧逻辑中经常需要对算子参数Attribute 或输入参数的取值范围、枚举值进行合法性校验。当校验失败时如果只写普通的printf或裸的OP_LOGE往往存在两个问题日志格式不统一、错误信息无法被上层框架结构化解析。OP_LOGE_FOR_INVALID_VALUE解决的就是这个问题它记录并上报参数值校验错误。当算子的指定参数值与预期不符时该宏会输出一条 ERROR 级别日志带文件名、行号、函数名、线程 ID、算子名等上下文信息通过REPORT_PREDEFINED_ERR_MSG(EZ0024, ...)上报 EZ0024 预定义错误码将参数名、算子名、错误值、正确值四个字段以键值对形式写入错误消息供上层框架解析与定位。该宏属于仅供算子或 aclnn 实现使用的接口声明与实现在 include/op_common/log/log.h 中。函数原型OP_LOGE_FOR_INVALID_VALUE(entityName, paramName, incorrectValue, correctValue)宏的使用方式与函数一致调用时直接传入四个参数即可不需要加分号外的额外处理。该宏在 include/op_common/log/log.h#L733-L747 中的完整定义如下#define OP_LOGE_FOR_INVALID_VALUE(entityName, paramName, incorrectValue, correctValue) \ do { \ std::string _safe_entityName_(entityName); \ std::string _safe_paramName_(paramName); \ std::string _safe_incorrectValue_(incorrectValue); \ std::string _safe_correctValue_(correctValue); \ OP_LOGE_LIBOPAPI_REPORT(_safe_entityName_.c_str(), \ Parameter %s of %s has incorrect value %s. It should be %s., \ _safe_paramName_.c_str(), _safe_entityName_.c_str(), \ _safe_incorrectValue_.c_str(), _safe_correctValue_.c_str());\ const std::vectorconst char* msgKey {param_name, op_name, incorrect_value, correct_value}; \ const std::vectorconst char* msgvalue {_safe_paramName_.c_str(), _safe_entityName_.c_str(), \ _safe_incorrectValue_.c_str(), _safe_correctValue_.c_str()}; \ REPORT_PREDEFINED_ERR_MSG(EZ0024, msgKey, msgvalue); \ } while (0)从定义可以看出宏体被do { ... } while (0)包裹可以安全地用在if/else分支中不会产生悬挂 else 问题四个参数都会先被拷贝为局部std::string再通过.c_str()传入日志与错误上报接口避免传入临时对象或字面量时产生悬垂指针日志与错误码上报共用同一组格式化参数保证日志里写的和错误码里报的完全一致。参数说明参数名输入/输出说明entityName输入算子名称或 aclnn 接口名称支持const char*或std::string类型。paramName输入参数名称支持const char*或std::string类型。incorrectValue输入实际参数值支持const char*或std::string类型。correctValue输入预期参数值支持const char*或std::string类型。返回值说明无。宏仅负责输出日志与上报错误码不改变程序返回值。约束说明无。该宏对使用场景无特殊限制但按照其设计意图应仅在参数值校验失败的分支中调用。日志输出与错误码上报的底层链路日志格式OP_LOGE_FOR_INVALID_VALUE内部调用OP_LOGE_LIBOPAPI_REPORT定义在 include/op_common/log/log.h#L106-L115其格式化模板为[文件名:行号][OP_SUBMOD_NAME][函数名][线程ID] OpName:[算子名] Parameter %s of %s has incorrect value %s. It should be %s.其中OP_SUBMOD_NAME默认值为OPS_BASEinclude/op_common/log/log.h#L52-L54线程 ID 通过syscall(__NR_gettid)获取include/op_common/log/log.h#L56-L60。日志级别为DLOG_ERROR值为 3见 include/op_common/log/log.h#L38-L40输出前会先通过CheckLogLevel检查日志开关避免在关闭 ERROR 日志的场景下产生额外开销。错误码 EZ0024宏上报的错误码为EZ0024对应的消息模板与解决建议见 docs/zh/error_code/Operator-Errors/EZ0024-Invalid_Argument.mdParameter %s of %s has incorrect value %s. It should be %s.占位符%s的含义依次为参数名、算子名或接口名、错误值、正确值。上报时以键值对形式携带四个字段param_name、op_name、incorrect_value、correct_value便于上层错误管理框架如op_error_manager结构化解析与聚合去重。与普通日志宏的差异与OP_LOGE上报 EZ9999 通用错误码见 include/op_common/log/log.h#L1076-L1080相比OP_LOGE_FOR_INVALID_VALUE携带了EZ0024 专属错误码能够精确表达参数值错误这一错误类别而不是落入笼统的内部错误。这也是 opbase 在 include/op_common/log/log.h 中维护 EZ0008~EZ0038 一整套通用参数校验宏General Parameter Validation Macros见 include/op_common/log/log.h#L285-L288的初衷针对形状、维度、size、format、dtype、value、stride、list size 等不同维度给出语义明确的错误码实现错误信息标准化。调用示例以下示例来自原文档展示了对算子参数进行范围校验的典型用法。关键代码示例如下仅供参考不支持直接拷贝运行// 预期输出: Parameter sp of AttentionUpdate has incorrect value 17. It should be // in range of [1, 16]. if (sp_ 1 || sp_ 16) { OP_LOGE_FOR_INVALID_VALUE(AttentionUpdate, sp, std::to_string(sp_), in range of [1, 16]); return ge::GRAPH_FAILED; }将示例扩展为更贴近真实算子实现的完整形态// 对枚举类参数做取值校验 if (update_type_ ! 0 update_type_ ! 1) { // 预期输出: Parameter update_type of AttentionUpdate has incorrect value 2. // It should be 0 or 1. OP_LOGE_FOR_INVALID_VALUE(AttentionUpdate, update_type, std::to_string(update_type_), 0 or 1); return ge::GRAPH_FAILED; } // 对字符串参数做取值校验 if (paddingMode ! SAME paddingMode ! VALID) { OP_LOGE_FOR_INVALID_VALUE(Conv2D, paddingMode, paddingMode, SAME or VALID); return ge::GRAPH_FAILED; }实践要点incorrectValue建议通过std::to_string()将数值转成字符串或直接传入已格式化的字符串日志接口统一按%s打印避免类型不匹配correctValue既可以描述具体的预期值如0 or 1也可以描述取值范围如in range of [1, 16]描述越精确用户越容易快速修复宏不改变返回值调用后仍需显式return错误码如ge::GRAPH_FAILED建议与OP_CHECK_IF等组合使用OP_CHECK_IF定义见 include/op_common/log/log.h#L1082-L1088。仓库中的实际使用场景在本仓库源码中同族宏OP_LOGE_FOR_INVALID_VALUE_WITH_REASON上报 EZ0026被大量用于 reduce 模板 Tiling 参数校验例如 src/op_common/atvoss/reduce/reduce_tiling.cpp#L389-L415 对vectorCoreNum、ubSize、cacheLineSize、ubBlockSize、vRegSize等 Tiling 关键参数的合法性检查以及同文件 src/op_common/atvoss/reduce/reduce_tiling.cpp#L972-L1020 中对ubSize、basicBlock的校验。其调用模式与本宏完全一致if (ubSize_ 0) { OP_LOGE_FOR_INVALID_VALUE_WITH_REASON(context_-GetNodeName(), ubSize, std::to_string(ubSize_), larger than 0); return false; }可见if校验失败 → 调用日志宏 → 返回错误是 opbase 内部统一的参数校验范式。其中entityName可以直接使用context_-GetNodeName()动态获取当前算子名无需硬编码。相关宏对比该宏属于 log 接口家族的一员完整的接口清单见 docs/zh/api/op_common/log/log.md。与参数值校验相关的三个宏对比如下宏上报错误码语义适用场景OP_LOGE_FOR_INVALID_VALUEEZ0024单参数值错误带正确值校验失败时能明确给出预期值/范围OP_LOGE_FOR_INVALID_VALUE_WITH_REASONEZ0026单参数值错误带失败原因能解释为什么非法例如超出硬件支持上限OP_LOGE_FOR_INVALID_VALUES_WITH_REASONEZ0027多参数值错误带失败原因多个参数同时校验、一起上报各宏的详细说明分别见 docs/zh/api/op_common/log/OP_LOGE_FOR_INVALID_VALUE.md、docs/zh/api/op_common/log/OP_LOGE_FOR_INVALID_VALUE_WITH_REASON.md 与 docs/zh/api/op_common/log/OP_LOGE_FOR_INVALID_VALUES_WITH_REASON.md。如果校验的是形状、维度、size、format、dtype 而非取值应改用同族宏OP_LOGE_FOR_INVALID_SHAPEEZ0008、OP_LOGE_FOR_INVALID_SHAPEDIMEZ0011、OP_LOGE_FOR_INVALID_SHAPESIZEEZ0014、OP_LOGE_FOR_INVALID_FORMATEZ0017、OP_LOGE_FOR_INVALID_DTYPEEZ0019等各宏定义均位于 include/op_common/log/log.h定义处注释中标注了对应的错误码。使用建议与错误码文档联动排查当线上出现 EZ0024 错误码时可直接对照 docs/zh/error_code/Operator-Errors/EZ0024-Invalid_Argument.md 中的报错示例与解决方法来定位问题——检查参数值是否正确。保持参数语义一致entityName应使用对外可见的算子名或 aclnn 接口名动态场景可用context_-GetNodeName()不要使用内部类名否则用户难以理解报错归属。优先使用专用宏凡是参数类校验失败优先使用带 EZ 错误码的专用宏而不是裸OP_LOGE以便错误码上报链路能够按类别聚合统计。校验失败立即返回宏只负责记录与上报真正的中断逻辑return必须由调用方完成避免只打日志不报错的静默失败。【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/18 19:32:56

Keil 5 界面主题优化全攻略:从默认白到暗色护眼主题

每天一打开 Keil 5,迎面就是一片惨白的高亮背景和默认的“上古”配色,代码还没写几行,眼睛先被晃得难受。相信我,这不是你一个人遇到的问题。用 MDK 做嵌入式开发的朋友,多多少少都动过“把界面弄好看点”的念头&#…

2026/9/18 19:32:56

GitHub Desktop 使用教程:图形化 Git 分支管理与协作实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 19:32:56

智能工厂信息化顶层设计:从分层架构到实施路径

简介:一套面向智能制造与数字化转型领域的演示文稿方案,定位为智能工厂信息化顶层设计参考,适合制造业管理者、信息化规划人员与项目团队使用。内容基于郎丰利2022年8月整理的体系化框架,从智能制造“想”“响”“做”三个层面展开…

2026/9/18 20:43:02

从零到实战:AI学习路线与大模型应用开发指南

先把话说在前面:我见过太多人在AI这条路上半途而废,不是因为智商不够,而是因为一开始就没想清楚自己要走到哪一步。AI学习路线这个词这几年被说烂了,但真正能跑通“从零到实战”这条完整链路的人并不多。大多数人卡在两个地方&…

2026/9/18 20:43:02

嵌入式软件架构设计:分层、硬件抽象与模块解耦实战

1. 先搞清楚:嵌入式项目为什么会越写越乱嵌入式开发这行有个很有意思的现象:同一个功能,两个工程师写出来的代码量能差出三四倍,但真正拉开差距的不是谁敲得快,而是三个月后谁还能改得动。我至今记得接手过一个工业网关…

2026/9/18 20:43:02

PLC编程思路进阶:星-角降压启动与32台变频器Modbus轮询

干了十来年现场调试,带过的新人没有二十也有十五六个,发现一个特别普遍的现象:梯形图那些基本指令,个个背得滚瓜烂熟,可一碰到真实项目就发懵。给他一个"一拖三"的启动柜,或者一句"32台变频…

2026/9/18 20:43:02

后端API接口设计规范:从URL建模到文档自动化的完整实践

先说一个我观察了很久的现象:绝大多数后端项目的接口,“能用”和“好用”之间隔着的不是代码能力,而是一套从第一天就定死的约定。功能都做出来了,功能是真的在跑;可一旦进入前后端联调、版本迭代、新人接手这些环节&a…

2026/9/18 20:43:02

Windows10+VSCode 免编译配置 OpenCV 与 C++ 图像处理

OpenCV 在 Windows 上最劝退人的从来不是 API 本身,而是让它跟编译器对上眼的那半天。我见过太多人在 CMake 的 Configure 阶段卡上三个小时,反复点 Generate 却永远报同一个错,最后干脆放弃在 Windows 上做图像处理,转头去借别人…

2026/9/18 20:38:02

RBF径向基函数多元插值:原理、参数调优与实战指南

搞多元插值的人,几乎都绕不开 RBF(Radial-Basis Function,径向基函数)。前阵子我在处理一个三维扫描点云重建曲面的需求,数据是从多个角度拼出来的散乱点,没有拓扑结构,传统网格插值根本没法直接…

2026/9/18 14:13:01

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/18 0:01:09

Google Colab 实战:运行模型、数据加载与报错排查

1. 为什么我劝你先搞懂 Colab 的运行模型1.1 Colab 到底是什么,跟本地跑代码差在哪Google Colab 简单说就是一台跑在浏览器里的 Linux 虚拟机,你打开一个 Notebook,背后就连上了一台带 GPU 的远程机器。你在单元格里敲的每一行 Python&#x…

2026/9/18 0:01:09

C语言数据类型与表达式详解

1. C语言数据与数据类型概述在C语言编程中,数据是程序处理的核心对象。理解数据的分类和特性是掌握C语言的基础。C语言中的数据主要分为四大类:常量、变量、表达式和函数。这些数据类型构成了C语言程序的基本元素,每种类型都有其独特的特性和…

2026/9/18 0:01:09

SQL时间字段指定时间段查询:区间语义、索引与时区避坑

上周排查一个线上问题&#xff0c;用户反馈"昨天的订单一条都没查到"&#xff0c;但数据库里明明躺着两千多条。最后定位下来&#xff0c;不是数据丢了&#xff0c;也不是接口挂了&#xff0c;而是那个查询条件把时间段写成了> 2024-05-20 00:00:00 AND < 2024…

2026/9/18 14:13:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/18 14:13:02

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/18 14:13:02

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码