CANN ops-math 数学算子 IsNan 详解:源码实现、图模式调用与工程验证
算子库人工智能CANN【免费下载链接】ops-math本项目是CANN提供的数学类基础计算算子库实现网络在NPU上加速计算。项目地址https://gitcode.com/cann/ops-math点击查看免费下载导读IsNan 是 CANN ops-math 数学算子库math/ 目录中一个典型的逐元素elementwise判断算子用于检测张量中哪些元素是 NaNNot a Number。本文以 math/is_nan/README.md 为骨架结合该算子完整的 op_def、tiling、kernel 实现 与 测试用例 源码系统讲解 IsNan 的功能语义、参数约束、产品支持范围、图模式构图调用方式以及底层 AIV 核上的 DAG 实现原理帮助读者在 NPU 上正确使用并深入理解这一算子。功能说明IsNan 算子的功能是判断输入张量中哪些元素是 NaN输出与输入形状相同的 BOOL 张量元素为true表示对应输入位置是 NaN。计算公式如下$$ out_i(input_i ! input_i) $$该公式利用了 IEEE 754 浮点标准中 NaN 不等于任何值包括自身 的特性是判断 NaN 的标准手法。官方 README 给出两组示例若x[9, 6, 3]计算结果为[False, False, False]三个元素均为正常数值。若x[[-3.14, inf], [2.7183, nan]]计算结果为[[False, False], [False, True]]inf不是 NaN因此对应位置为False只有nan所在位置为True。从算子原型 is_nan_proto.h 的注释可以看到该算子与 TensorFlow 的IsNan算子兼容Compatible with tensorflow IsNan operator输入支持 1D ~ 8D 张量。对于正常数值包括正负无穷返回False这是 NaN 判断与无穷判断的关键区别。产品支持情况README 明确给出了 IsNan 算子的软硬件支持矩阵产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产品√Atlas A2 训练系列产品/Atlas A2 推理系列产品√Atlas 200I/500 A2 推理产品×Atlas 推理系列产品×Atlas 训练系列产品×与支持矩阵相对应is_nan_def.cpp 中通过this-AICore().AddConfig(ascend950, aicoreConfig)和this-AICore().AddConfig(ascend350, aicoreConfig)注册了两个 AICore 平台配置op_host/config/ 目录下也分别提供了ascend950/含 is_nan_binary.json 与is_nan_simplified_key.ini和ascend350/含 is_nan_binary.json的平台专属配置。由此可见当前仓库中的 IsNan 算子实现面向 950/350即 A2/A3 系列架构使用前应先确认目标设备落在支持矩阵内。参数说明IsNan 算子只有 1 个输入和 1 个输出均为必选REQUIRED参数参数名输入/输出/属性描述数据类型数据格式x输入公式中的输入 input_iFLOAT、FLOAT16、BFLOAT16NDy输出公式中的输出 out_iBOOLND补充说明依据源码输入x支持 3 种浮点类型FLOATFP32、FLOAT16FP16、BFLOAT16BF16数据格式限定为ND这与 is_nan_def.cpp 中Input(x).DataType({ge::DT_BF16, ge::DT_FLOAT16, ge::DT_FLOAT}).Format({ge::FORMAT_ND, ...})的注册一致。注意不接收整数、双精度等其它类型若传入不支持的数据类型tiling 阶段会直接报错返回GRAPH_FAILED见下文约束小节。输出y的数据类型固定为BOOL。即便图模式下未显式指定输出类型is_nan_graph_infer.cpp 中的InferDataType4SingleOutBool也会在推理阶段将输出数据类型强制置为DT_BOOL。输出形状与输入形状完全一致。由 is_nan_infershape.cpp 中的InferShape4IsNan实现*out_shape *in_shape;。约束说明README 中标注 IsNan 算子的约束为「无」。但从源码层面看存在如下由实现施加的隐含约束使用时应予以注意数据类型约束输入必须是FLOAT16/BFLOAT16/FLOAT之一。在 tiling 阶段is_nan_tiling_arch35.cpp 的CalcInputDtype()会对输入类型做校验非上述类型时记录OP_LOGE_FOR_INVALID_DTYPE错误并返回GRAPH_FAILED。形状一致性约束tiling 的CheckShape()会校验输入x与输出y的存储形状完全一致inputXShape ! outputYShape时报错这也与 infershape 阶段输出形状等于输入形状的规则互为印证。输出类型约束CalcOutputDtype()要求输出必须是BOOL否则同样报错返回。设备约束仅支持支持矩阵中列出的产品例如 Atlas 200I/500 A2 推理产品等不在支持列表内。调用说明图模式调用算子 IR 构图README 给出的官方调用方式是图模式调用即通过算子 IR 构建计算图后在 GEGraph Engine会话中运行。核心代码是 test_geir_is_nan.cpp使用 is_nan_proto.h 中REG_OP(IsNan)注册的算子原型构图。整个调用流程分为四步初始化 GE通过ge::GEInitialize(global_options)初始化图引擎其中ge.exec.deviceId指定设备号示例为0ge.graphRunMode设为1图模式运行。构建计算图创建Graph对象在CreateOppInGraph()中通过auto isnan op::IsNan(isnan)创建 IsNan 算子节点用ADD_INPUT宏创建Data占位节点并生成全 2.0 的 FP32 输入数据形状{4, 4}用ADD_OUTPUT宏声明DT_BOOL、形状同为{4, 4}的输出最后graph.SetInputs(inputs).SetOutputs(outputs)绑定图输入输出。会话运行创建ge::Sessionsession-AddGraph(graph_id, graph)添加计算图session-RunGraph(graph_id, input, output)执行。运行结束后将输入/输出张量分别落盘为tc_ge_irrun_test_0008_npu_input_0.bin与tc_ge_irrun_test_0008_npu_output_0.bin并逐元素打印输出结果。资源回收调用ge::GEFinalize()结束会话。构图的关键代码片段如下auto isnan op::IsNan(isnan); std::vectorint64_t xShape {4, 4}; // 输入 xFP32形状 {4,4} ADD_INPUT(1, x, inDtype, xShape); // 输出 yBOOL形状与输入一致 ADD_OUTPUT(1, y, DT_BOOL, xShape); outputs.push_back(isnan);其中宏ADD_INPUT内部调用isnan.set_input_x(placeholder)、ADD_OUTPUT调用isnan.update_output_desc_y(...)与算子原型 is_nan_proto.h 中定义的INPUT(x, ...)/OUTPUT(y, ...)一一对应。其它调用方式从仓库结构看IsNan 与 ops-math 中其它算子一样最终由 GE 统一调度执行。图模式之外用户也可参照 examples/ 目录下的 add_example 等示例通过框架层如 op_api 模式间接触发该算子执行具体以 examples/README.md 的构建运行说明为准。源码级实现原理算子定义op_defis_nan_def.cpp 通过OP_ADD(IsNan)完成算子注册关键配置项如下OpAICoreConfig aicoreConfig; aicoreConfig.DynamicCompileStaticFlag(true) // 动态编译静态化 .DynamicFormatFlag(false) // 不支持动态格式 .DynamicRankSupportFlag(true) // 支持动态 rank .DynamicShapeSupportFlag(true) // 支持动态 shape .NeedCheckSupportFlag(false) .PrecisionReduceFlag(true) .ExtendCfgInfo(opFile.value, is_nan_apt); // 指定 kernel 文件 this-AICore().AddConfig(ascend950, aicoreConfig); this-AICore().AddConfig(ascend350, aicoreConfig);其中ExtendCfgInfo(opFile.value, is_nan_apt)将算子的 kernel 实现指向 is_nan_apt.cppDynamicShapeSupportFlag(true)表明算子支持动态 shape这也是 is_nan_binary.json 中 shape 字段使用-2动态 shape 标记的原因——三份 binary 配置分别对应bfloat16、float16、float32三种输入类型输出均为bool、格式均为ND。形状与数据类型推导is_nan_infershape.cppInferShape4IsNan直接将输入形状拷贝给输出*out_shape *in_shape保证逐元素一一对应。is_nan_graph_infer.cppInferDataType4SingleOutBool把输出数据类型固定为DT_BOOL。Tiling 与 Kernel 实现IsNan 的 tiling 逻辑位于 is_nan_tiling_arch35.cpp整体流程为读取平台信息GetCoreNumAiv()、GetCoreMemSize(UB)校验核数与 UB 内存有效CalcInputDtype()/CalcOutputDtype()/CheckShape()完成类型与形状校验按输入类型选择 tiling keyFP16 →101UL、BF16 →102UL、FP32 →103UL调用elewiseBaseTiling.DoTilingIsNanOp::IsNanDAGT::OpDag()生成基础切分baseTilingSetTilingData()写入 workspace为 0即不需要额外 workspace并设置SetBlockDim。Kernel 端 is_nan_apt.cpp 声明为KERNEL_TASK_TYPE_DEFAULT(KERNEL_TYPE_AIV_ONLY)即仅在 AIVAI Vector核上执行运行时通过TILING_KEY_IS(101UL/102UL/103UL)将不同输入类型分发到对应的ElementwiseSch0UL, IsNanOp::IsNanDAGhalf/bfloat16_t/float::OpDag复用通用的 elementwise 调度框架atvoss/elewise/elewise_sch.h。真正的计算 DAG 定义在 is_nan_dag.h 中其核心思路是把 判断 NaN 拆解为比较 选择两步// 输入拷贝 using OpCopyIn BindVec::CopyInU, Placeholder::In0U; // 比较x ! xCMP_MODE 2NaN 自比较为真 using CompareMask BindVec::Compareuint8_t, U, CMP_MODE, OpCopyIn, OpCopyIn; // 选择为真时输出 1为假时输出 0 using SelectRes BindVec::Selectuint8_t, uint8_t, SELECT_MODE, CompareMask, DataZero, ConstOne; // 输出拷贝 using OpCopyOut BindVec::CopyOutuint8_t, Placeholder::Out0uint8_t, SelectRes;CompareMask对同一个输入执行两次拷贝后做CMP_MODE2不等于比较得到掩码——只有 NaN 元素x ! x为真SelectRes根据掩码在常量1与0之间选择产出true/false掩码MemOptCfgMemLevel::LEVEL_2将中间数据优化到 L2 级内存ElemsOpCopyOut声明 DAG 的输出节点最终组成DAGSchOutputs, void, MemCfg交由调度器执行。测试与验证仓库为 IsNan 提供了三层测试验证单测UTtest_is_nan_infershape.cpp验证 infershape 阶段输出形状与输入一致test_is_nan_tiling_arch35.cpp验证 arch35 平台的 tiling 逻辑tiling key、blockDim、workspace 等。系统测试STttk_kernel_is_nan_st.csv 定义了在 arch35 上执行的 kernel 级 ST 用例矩阵。Golden 数据golden.py 提供参考实现用于生成与 NPU 输出对拍的期望结果。开发者在修改或移植该算子后可按 scripts/build_ut.sh 与 cmake/ut.cmake 描述的 UT 框架运行上述单测并用 ST 用例回归验证 950/350 平台行为。小结IsNan 是 ops-math 中一个结构清晰、可直接作为 elementwise 算子范式的样例功能语义单一x ! x即 NaN输入输出形状一致、类型固定FP16/BF16/FP32 → BOOL通过 op_def 注册、infershape 推导、arch35 tiling 切分与 AIV 核上「比较 选择」DAG 完成计算并配有完整的 UT/ST/golden 验证链路。对于需要在 NPU 上进行 NaN 检测或数值健康性检查如梯度、loss 监控的场景可以直接在支持矩阵内的设备上按本文介绍的方式构图调用。赞分享算子库人工智能CANN【免费下载链接】ops-math本项目是CANN提供的数学类基础计算算子库实现网络在NPU上加速计算。项目地址https://gitcode.com/cann/ops-math点击查看免费下载相关推荐CANN ops-math 算子详解Expint 指数积分算子原理、实现与图模式调用实践CANN ops math 算子详解Expint 指数积分算子原理、实现与图模式调用实践 导读 Expint 是 CANN ops math 数学算子库中用于算子库人工智能CANNCANN ops-math AxpyV2 算子全面解析功能、参数、源码实现与图模式调用实战CANN ops math AxpyV2 算子全面解析功能、参数、源码实现与图模式调用实战 AxpyV2 是 CANN ops math 算子库中实现标量乘算子库人工智能CANNCANN ops-math ClipByValue 算子深度解析功能、参数、GE IR 图模式调用与源码实现CANN ops math ClipByValue 算子深度解析功能、参数、GE IR 图模式调用与源码实现 ClipByValue裁剪取值是 CANN算子库人工智能CANN创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

python-mini-projects 实战:用 os 标准库在多个文件中递归搜索字符串(String_search_from_multiple_files 源码解析)

python-mini-projects 实战:用 os 标准库在多个文件中递归搜索字符串(String_search_from_multiple_files 源码解析)

python-mini-projects 实战:用 os 标准库在多个文件中递归搜索字符串(String_search_from_multiple_files 源码解析) 【免费下载链接】python-mini-projects A collection of simple python mini projects to enhance your python skills 项…

2026/9/20 23:50:56 阅读更多 →
Java开发WMS仓储管理系统:PDA与Web双端架构及二次开发实践

Java开发WMS仓储管理系统:PDA与Web双端架构及二次开发实践

简介:这是一套基于Java开发的物流仓储管理系统完整源码,同时提供Web管理后台与Android PDA端,适合第三方物流、自营仓储企业及希望学习企业级Java架构的开发者。系统采用SpringMVC、Hibernate、Minidao、EasyUI、JQuery、Redis、ZTree等主流技…

2026/9/20 23:50:56 阅读更多 →
从零搭建BrewUI:前后端分离的智能酿造管理平台实战

从零搭建BrewUI:前后端分离的智能酿造管理平台实战

1. 项目背景:为什么需要BrewUI我最初接触到BrewUI,是在帮朋友搭一套家庭智能酿造系统的时候。他在家里做精酿啤酒已经有两年多,配方、温控、发酵记录全散落在不同的App和Excel表格里,每次酿酒都要手动翻记录。当时市面上不是没有酿造管理软件…

2026/9/20 23:50:56 阅读更多 →

最新新闻

ISO 11452-7直接射频功率注入:汽车电子EMC测试原理与实战指南

ISO 11452-7直接射频功率注入:汽车电子EMC测试原理与实战指南

简介:面向汽车电子电磁兼容设计与验证工程师,国际标准ISO 11452-7-2003第二版完整PDF是开展车载电子部件窄带辐射抗扰度测试的权威依据。该标准系统规定了直接射频功率注入法的测试原理、适用频率范围与功率水平设定、专用测试线缆要求,以及信…

2026/9/21 0:29:17 阅读更多 →
Claude Code 换供应商时 Base URL 不串:CC Switch 接 TaoToken

Claude Code 换供应商时 Base URL 不串:CC Switch 接 TaoToken

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

2026/9/21 0:29:17 阅读更多 →
OpenClaw 的 Lossless-claw 总结员不走官方通道,改走 TaoToken 行不行?

OpenClaw 的 Lossless-claw 总结员不走官方通道,改走 TaoToken 行不行?

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

2026/9/21 0:29:17 阅读更多 →
Atlas 300V 24G部署YOLO全攻略:从环境搭建到性能优化

Atlas 300V 24G部署YOLO全攻略:从环境搭建到性能优化

1. Atlas 300V 24G到底是什么:先把这个热词掰开揉碎最近看到"atlas部署yolo"和"atlas 300v 24g是运算加速卡吗"这两个搜索词一起冒出来,我基本能猜到问的人是什么状态:手头有或者准备买一张Atlas 300V 24G,想…

2026/9/21 0:29:17 阅读更多 →
TaoToken + Cline 遇 401?这样核对该模型 ID

TaoToken + Cline 遇 401?这样核对该模型 ID

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

2026/9/21 0:29:16 阅读更多 →
react-admin `<CheckboxGroupInput>` 组件完全指南:多选输入的配置、源码与实战

react-admin `<CheckboxGroupInput>` 组件完全指南:多选输入的配置、源码与实战

react-admin <CheckboxGroupInput> 组件完全指南&#xff1a;多选输入的配置、源码与实战 【免费下载链接】react-admin A frontend Framework for single-page applications on top of REST/GraphQL APIs, using TypeScript, React and Material Design 项目地址: htt…

2026/9/21 0:28:16 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析&#xff1a;从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南&#xff1a;src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin &#x1f680;ViteVue3Gin拥有AI辅助的基础开发平台&#xff0c;企业级业务AI开发解决方案&#xff0c;内置mcp辅助服务&#xff0c;内置skills管理&#xff0c;…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址&#xff1a; https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件&#xff08;Full-featured Plugin&#xff09;是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事&#xff1a;用Flutter给OpenHarmony做一款游戏集合类的App&#xff0c;说白了就是把若干小游戏塞进一个壳里&#xff0c;用统一入口分发。这个方向本身不算新鲜&#xff0c;真正让我花了不少心思的&#xff0c;是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档&#xff0c;最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事&#xff1a;今天在表后面多加了两个空白行&#xff0c;明天给客户交稿前发现整个章节的编号全部错位&#xff0c;光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年&#xff0c;说实话&#xff0c;第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年&#xff0c;流量惨淡、功能臃肿、代码自己都懒得看第二遍之后&#xff0c;我才慢慢琢磨明白一个道理&#xff1a;第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/19 23:35:34 阅读更多 →