ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CANN opbase 数据类型工具详解:IsIntegralType(含bool)判断整数类型的实现与实战

CANN opbase 数据类型工具详解:IsIntegralType(含bool)判断整数类型的实现与实战 CANN opbase 数据类型工具详解IsIntegralType含bool判断整数类型的实现与实战【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase本篇技术指南以 CANN opbase 算子库中 IsIntegralType含bool 接口为核心讲解如何利用该接口在算子开发中准确判断一个ge::DataType是否为整数类型以及include_bool参数对 bool 类型的处理语义。读完本文你将掌握该接口的函数原型、参数语义、源码级实现原理、与CanCast/IsFloatingType等姊妹接口的联动关系以及可直接复用的算子入参校验写法。功能说明IsIntegralType用于判断输入的数据类型是否为整数类型。在 CANN 的ge::DataType枚举体系下被该接口认定为“整数类型”的共有 8 种分别是有符号整数无符号整数Int8DT_INT8Uint8DT_UINT8Int16DT_INT16Uint16DT_UINT16Int32DT_INT32Uint32DT_UINT32Int64DT_INT64Uint64DT_UINT64与 IsIntegralType单参数版本相比本文介绍的含 bool 版本增加了一个include_bool参数若将其置为true则bool即ge::DataType::DT_BOOL也被视为整数类型若置为false则行为与单参数版本完全一致。这一设计在算子开发中非常实用许多算子的通用校验逻辑既要兼容布尔张量如逻辑类、比较类算子又要保证类型检查的显式可控include_bool恰好提供了这种“是否把 bool 纳入整数范畴”的开关。函数原型与参数说明接口声明位于算子开发公共头文件中函数原型如下bool IsIntegralType(const ge::DataType type, const bool include_bool)参数说明参数输入/输出说明type输入输入的数据类型取值来自ge::DataType枚举例如ge::DataType::DT_INT32、ge::DataType::DT_FLOAT、ge::DataType::DT_BOOL等。include_bool输入是否将 bool 视为整数类型。为true时DT_BOOL也被判定为整数类型为false时DT_BOOL不参与整数判定。返回值说明若type为整数类型返回true否则返回false。具体判定规则可归纳为下表typeinclude_bool falseinclude_bool trueDT_INT8 / DT_INT16 / DT_INT32 / DT_INT64truetrueDT_UINT8 / DT_UINT16 / DT_UINT32 / DT_UINT64truetrueDT_BOOLfalsetrueDT_FLOAT / DT_FLOAT16 / DT_BF16 / DT_DOUBLE 等浮点类型falsefalseDT_COMPLEX32 / DT_COMPLEX64 / DT_COMPLEX128 等复数类型falsefalseDT_STRING / DT_RESOURCE 等其他类型falsefalse约束说明无。该接口为纯判定函数不涉及资源分配、状态修改或异常抛出任意ge::DataType取值均可安全传入。源码实现解析接口的 inline 实现位于 include/nnopbase/opdev/data_type_utils.h包含单参数与含 bool 两个重载版本核心代码L285-L296如下inline bool IsIntegralType(const ge::DataType type) { return (type ge::DataType::DT_INT8 || type ge::DataType::DT_INT16 || type ge::DataType::DT_INT32 || type ge::DataType::DT_INT64 || type ge::DataType::DT_UINT8 || type ge::DataType::DT_UINT16 || type ge::DataType::DT_UINT32 || type ge::DataType::DT_UINT64); } inline bool IsIntegralType(const ge::DataType type, const bool include_bool) { bool is_integral IsIntegralType(type); return include_bool ? (is_integral || (type ge::DataType::DT_BOOL)) : is_integral; }从源码结构可以看出两个值得注意的实现细节双层重载设计含 bool 版本内部直接复用单参数版本的计算结果is_integral再按include_bool决定是否并入DT_BOOL判定。两个重载共享同一份“8 种整数类型”的判定逻辑避免了规则漂移。短路求值include_bool ? (is_integral || (type ge::DataType::DT_BOOL)) : is_integral中当include_bool为false时直接返回整数判定结果为true时才额外比较DT_BOOL逻辑开销极小。由于该实现为inline且仅包含枚举比较运算不产生函数调用开销可放心在算子热路径如InferShape、Tiling、逐元素 Kernel 的参数校验中高频使用。头文件与命名空间说明本文所讲接口位于op命名空间需包含头文件 include/nnopbase/opdev/data_type_utils.h。仓库中还保留了旧版头文件 include/nnopbase/opdev/op_common/data_type_utils.h其中同名接口位于opcommon命名空间实现见其 L126-L137。该旧版头文件带有编译告警提示接口计划于 2027 年 6 月废弃并建议迁移到include/aclnn/opdev下的同名新头文件。新算子请优先使用op命名空间的IsIntegralType。对应旧接口的文档为 op_common_related_interface/IsIntegralType含bool其中同样标注了“后续版本会废弃请使用最新接口”的须知。在数据类型工具族中的位置IsIntegralType是 data_type_utils 工具集 的一员与它协同工作的判定类接口包括接口判定范畴IsBasicType是否为基础类型含量化类型、BF16 等共 19 种IsNumberType是否为数值类型在整数、浮点基础上再纳入各类新浮点格式IsRealNumberType是否为实数类型排除复数IsFloatingType是否为浮点类型含 FP16/BF16 及 Float8/Float6/Float4 等新格式IsComplexType是否为复数类型DT_COMPLEX32/64/128CheckType判断数据类型是否在给定的合法类型集合内值得注意的是IsIntegralType的判定集合刻意排除了DT_INT4、DT_UINT1、DT_INT2、DT_UINT2等位宽小于 8 bit 的类型这些类型在TypeSize中被编码为kDataTypeSizeBitOffset N的形式见 include/nnopbase/opdev/data_type_utils.h L123-L126也不包含量化类型DT_QINT8/QINT16/QINT32/QUINT8/QUINT16。若算子需要校验这类更宽泛的类型应改用IsBasicType或CheckType。与 CanCast 的联动IsIntegralType不仅供算子直接调用还被同头文件中的类型转换判定接口 CanCast 内部复用。CanCast的核心逻辑include/nnopbase/opdev/data_type_utils.h L298-L313如下inline bool CanCast(const ge::DataType from, const ge::DataType to) { if (IsComplexType(from) !IsComplexType(to)) { return false; } if (IsFloatingType(from) IsIntegralType(to, false)) { return false; } if (from ! ge::DataType::DT_BOOL to ge::DataType::DT_BOOL) { return false; } return true; }这里第二个条件刻意使用IsIntegralType(to, false)即不把 bool 当作整数意味着“浮点转整数”被禁止但“浮点转 bool”不受此条限制第三个条件再单独约束“只有 bool 才能转 bool”。从这一组合可以看出include_bool的语义选择会直接影响上层类型转换规则的推导理解它的取值含义是读懂整个工具族行为的关键。调用示例以下是文档提供的标准用法——在算子实现入口校验 dtype 是否为整数类型含 bool不是则提前返回// 校验dtype是否为整数类型含bool不是则提前返回 void Func(const ge::DataType type) { if (!IsIntegralType(type, true)) { return; } // 后续执行算子计算逻辑 }更贴近实战的写法结合算子开发中常见的“校验不通过需上报错误”模式可将上述逻辑扩展为带错误码的完整形态#include nnopbase/opdev/data_type_utils.h // 以整数含bool类型约束算子输入 Status CheckInputIntegral(const ge::DataType type) { // include_bool 置 truebool 张量也被接受 if (!op::IsIntegralType(type, true)) { // 此处可替换为算子库统一的错误上报接口 return PARAM_INVALID; } return SUCCESS; }需要区分场景选取参数取值若算子逻辑本身支持 bool 输入如逻辑运算、比较运算、部分索引类算子建议include_bool置true若算子仅接受真正的整数张量、bool 应被拒绝如需要做算术移位、位宽推导的场景则置false或直接使用单参数版本 IsIntegralType。测试验证仓库在 tests/nnopbase/ut/composite_op/test_data_type_utils.cpp 与 tests/nnopbase/st/composite_op/test_data_type_utils.cpp 中提供了TestCanCast、TestPromoteType等测试用例通过EXPECT_TRUE/EXPECT_FALSE断言验证了类型判定的正确性。例如TestCanCast断言了以下事实op::CanCast(DT_INT32, DT_FLOAT)为true整数可转浮点op::CanCast(DT_FLOAT, DT_INT32)为false浮点不可转整数与IsIntegralType(to, false)的判定直接相关op::CanCast(DT_BOOL, DT_BOOL)为true、op::CanCast(DT_FLOAT, DT_BOOL)为false。这些用例从侧面印证了IsIntegralType在类型系统规则中的基础地位——整数的界定正确与否会直接传导到类型转换与类型提升PromoteType等更上层语义。使用建议与注意事项头文件包含请通过#include nnopbase/opdev/data_type_utils.h使用op::IsIntegralType旧头文件 include/nnopbase/opdev/op_common/data_type_utils.h 虽仍可用但存在废弃计划不建议新代码继续依赖。命名空间区分新旧两套头文件分别使用op与opcommon命名空间混用时注意命名冲突与using声明范围。判定边界该接口只接受ge::DataType枚举值不负责校验枚举合法性如DT_UNDEFINED会正常返回false若需同时校验类型与形状、格式可配合 CheckType 与算子库的 shape/format 校验工具一并使用。性能特征接口为inline纯枚举比较无副作用可在校验、Tiling、InferShape 等任意阶段无成本地重复调用。延伸阅读data_type_utils 工具集总览IsIntegralType单参数版本IsFloatingType 与 IsComplexTypeCanCast 与 PromoteTypeTypeSize、ToOpDataType、ToAclDataType、ToString【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表