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

发布时间:2026/11/11 6:42:57

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/11/11 11:13:57

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

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

2026/11/9 19:45:31

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/10/30 14:08:43

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

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

2026/11/11 19:31:09

电工证拿到了怎么转异地?考前押题全搞定

电工证拿到了怎么转异地?考前押题全搞定 之前考的证在外省能不能转过来?这个问题困扰了太多人,尤其是像我这样的信阳公路工程从业者,当初在老家考的电工证,现在到了外地项目,证件用不上就成了摆设。好在最近我研究了一下, 考前押题…

2026/11/11 19:31:09

电工证 丢了 重庆到期换证流程

电工证丢了重庆怎么补办?学历不高怕报不上名的良心建议 你不是一个人,学历不高、担心报名被拒,这事儿我懂。今天就讲讲【电工证 丢了 重庆】的补办流程,还有那些藏在细节里的坑,全是 良心建议 ,别走弯路。…

2026/11/11 19:31:09

电工证如何领取实体卡全国通用的避坑指南

电工证如何领取实体卡全国通用的避坑指南 怕考不过白交培训费?南阳卧龙区的市政公用工程从业者们,你们不是一个人在战斗。电工证是从事电气作业的必备门槛,也是全国通用的“通行证”。但很多人在报考和领取实体卡的过程中,常常被各种细节绕晕,甚至花了钱…

2026/11/11 19:26:09

有电工证试题的宝典继续教育学时要求

电工证试题宝典来了!考不过白交钱?值不值得考先看这个 怕考不过白交培训费?电工证试题宝典来了,值不值得考,看完这篇你心里有数了。现在电工证成了刚需,但很多人在报班前就担心:花了几千块报名,万一考试不过,岂不是竹篮打水一场空?别急,这篇就帮你…

2026/11/11 12:42:59

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/11 0:02:26

考低压电工证通过率考试真题与备考技巧

低压电工证通过率高不高?学历不高也能考,值不值得考? 你是不是总听说电工证能帮你找高薪工作,但又担心自己学历不够,考不上?其实,低压电工证考试门槛并没有你想象中那么高,关键是方法对不对。这篇文章就告诉你, 考低压电工证通过率到底有多高 ,…

2026/11/11 0:02:26

低压电工证学时千万别踩坑,濮阳毕业生怎么避坑报名

低压电工证学时千万别踩坑,濮阳毕业生怎么避坑报名 你是不是也和我一样,刚毕业就听说低压电工证学时必须达标才能上岗?可一打听,发现报名机构五花八门,价格参差不齐, 不知道去哪报名怕被中介坑…

2026/11/10 20:08:15

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

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

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

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