资讯动态

CANN PyPTO 数据类型映射权威指南:DT_* 枚举、C++ 类型与 pto-isa 架构对照全解析

发布时间:2026/9/20 9:44:52 来源:尧图企业网站定制
人工智能编译器模型编译高性能计算深度学习CANN【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址https://gitcode.com/cann/pypto点击查看免费下载PyPTOParallel Tensor/Tile Operation 编程范式中数据类型dtype贯穿 Python 前端、C tile_fwk 中间层与 pto-isa 设备端三层体系每一层都使用不同的命名与表示方式。本文以仓库内.agents/skills/pypto-operation-extend-dtype/references/dtype-mapping.md的映射表为唯一事实来源系统梳理DT_*枚举与 C 类型、用户常用名、JSON 配置字符串、cann_type 数值之间的完整对应关系并结合源码讲解按 NPU 架构查询 opcode 支持 dtype 的机制以及如何通过 pto-isa 的static_assert模式判断某 dtype 是否具备底层实现。读完本文你将掌握在 PyPTO 中扩展算子 dtype 支持时所需的所有查表与校验技能。一、DT_* 枚举与 C 类型映射总表PyPTO 数据类型的唯一事实来源是 framework/include/tilefwk/data_type.h 中的DATA_TYPE_ALL宏第 3358 行。该宏通过DTYPE_DESC(name, byte, bit, is_float, type, cann_type)展开为DataType枚举项同时驱动BytesOf、BitsOf、IsFloat、IsInteger、DataType2String、DataType2CCEStr、DataType2CannType等一组内联工具函数。宏的每一列含义如下字段含义典型用途name枚举名DT_*全局统一的数据类型标识byte单个元素字节数BytesOf()、DataSizeOf()计算bit单个元素位数BitsOf()、数据搬运对齐is_float是否为浮点类型IsFloat()分类type对应 C 类型名DataType2CCEStr()生成 CCE 代码cann_typeCANN 运行时数据类型编号DataType2CannType()对接底层1.1 完整映射表DT_* 枚举C 类型pto-isa static_assert 类型名字节数是否浮点cann_typeDT_INT4int4-1否29DT_INT8int8_tint8_t1否2DT_INT16int16_tint16_t2否6DT_INT32int32_tint32_t4否3DT_INT64int64_tint64_t8否9DT_FP8float8_t-1是28DT_FP16halfhalf2是1DT_FP32floatfloat4是0DT_BF16bfloat16_tbfloat16_t2是27DT_HF4hfloat4-1是28DT_HF8hifloat8_t-1是34DT_UINT8uint8_tuint8_t1否4DT_UINT16uint16_tuint16_t2否7DT_UINT32uint32_tuint32_t4否8DT_UINT64uint64_tuint64_t8否10DT_BOOLbool-1否12DT_DOUBLEdouble-8是11DT_FP8E4M3float8_e4m3_t-1是36DT_FP8E5M2float8_e5m2_t-1是35DT_FP8E8M0float8_e8m0_t-1是37阅读提示ptoo-isa 一列中的-表示该 dtype 在对应架构的static_assert列表中通常不直接以该 C 类型出现如int4、hfloat4属于打包/低精度类型在 ISA 层以其他方式处理。cann_type列的数值与 CANN 底层aclDataType对应其中DT_FP8与DT_HF4均编码为 28注意区分。1.2 宏定义中的补充类型DATA_TYPE_ALL还包含四个 FP4 相关类型上表之外的扩展项在 framework/include/tilefwk/data_type.h 中定义/* cann中没有E2M1X2l类型使用E2M1的cann_type:40 */ DTYPE_DESC(DT_FP4_E2M1X2, 1, 8, true, float4_e2m1x2_t, 40) DTYPE_DESC(DT_FP4_E1M2X2, 1, 8, true, float4_e1m2x2_t, 41) DTYPE_DESC(DT_FP4_E2M1, 1, 4, true, float4_e2m1x2_t, 40) DTYPE_DESC(DT_FP4_E1M2, 1, 4, true, float4_e1m2x2_t, 41)注意DT_FP4_E2M1与DT_FP4_E2M1X2都对应float4_e2m1x2_t且 cann_type 都为 40——FP4 这类打包类型在 CANN 侧没有独立编号只能复用对应的 X2 打包类型编号且DT_FP4_E1M2/DT_FP4_E1M2X2同理41。1.3 从宏自动生成的工具函数同一头文件中由DATA_TYPE_ALL宏展开的核心查询函数DataType2String(t, brief)返回DT_INT32brieftrue时跳过DT_前缀返回INT32实现为ret 0x3。DataType2CCEStr(t)返回 C 类型名字符串如int32_t用于 CCE 代码生成。BytesOf/BitsOf/DataSizeOf(numel, t)字节/位数查询DataSizeOf要求总位数按字节对齐。IsFloat/IsInteger浮点与整型分类IsInteger额外把DT_BOOL归入整型。DataType2CannType(t)返回 CANN 侧编号。二、用户常用名到 DT_* 的映射Python 测试与配置场景中用户通常使用小写名称如int64、uint64、fp32而非DT_*前缀枚举因此需要一层用户名 → DT_* → C 类型的归一化映射。2.1 用户常用名映射表用户常用名DT_* 枚举C 类型int4DT_INT4int4int8DT_INT8int8_tint16DT_INT16int16_tint32DT_INT32int32_tint64DT_INT64int64_tuint8DT_UINT8uint8_tuint16DT_UINT16uint16_tuint32DT_UINT32uint32_tuint64DT_UINT64uint64_tfp8DT_FP8float8_tfp16DT_FP16halffp32DT_FP32floatbf16DT_BF16bfloat16_tboolDT_BOOLbooldoubleDT_DOUBLEdoublefp8e4m3DT_FP8E4M3float8_e4m3_tfp8e5m2DT_FP8E5M2float8_e5m2_tfp8e8m0DT_FP8E8M0float8_e8m0_thf4DT_HF4hfloat4hf8DT_HF8hifloat8_t2.2 测试侧的归一化实现ST 测试工具链中的get_dtype_by_name(name, is_torch, check)函数framework/tests/cmake/scripts/helper/test_case_tools.py以小写名 → [numpy 类型, torch 类型]字典实现归一化str_to_dtype { int8: [np.int8, torch.int8], int16: [np.int16, torch.int16], int32: [np.int32, torch.int32], int64: [np.int64, torch.int64], fp16: [np.float16, torch.float16], fp32: [np.float32, torch.float32], uint8: [np.uint8, torch.uint8], bool: [np.bool_, torch.bool], bf16: [None, torch.bfloat16], fp8e4m3: [np.uint8, fp8_e4m3_torch], fp8e5m2: [np.uint8, fp8_e5m2_torch], fp8e8m0: [np.uint8, fp8_e8m0_torch], hf8: [np.uint8, torch.uint8], ... } return str_to_dtype.get(name, [np.float32, torch.float32])[is_torch]要点默认值兜底为float32bf16无 numpy 原生类型返回None需借助 torch。FP8/FP4/HF8 等低精度类型在 numpy/torch 侧以np.uint8或条件性 torch dtype 承载golden 侧再按语义解释。is_torchTrue时返回 torch 侧类型用于构造与比对 torch 张量。三、按架构查询 opcode 支持的 dtypeJSON 配置机制PyPTO 中某个 opcode 在当前 NPU 架构下支持哪些输入 dtype不再硬编码在 operation 的.cpp源码里而是集中定义在 JSON 配置文件中由ConfigManager在运行时按NPUArch加载查询。3.1 四个架构的 JSON 文件a2a3_supported_op_dtypes.json — A2/A3云侧 Atlas A2/A3 系列a5_supported_op_dtypes.json — A5Ascend 950PR/950DTkirin9030_supported_op_dtypes.json — kirin9030Lite 端侧kirinx90_supported_op_dtypes.json — kirinX90Lite 端侧3.2 JSON 结构{ npu_arch: 2201, ops: { ADD: { input_dtypes: [int16, int32, fp16, float32, bf16] }, ADDS: { input_dtypes: [int16, int32, fp16, float32, bf16] } } }npu_archNPUArch枚举的整数值见下文对照表。opsopcode 字符串 →input_dtypes数组。opcode 字符串是OpcodeManager注册的 strOpcode::OP_ADD→ADD标量版Opcode::OP_ADDS→ADDSMaximum→MAXIMUM等。dtype 字符串使用STR_DATA_TYPE_MAPframework/include/tilefwk/data_type.h中的小写友好名。3.3 读取函数与查询路径C 层读取函数位于 framework/src/interface/configs/config_manager.h 与 framework/src/interface/configs/config_manager.cppconst std::unordered_setDataType ConfigManager::Instance().GetOpSupportedInputDtypes(const Opcode opcode);其实现要点通过std::call_once(platformSupportedOpDtypesLoaded_, ...)保证整个进程只加载一次所有架构 JSONLoadPlatformSupportedOpDtypes并打印加载摘要DumpPlatformSupportedOpDtypes以Platform::Instance().GetSoc().GetNPUArch()作为当前架构键查表只读取input_dtypes类别返回该 opcode 在当前架构下的 dtype 集合未配置时返回kEmptyDtypes空集上游 dtype 检查会报错Data type DT_xxx is not in supported types。3.4 JSON dtype 字符串映射STR_DATA_TYPE_MAPDT_* 枚举JSON 字符串DT_* 枚举JSON 字符串DT_INT4int4DT_UINT8uint8DT_INT8int8DT_UINT16uint16DT_INT16int16DT_UINT32uint32DT_INT32int32DT_UINT64uint64DT_INT64int64DT_BOOLboolDT_FP8fp8DT_DOUBLEdoubleDT_FP16fp16DT_FP8E4M3fp8e4m3DT_FP32float32注意不是 fp32DT_FP8E5M2fp8e5m2DT_BF16bf16DT_FP8E8M0fp8e8m0DT_HF4hf4DT_FP4_E2M1fp4_e2m1DT_HF8hf8DT_FP4_E1M2fp4_e1m2⚠️ 易错点DT_FP32 在 JSON 中的键是float32fp32不在STR_DATA_TYPE_MAP中该映射表还额外收录了int→DT_INT32、float→DT_FP32、float16→DT_FP16、bfloat16→DT_BF16、float8→DT_FP8以及fp4_e2m1x2/fp4_e1m2x2等别名。因此向 JSON 的input_dtypes中添加新 dtype 时必须使用本表左侧的字符串否则字符串解析不到枚举值配置会静默失效。3.5 NPUArch 枚举与 JSON 文件对照NPUArch定义于 framework/include/tilefwk/platform.henum class NPUArch { DAV_1001 1001, DAV_2201 2201, DAV_3510 3510, DAV_3003 3003, DAV_3113 3113, DAV_UNKNOWN };JSON 文件npu_archNPUArch架构a2a3_supported_op_dtypes.json2201DAV_2201A2/A3云侧 Atlas A2/A3 系列a5_supported_op_dtypes.json3510DAV_3510A5Ascend 950PR/950DTkirin9030_supported_op_dtypes.json3113DAV_3113kirin9030Lite 端侧kirinx90_supported_op_dtypes.json3003DAV_3003kirinX90Lite 端侧历史上 A2/A3 同时映射DAV_1001与DAV_2201当前仓库中的 JSON 以单一npu_arch2201DAV_2201代表 A2/A3 平台。若运行环境上报的GetNPUArch()返回DAV_UNKNOWN查表会直接落到空集分支。四、pto-isa 侧的类型检查与架构目录dtype 支持的最终裁决权在设备端 pto-isa。它按架构组织头文件并通过static_assert在编译期校验每个操作支持的类型集合。4.1 pto-isa 架构目录include/pto/npu/a2a3/— A2/A3 平台的 NPU ISA 实现include/pto/npu/a5/— A5 平台的 NPU ISA 实现include/pto/npu/a6/— A6 平台的 NPU ISA 实现include/pto/npu/kirin9030/— kirin9030 平台include/pto/npu/kirinX90/— kirinX90 平台include/pto/cpu/— CPU 模拟实现用于仿真和测试4.2 static_assert 类型检查模式pto-isa 在每个操作的Check函数中使用static_assert列出支持的类型。例如 TAddA5 平台a5/TAdd.hpp 中的 TAddCheck 对应 pto-isaa5目录的 TAdd.hppstatic_assert( std::is_same_vT, int64_t || std::is_same_vT, uint64_t || std::is_same_vT, int32_t || std::is_same_vT, uint32_t || std::is_same_vT, float || std::is_same_vT, int16_t || std::is_same_vT, uint16_t || std::is_same_vT, half || std::is_same_vT, bfloat16_t || std::is_same_vT, uint8_t || std::is_same_vT, int8_t, Fix: TADD has invalid data type.);A2/A3 平台a2a3/TAdd.hpp 中的 TAddCheck 对应 pto-isaa2a3目录的 TAdd.hpp——注意不支持 int64/uint64static_assert( std::is_sameT, int32_t::value || std::is_sameT, int::value || std::is_sameT, int16_t::value || std::is_sameT, half::value || std::is_sameT, float16_t::value || std::is_sameT, float::value || std::is_sameT, float32_t::value, Fix: TADD has invalid data type.);判断某个 dtype 是否被 pto-isa 支持的通用方法在对应架构的T{Op}.hpp文件中搜索static_assert和std::is_same行确认目标 C 类型如bfloat16_t、int64_t是否出现在支持列表中。4.3 特殊实现模式if constexpr某些 dtype 在 pto-isa 中有专门的实现路径通过if constexpr分支选择。例如 A5 的 TAdd// a5/TAdd.hpp 中的 TAdd 实现 if constexpr (std::is_same_vT, int64_t || std::is_same_vT, uint64_t) { Int64BinaryInt64Op::Add, T, ...(dstPtr, src0Ptr, src1Ptr, validRows, validCols); } else { BinaryInstrAddOpT, ...(dstPtr, src0Ptr, src1Ptr, validRows, validCols, version); }实践准则如果 pto-isa 中已有if constexpr分支处理目标 dtype或static_assert列表已包含目标类型说明底层实现已就绪pypto 层可以安全地把该 dtype 加入supportedTypes集合与 JSON 的input_dtypes反之若 pto-isa 侧没有对应分支仅修改 pypto 层配置会导致设备端编译失败static_assert 触发 Fix: ... has invalid data type.。五、实际使用扩展一个 dtype 的完整查表路径综合上述三层映射在 PyPTO 中为一个算子扩展新 dtype 支持时的完整决策链如下确认枚举与 C 类型在 framework/include/tilefwk/data_type.h 的DATA_TYPE_ALL中确认目标DT_*枚举及其 C 类型如DT_BF16→bfloat16_t。确认用户名/JSON 字符串确认STR_DATA_TYPE_MAP中存在对应小写名如bf16注意 FP32 必须写float32而非fp32。确认 pto-isa 底层就绪到目标架构目录a2a3/a5/a6/kirin9030/kirinX90对应T{Op}.hpp中检查static_assert列表或if constexpr分支是否已支持该 C 类型。更新架构 JSON在 platform_op_supported_dtypes 下目标架构的 JSON 中为该 opcode 的input_dtypes添加字符串保持STR_DATA_TYPE_MAP键拼写。测试侧归一化如 golden 测试需要在 test_case_tools.py 的get_dtype_by_name字典中补充 numpy/torch 承载类型。排查提示若运行时报Data type DT_xxx is not in supported types优先检查步骤 4 是否配置了当前NPUArch对应的 JSON 文件参见 framework/src/interface/configs/config_manager.cpp 的查表逻辑任一环节缺失都会返回空集以及 JSON 字符串拼写是否严格遵循STR_DATA_TYPE_MAP。六、结语DT_*枚举是 PyPTO 三层 dtype 体系的中枢向上承接 Python 侧的用户常用名向下输出 C 类型与 cann_type 编号横向又通过架构 JSON 与 pto-isa 的编译期检查形成闭环。本文给出的三张映射表宏定义表、用户名表、JSON 字符串表与查表函数源码构成了在 PyPTO 中定位 dtype 问题、扩展 dtype 支持的完整速查手册。实际开发中务必以 framework/include/tilefwk/data_type.h 中的DATA_TYPE_ALL宏为最终事实来源以目标架构的 JSON 与 pto-isastatic_assert为双重校验闸门避免上层配置已加、底层实现未就绪或字符串拼写错误导致配置静默失效两类常见坑。赞分享人工智能编译器模型编译高性能计算深度学习CANN【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址https://gitcode.com/cann/pypto点击查看免费下载相关推荐Synology硬盘兼容性突破5步解锁第三方硬盘的完全指南Synology硬盘兼容性突破5步解锁第三方硬盘的完全指南 Synology_HDD_db是一个专门为群晖NAS设计的硬盘兼容性数据库修改工具能够让你在群晖运维存储CLICANN PyPTO 数据类型体系详解DataType 与 DT_* 常量完全指南CANN PyPTO 数据类型体系详解DataType 与 DT_ 常量完全指南 本篇技术指南以 CANN / PyPTO 开源仓库中 DataType.md人工智能编译器模型编译高性能计算深度学习CANNCANN PyPTO 数据类型体系完全指南DataType 枚举、转换模式与工具函数详解CANN PyPTO 数据类型体系完全指南DataType 枚举、转换模式与工具函数详解 导读 本文基于 CANN PyPTO 仓库 docs/zh/api/人工智能编译器模型编译高性能计算深度学习CANN上一篇QuickCut安全使用终极指南如何避免恶意软件并验证官方版本下一篇从0到1掌握ElastAlert规则开发实战指南与高级技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价