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),仅供参考

相关新闻

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

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

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

2026/9/18 19:32:54 阅读更多 →
GitHub Desktop 使用教程:图形化 Git 分支管理与协作实践

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:54 阅读更多 →
智能工厂信息化顶层设计:从分层架构到实施路径

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

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

2026/9/18 19:32:54 阅读更多 →

最新新闻

大语言模型学习路线:从零基础到AI工程师

大语言模型学习路线:从零基础到AI工程师

1. 为什么现在是大语言模型学习的最佳时机?2023年被称为"大语言模型元年",各种参数规模超过百亿的模型如雨后春笋般涌现。但不同于早期需要专业实验室才能接触的AI技术,如今个人开发者只需一台普通电脑就能运行微调后的开源模型。这…

2026/9/18 22:36:44 阅读更多 →
JavaScript中this的绑定规则与Maui框架解决方案

JavaScript中this的绑定规则与Maui框架解决方案

1. 项目概述:驯服JavaScript中的this难题在JavaScript开发中,this关键字的行为常常让开发者感到困惑。不同于传统面向对象语言中this指向的确定性,JavaScript中的this更像是一个"会变形的怪物"——它的指向取决于调用方式、执行环境…

2026/9/18 22:36:44 阅读更多 →
OneUptime 工作流运行与日志(Runs  Logs)深度指南:状态机、步骤追踪与故障排查实战

OneUptime 工作流运行与日志(Runs Logs)深度指南:状态机、步骤追踪与故障排查实战

OneUptime 工作流运行与日志(Runs & Logs)深度指南:状态机、步骤追踪与故障排查实战 【免费下载链接】oneuptime Complete open-source monitoring and observability platform. 项目地址: https://gitcode.com/GitHub_Trending/on/one…

2026/9/18 22:36:44 阅读更多 →
Godot 官方示例项目实战指南:跑通 6 个 Demo,搭出你的第一个游戏

Godot 官方示例项目实战指南:跑通 6 个 Demo,搭出你的第一个游戏

Godot 官方示例项目实战指南:跑通 6 个 Demo,搭出你的第一个游戏 【免费下载链接】godot-demo-projects Demonstration and Template Projects 项目地址: https://gitcode.com/GitHub_Trending/go/godot-demo-projects 这个仓库就是 Godot 官方维…

2026/9/18 22:36:44 阅读更多 →
WebRTC核心链路:从MediaStreamTrack采集到addTrack进RTCPeerConnection

WebRTC核心链路:从MediaStreamTrack采集到addTrack进RTCPeerConnection

在WebRTC开发里,“pc”几乎是每个人嘴边挂着的缩写,它的全名是RTCPeerConnection。做音视频通话、直播连麦、屏幕共享,核心动作就那几个:采集、编码、传输、解码、渲染。而“一条Track是如何被添加进pc的”,这个看似普…

2026/9/18 22:36:44 阅读更多 →
douyin-downloader:抖音去水印批量下载工具新手上手指南

douyin-downloader:抖音去水印批量下载工具新手上手指南

douyin-downloader:抖音去水印批量下载工具新手上手指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback sup…

2026/9/18 22:35:44 阅读更多 →

日新闻

Matlab手写逻辑回归:从数学原理到多变量概率预测模型实现

Matlab手写逻辑回归:从数学原理到多变量概率预测模型实现

很多朋友第一次看到"逻辑回归"这四个字,第一反应就是——这玩意儿是个回归模型吧?我当年也是在Matlab里跑完一段代码,看着输出的0.73、0.86这种概率值,才回过神来:这家伙其实是披着回归外衣的分类神器&#…

2026/9/18 0:00:28 阅读更多 →
高值医用耗材研报PDF:用Python完成字段抽取、清洗与趋势预测

高值医用耗材研报PDF:用Python完成字段抽取、清洗与趋势预测

简介:这份报告是2023-2028年高值医用耗材行业调研及发展前景趋势预测报告,面向医疗器械企业管理者、投资机构、行业研究人员及关注政策变化的从业者,用于把握行业监管动向、市场格局与未来趋势。报告以PDF格式呈现,共1个文件、整体…

2026/9/18 0:00:28 阅读更多 →
三维高斯场赋能世界模型:几何语义蒸馏与机器人决策实战

三维高斯场赋能世界模型:几何语义蒸馏与机器人决策实战

先把我自己的背景交代一下:我之前在搞具身智能和机器人导航相关的项目,很长一段时间里都被“环境表示”这件事卡着。传统做法是用点云或者网格做几何建模,语义信息另外再跑分割模型,两套东西各管各的,时间一长就会发现…

2026/9/18 0:00:28 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/16 19:03:19 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/17 7:57:36 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/17 10:19:14 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/15 21:39:18 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →