尧图精选

CANN pto-isa 之 Kirin9030 指令实现指南:头文件体系、核心指令原理与 ST 测试验证

🕒 发布时间:2026/9/19 12:10:59 📁 来源:尧图网络
CANN pto-isa 之 Kirin9030 指令实现指南头文件体系、核心指令原理与 ST 测试验证【免费下载链接】pto-isaParallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations across Ascend platforms.项目地址: https://gitcode.com/cann/pto-isa本文围绕 CANN pto-isa 仓库中include/pto/npu/kirin9030/指令实现头文件目录展开系统讲解 Kirin9030 平台在 PTOParallel Tile Operation虚拟指令集体系中的架构定位、目录组织方式、数据搬运/计算/同步类指令的源码级实现原理以及配套的 NPU ST 测试体系。读完本文你将掌握如何在 pto-isa 中按指令族定位 Kirin9030 实现、理解TLoad/TStore/TMov/TMatmul/TSync等核心指令的底层硬件映射与数据类型/布局约束并能借助tests/npu/kirin9030/src/st/下的测试用例验证指令行为。一、Kirin9030 在 PTO 指令集体系中的定位PTOParallel Tile Operation是 Ascend CANN 设计的一套面向 Tile 级操作的虚拟指令集架构本仓库为其参考实现。在 include/pto/common/arch_capability.hpp 中ChipArch枚举将当前支持的芯片平台统一编址enum class ChipArch : uint8_t { A2A3 0, A5 1, KIRIN9030 2, KIRINX90 3, A6 4, UNKNOWN 255, };Kirin9030 是其中独立的平台分支枚举值 2。平台的能力差异通过ArchTraitsChipArch::KIRIN9030特化集中描述见 arch_capability.hpptemplate struct ArchTraitsChipArch::KIRIN9030 : ArchTraitsBaseChipArch::KIRIN9030 { static constexpr bool AccSupportsHalf true; static constexpr bool AccSupportsInt32 true; }; using CurrArch ArchTraitsChipArch::KIRIN9030;对照ArchTraitsBase的默认值可以清晰看出 Kirin9030 的能力边界能力项Kirin9030 取值说明AccSupportsHalftrueAccumulatorL0C支持 half 累加AccSupportsInt32trueAccumulatorL0C支持 int32 累加AccSupportsFloatfalse不支持 float 累加SupportsBf16 / SupportsFp8 / SupportsFp4false不支持 BF16/FP8/FP4 计算路径SupportsCommfalse不支持通信类指令SupportsTQuant / SupportsTHistogramfalse不支持 TQuant/THistogram 指令族SupportsMxLayoutfalse不支持 MX 布局SupportsSyncAllfalse不支持 SYNCALL该特化通过宏PTO_NPU_ARCH_KIRIN9030启用例如common.hpp中的CheckTMovAccValid就包裹在#if defined(PTO_NPU_ARCH_KIRIN9030)内编译时由编译器根据目标平台注入。这些能力位不仅用于编译期能力查询caps::IsBF16、caps::IsFP4等也直接决定了 Kirin9030 指令实现中哪些类型组合合法、哪些会被static_assert拒绝。二、目录结构与文件组织按指令族划分 A5 复用Kirin9030 指令实现全部集中在 include/pto/npu/kirin9030/目录概览如下参见 README_zh.md按指令或指令族组织实现TAdd.hpp、TMatmul.hpp、TLoad.hpp、TStore.hpp等包含 Kirin9030 专用的算子模式与工具如适用。实际目录中 Kirin9030 平台的文件可分为三类1. 平台专属指令实现头文件13 个文件对应指令/功能TCvt.hpp类型转换 TCVTTExtract.hpp数据抽取 TEXTRACT含 Left/Right 矩阵搬运TGather.hpp聚集 TGATHERTInsert.hpp插入 TINSERTTLoad.hpp全局内存 → 片上加载 TLOADTMatmul.hpp矩阵乘 TMATMULTMov.hpp数据搬移 TMOVAcc/Mat/Vec 之间TQuant.hpp量化 TQUANTTRem.hpp/TRemS.hpp取余 TREM / 标量取余 TREMSTStore.hpp片上 → 全局内存存储 TSTORETSubS.hpp标量减 TSUBSTSync.hpp同步 TSYNC 与 Event2. 公共支撑头文件4 个header.hpp全平台聚合入口一次性包含所有 Kirin9030 专属指令头文件并大量复用 A5 平台的指令实现TAdd、TAnd、TOr、TXor、TShl、TShr、TPrelu、TCmp、TColSum、TColExpand、TConcat、TReshape、TRowReduce、TFillPad、TTrans、TLRelu、TSel、TSort32、TPartAdd、TPow、TDeQuant、TUnaryOp、TBinSOp、TScatter、TTri、TColReduceIdx、SetQuantScalar、SetQuantVector 等 70 余个指令族。这一设计说明同一套虚拟指令语义在不同物理平台间通过复用 特化组合实现Kirin9030 只需对硬件行为有差异的指令单独实现。common.hpp平台公共工具寄存器包装、谓词生成、量化模式选择、Padding 极值等。datatype.hppTypeGetT模板特化将 C 标量类型映射到向量寄存器类型。utils.hpp工具函数直接复用 include/pto/npu/a5/utils.hpp。3. 类型别名与编译期常量header.hpp开头还通过#define/#undef局部定义了bfloat16_t、float8_e4m3_t、float8_e5m2_t、hifloat8_t、float8_e8m0_t、float4_e2m1x2_t、float4_e1m2x2_t等别名#undef在头文件末尾清理避免污染用于兼容 CCE 内建类型随后引入 include/pto/common/constants.hpp 与 include/pto/common/utils.hpp。三、数据类型与通用基础设施3.1 TypeGet标量类型到向量寄存器类型的映射datatype.hpp 定义了TypeGetT模板及其特化将int8_t/uint8_t/int16_t/uint16_t/half/int32_t/uint32_t/float/int64_t/uint64_t分别映射到vector_s8/vector_u8/vector_s16/vector_u16/vector_f16/vector_s32/vector_u32/vector_f32/vector_s64/vector_u64template struct TypeGethalf { using T vector_f16; }; template struct TypeGetfloat { using T vector_f32; }; template struct TypeGetint32_t { using T vector_s32; };3.2 寄存器、谓词与字节对齐工具common.hpp 提供了指令实现共享的基础设施寄存器类型别名MaskReg vector_bool掩码寄存器、UnalignReg vector_align、AddrReg vector_address。RegTensorT包装TypeGetT::T类型的向量寄存器可隐式转换为底层寄存器引用供vlds/vsts/vsstb等向量指令使用。CreatePredicateT(uint32_t scalar)根据元素字节宽度生成尾部掩码——sizeof(T)1用plt_b82用plt_b164用plt_b32均以POST_UPDATE方式消费标量计数是处理有效列数不整除向量长度的核心手段。GetByteSizeT(value)sizeof(T) * value用于把元素个数换算成搬运指令所需的字节数。PaddingT为各类型提供填充极值常量GetPaddingMin/GetPaddingMax按类型给出位模式——float为0xff800000/0x7f800000±inf 位模式half为0xfc00/0x7c00int32_t为0x80000000/0x7fffffffint8_t为0x80/0x7f其余类型回退到0/~(Type)0。这些常量用于 tload/tstore 路径中的 pad 值设置。四、数据搬运指令TLOAD / TSTORE / TMOV数据搬运是 Tile 编程模型中最关键的环节。Kirin9030 的实现覆盖全局内存GM↔ 片上 BufferUB/CB/L1与片上 Buffer 之间的多条路径。4.1 TLOADGM → 片上加载include/pto/npu/kirin9030/TLoad.hpp 定义了平台加载算子Kirin9030LoadOp其核心指令封装为struct Kirin9030LoadOp : LoadOpBase { template Layout Layout Layout::ND, typename T PTO_INTERNAL static void TLoadCubeInstr( __cbuf__ T* dst, __gm__ T* src, uint64_t loop1SrcStride, uint16_t nValue, uint32_t dValue, uint64_t loop4SrcStride) { if constexpr (Layout Layout::ND) { pto_copy_gm_to_cbuf_multi_nd2nz(dst, src, 0 /*sid*/, loop1SrcStride, 0, nValue, dValue, loop4SrcStride); } else { static_assert(sizeof(T) 0, Fix: TLoad does not support DN2NZ.); } } };关键结论源码可验证CubeMat路径只支持 ND→NZ 布局转换DN→NZ 被static_assert明确禁止加载使用硬件 multi-nd 矩阵搬运指令pto_copy_gm_to_cbuf_multi_nd2nz一次调用即完成 GM ND 数据到 L1/CB NZ 分形格式的转换。在通用 Tile 路径TLOAD_TILE_IMPL中根据目标位置分派TileType::Vec走TLoad向量路径TileType::Mat走TLoadCubeCube 路径并显式声明static_assert(!IsScaleTileData, GlobalData(), Fix: TLOAD not supported Mx cube.)Kirin9030 不支持 MX cube 加载。实现细节值得注意ND→ND / DN→DN 支持五维 shape/stride 循环展开TLoadVecND2ND、TLoadCubeND2ND、TLoadVecDN2DN、TLoadCubeDN2DN均以gShape0/1/2三重循环组织搬运最后一维交给指令级nBurst/lenBurst/gmStride参数。FP4 特判当数据类型为 FP4caps::IsFP4时所有地址偏移dst/gm stride右移 1 位因为底层以 8bitb8为单位搬运地址需按半字折算。Pad 值支持当 Tile 的PadVal不是Null/Zero时调用pto_set_tload_pad_valTileType::Mat(GetPadValueTileData())设置填充值搬运完成后恢复为 0。卷积专用路径TLOAD_CONVTILE_IMPL支持 ConvTile——源布局为NC1HWC0时走TLoad5HD要求 src/dst 各维度 shape 一致以PTO_ASSERT校验源布局为FRACTAL_Z时按维度数分派到TLoadFractalZ[C1HW,N/16,16,C0]或TLoad5HD[C1,H,W,N,C0]目标位置必须是Mat且源/目标 dtype 大小必须一致。4.2 TSTORE片上 → GM 存储include/pto/npu/kirin9030/TStore.hpp 的入口TSTORE_IMPL按源 Tile 位置分三条路径Acc → GM源类型限定为int32_t或halfCheckStaticAcc目标布局仅支持NDNZ→ND 转换或NZNZ→NZ。维度约束Cols ∈ [1, 4095]ND 格式下Rows ∈ [1, 8192]NZ 格式下Rows ∈ [1, 65535]且Cols必须是 16 的整数倍。输出类型在非量化路径下限定为int32_t/float/half。该路径还支持ReluPreMode、STPhase以及两种量化形态见下文量化章节。Vec → GM走TStore通用路径支持 ND/DN 两种源布局TStoreVecND/TStoreVecDN同样处理 FP4 半字折算。Mat → GMCheckStaticMat要求布局严格一致仅支持 ND→ND 与 NZ→NZ且 dtype 大小一致。NZ→NZ 时目标GlobalTensor最后两维必须是静态 shape[16, 32/sizeof(DataType)]FRACTAL_NZ 分形约束搬运经pto_copy_cbuf_to_gm_align_v2对齐搬运指令完成。两条硬性限制static_assert在 Kirin9030 上必须遵守static_assert(atomicType AtomicType::AtomicNone, Fix: AtomicAdd is not supported on kirin9030.);即TSTORE 不支持 AtomicAddatomicType必须为AtomicNone。4.3 TMOV片上数据搬移include/pto/npu/kirin9030/TMov.hpp 是全目录中最复杂的文件之一按源位置 × 目标位置组合提供搬移能力。入口TMOV_IMPL的分派逻辑如下1Mat → 专用目标Bias/Scaling/Left/RightMat → BiasTMovToBt写入 Bias TableRows必须为 1Cols * sizeof(Dtype)必须 64 字节对齐且总占用不超过 1.0KB bias tablePTO_BIAS_SIZE_BYTES数据类型仅支持int32_t/half底层指令为copy_cbuf_to_bt。Mat → ScalingTMovToFb写入 FixPipe BufferRows必须为 1Cols * sizeof(Dtype)必须 128 字节对齐且总占用不超过 7.0KB fixpipe bufferPTO_FBUF_SIZE_BYTES底层指令为copy_cbuf_to_fbuf。Mat → Left / Mat → RightTMovToLeft/TMovToRight搬运到 Cube 的 A/B 侧矩阵。CommonCheck规定Left 目标类型仅支持int8_t/half分形格式必须为(BFractal: ColMajor, SFractal: RowMajor)且非 RowMajorRight 目标类型同样仅支持int8_t/half分形格式为(BFractal: RowMajor, SFractal: ColMajor)且为 RowMajor。实现复用TExtract家族的TExtractToAVector/TExtractToACompact/TExtractToATransCompact以及 B 侧对应版本根据源/目标分形是否一致、Compact 模式选择不同核函数。2Acc → Vec / Acc → Mat核心的 L0C 数据搬移这是矩阵乘后处理反量化、布局转换的关键路径由TMovCcToUbAcc→UB与TMovCcToCbAcc→CB实现。编译期检查CheckTMovAccValid见 common.hpp规定了严格约束源必须是TileType::Acc源分形格式必须是(BFractal: ColMajor, SFractal: RowMajor)源类型仅支持half或int32_t目标布局仅支持三种转换nz2nz / nz2nd / nz2dn即目标 RowMajorNoneBox、非 RowMajorNoneBox、非 RowMajorRowMajor不配置量化参数时源/目标类型必须一致且必须是half/int32_t。实现上有几个细节GetTmovAccDstStride按目标布局计算行步长其中对float且SFractalSize 512的情况启用channel splitC0_SIZE_BYTE变为 2 倍SFractalSize 1024时 c0Size 也翻倍nz2nz 路径中validCol按 c0SizeBLOCK_BYTE_SIZE/sizeof(dstType)即 32B 对齐向上取整float 走FRACTAL_NZ_ROW对齐nz2nd/nz2dn 路径会调用SetLoop3ParandNum1, stride0配置循环参数nz2dn 还额外set_channel_parabit481配置通道参数底层分别调用pto_copy_matrix_cc_to_cbuf/pto_copy_matrix_cc_to_ub携带QuantPre量化模式、reluMode、channelSplitEnable、enableNz2Nd/enableNz2Dn等控制位。3Vec → Vec / Vec → MatVec→Vec 普通路径TMovVecToVec以vlds/vsts逐行搬运行内按CCE_VL/sizeof(T)分片配合CreatePredicate尾部掩码Vec→Vec 且源为 ND、目标为 NZ 时走专用转置实现TMovToVecNd2Nz通过vlds加载行、vsstb按块写回repeatTimes按列循环并针对CompactMode::RowPlusOne优化虚拟行数 1规避 UB bank conflict1 字节类型hifloat8_t/int8_t/float8_e4m3_t等会先转uint8_t再搬运Vec→Mat 复用TExtractVecToMat。4量化搬移重载TMOV_IMPL还提供带preQuantScalar标量量化调用set_quant_pre和带FpTile向量量化经SetFPC调用set_fpc设置反量化张量地址目标必须为Scaling的重载配合AccToVecModeSingleModeVec0/Vec1DualMode 下禁止量化与STPhase使用。五、计算指令TMATMUL / TQUANT / 其余标量与向量指令5.1 TMATMUL矩阵乘include/pto/npu/kirin9030/TMatmul.hpp 是 Cube 计算的入口约束精炼constexpr const int MMAD_MAX_SUPPORT_LENGTH 4095;TMatmul与TMatmulBias均直接调用硬件mad指令AccL0C数据类型仅支持half与int32_t其他类型触发static_assert(sizeof(T) 0, TMATMUL: Invalid Acc DType.)三个矩阵维度参数m/k/nuint16_t的范围均为[1, 4095]CheckKirinMadExtent按 Axis 0/1/2 分别校验 aMatrixRow/aMatrixCol/bMatrixColTMatmulBias将 bias 地址与 L0C 地址拼合成 64 位xd传入mad支持AccPhase累加阶段控制与cmatrixSource/cmatrixInitValCMatrix 源/初值参数常量TF32_MODE_BIT 46、TF32_TRANS_MODE_BIT 47用于后续 TF32 模式控制位的组装从源码结构看为扩展 TF32 计算模式预留。5.2 量化体系标量量化与向量量化量化是 Accint32/half结果落盘前的常见后处理。Kirin9030 的common.hpp与TStore.hpp提供了完整的量化模式选择逻辑按量化参数形态分三类QuantMode_t枚举值取自公共定义参数形态TMov 侧选择函数TStore(GM) 侧选择函数典型模式无量化GetCastPreQuantMode要求 srcdstGetCastPreQuantModeGmNoQuantNoQuant标量preQuantScalarGetScalarPreQuantModeGetScalarPreQuantModeGmDEQF16/DEQS16/REQ8/QF162S16_PRE/QF162B8_PRE等向量FpTileScalingGetVectorPreQuantModeGetVectorPreQuantModeGmVDEQF16/VDEQS16/VREQ8/VQF162S16_PRE/VQF162B8_PRE等以GetScalarPreQuantMode为例common.hpp源为int32_t且目标为half时反量化为DEQF16目标为int16_t为DEQS16目标为int8_t/uint8_t为REQ8源为half时量化到int16_t用QF162S16_PRE到int8_t/uint8_t用QF162B8_PRE。向量版本前缀VVDEQF16等并在搬移前通过set_fpc设置反量化张量地址。TStore侧的GetScalarPreQuantModeGm/GetVectorPreQuantModeGm语义与之对应源int32_t→REQ8/DEQF16half→QF162B8_PRE但输入输出方向相反片上→GM。量化路径还叠加了ReluPreModeRelu 前置融合与STPhase单双缓冲阶段控制可见 Kirin9030 的 Acc 搬移把反量化 ReLU 布局转换作为一体化的硬件流水操作。5.3 其余 Kirin9030 专属指令TQUANTTQuant.hpp量化指令实现注意架构能力位SupportsTQuantfalse指的是 A5 引入的增强版 TQuant 指令族Kirin9030 仍保有基础量化路径。TEXTract / TInsert / TGatherTExtract.hpp、TInsert.hpp、TGather.hpp不规则访问与数据重组指令其中TExtract同时是TMov到 Left/Right 的底层依赖对应 ISA 语义可对照 docs/isa/TEXTRACT.md、docs/isa/TINSERT.md、[docs/isa/TGATHER.md]docs/isa/TGATHER.md。TCvtTCvt.hpp类型转换 TCVT复用 include/pto/common/arch/register/tcvt_common.hpp。TRem / TRemS / TSubS取余、标量取余与标量减等标量类指令。其余约 70 个指令族TAdd、TMul、TCmp、TConcat、TRowReduce、TSort32、TPartAdd、TTrans、TScatter 等直接复用 A5 实现入口见 header.hpp。六、同步与事件TSYNC 与 Eventinclude/pto/npu/kirin9030/TSync.hpp 提供跨流水线同步原语TSYNC_IMPLOpCode()通过OpPipeEntryOpCode::pipe查询指令所属流水线后调用pipe_barrier。Kirin9030 上单指令同步仅支持 M / MTE1 / MTE2 / MTE3 / ALL / FIX 六类流水线PTO_STATIC_ASSERT校验覆盖了 CubeM、搬运MTE1/2/3、FixPipeFIX等主要执行单元。EventSrcOp, DstOp, AutoToken, EventID继承公共EventBase模板化源/目标指令。同流水线isSamePipe时退化为pipe_barrier跨流水线时分别以set_flag源侧InitImpl与wait_flag目标侧WaitImpl实现带 token 的事件同步。编译期静态断言srcPipe/dstPipe均不能是PIPE_ALL目标侧合法流水线与 TSYNC 一致M/MTE1/MTE2/MTE3/FIX。这部分与公共事件模型对应详见 docs/coding/Event.md。七、ST 测试体系如何验证 Kirin9030 指令实现原 README 明确指出相关内容为ISA 语义见docs/isa/Kirin9030 NPU ST 测试见tests/npu/Kirin9030/src/st/实际目录为小写 tests/npu/kirin9030/src/st/。该目录的testcase/下按指令族组织了大量用例tload、tstore、tmov、tmov_acc2vec、tmov_acc2mat、tmov_nd2nz、tmatmul、tcvt、tquant、trem、trem、tsync、textract、tinsert、tgather、tabs、tadd、tadds、tci、tcmp、tcolsum、tcolexpand、tconcat、tdiv、texp、texpands、tfillpad、tgatherb、thistogram、tlrelu、tmul、tmuls、tneg、tnot、tor、tpartadd、tpow、tprelu、trecip、trelu、trowargmax、trowexpand、trowsum、trsqrt、tscat、tsel、tshl、tshr、tsort32、tsqrt、tsub、ttrans、ttri、txor 等 150 个用例每个用例目录统一包含main.cpphost 侧、*_kernel.cppdevice 侧核函数、.py用例脚本与.txt用例描述/编译配置。以 tload 用例 tests/npu/kirin9030/src/st/testcase/tload/tload_kernel.cpp 为例可以看出标准用例的编写模式引入统一头文件#include pto/pto-inst.hppinclude/pto/pto-inst.hpp该头文件会根据编译目标自动选择 CPU 仿真/成本模型/AICore 实现并using namespace pto;。构造 GlobalTensor通过Shape.../Stride...模板描述五维 shape/stride支持静态 shape 与动态 shape-1占位两种模式BLayout::RowMajor/ColMajor决定内存主序。host 侧对比main.cpp中生成随机输入分别运行 CPU 参考实现与 NPU 核函数比对输出验证指令行为。性能/调试辅助用例内附带get_syscnt()读SYS_CNT寄存器计时与 LOG 缓冲支持 profiling 与逐步打印。因此若要验证或理解某条 Kirin9030 指令推荐路径是docs/isa/指令.md语义与示例→include/pto/npu/kirin9030/指令.hpp实现→tests/npu/kirin9030/src/st/testcase/指令/用例与实测。八、Kirin9030 实现约束速查综合源码Kirin9030 平台有以下必须遵守的硬性约束均为static_assert或PTO_ASSERT可作为开发算子时的编译期自检清单约束来源无量化时 Acc→Mat/Vec/GM 搬移源/目标类型必须一致GetCastPreQuantModecommon.hppAcc 源类型仅支持 half / int32_t分形必须 (ColMajor, RowMajor)CheckTMovAccValidcommon.hppTSTORE 不支持 AtomicAddTStore.hpp三处 static_assertTSTORE Acc 输出仅支持 ND/NZND 时 Rows≤8192NZ 时 Cols 为 16 倍数、Rows≤65535CheckStaticAccTStore.hppTLOAD 不支持 DN→NZ不支持 Mx cubeKirin9030LoadOp、TLOAD_TILE_IMPLTLoad.hppTMATMUL 维度范围 [1, 4095]Acc 仅 half/int32_tTMatmul.hppTMOV Mat→Bias 需 64B 对齐且 ≤1KBMat→Scaling 需 128B 对齐且 ≤7KBTMov.hpp单指令 TSYNC 仅支持 M/MTE1/MTE2/MTE3/ALL/FIXTSync.hpp不支持 BF16/FP8/FP4/Comm/MxLayout/AccFloatArchTraitsKIRIN9030arch_capability.hpp九、总结Kirin9030 的 PTO 指令实现遵循按指令族组织、平台差异最小化、最大程度复用 A5的设计原则include/pto/npu/kirin9030/下的 13 个专属头文件只承载与硬件行为强相关的指令TLoad/TStore/TMov/TMatmul/TSync/TCvt/TExtract/TInsert/TGather/TQuant/TRem/TRemS/TSubS其余算术、逻辑、归约、排序类指令直接复用 A5 实现所有平台能力通过ArchTraitsChipArch::KIRIN9030在编译期统一刻画类型/布局/对齐约束以static_assert固化在实现内部。开发者一方面可以通过docs/isa/理解指令语义通过tests/npu/kirin9030/src/st/的用例验证行为另一方面在移植算子到 Kirin9030 时可依托上述约束速查表快速定位平台差异与适配点。【免费下载链接】pto-isaParallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations across Ascend platforms.项目地址: https://gitcode.com/cann/pto-isa创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →