ARTICLE DETAIL

资讯详情

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

深入解析 PTO-ISA TSTORE 指令:Tile 到 GlobalTensor 的数据搬出、原子写入与随路量化

深入解析 PTO-ISA TSTORE 指令:Tile 到 GlobalTensor 的数据搬出、原子写入与随路量化 深入解析 PTO-ISA TSTORE 指令Tile 到 GlobalTensor 的数据搬出、原子写入与随路量化【免费下载链接】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导读TSTORE 是 CANN pto-isaParallel Tile Operation 虚拟指令集中负责将 Tile 数据从片上存储UB/L0C搬出到 GlobalTensorGM的核心指令是计算管线结果落盘的最后一道关卡。本文以 docs/isa/TSTORE_zh.md 为骨架结合 pto_instr.hpp、type.hpp、各 NPU 后端的 TStore.hpp 实现以及 A5/CPU 的tstore_acc2gm定向测试用例系统讲解 TSTORE 的汇编形式、C 内建接口、STPhase搬出相位规则、L2 cache hint、数据类型与布局约束帮助读者掌握从哪搬、怎么搬、搬到哪、能否原子写/量化的完整决策路径。指令概述TSTORE 将 Tile 中的数据存储到 GlobalTensorGM可选使用原子写入或量化参数。它在数据流中的角色与 TLOAD 正好相反TLOAD 负责把 GM 数据搬入片上TSTORE 负责把片上计算结果写回 GM。这一搬出动作通常位于算子计算的末尾其结果直接决定 GM 中数据的最终布局与数值。数学语义TSTORE 的符号表示取决于GlobalTensor的形状/步长Shape/Stride和Tile的布局。从概念上的二维视图带基础偏移量(r0, c0)来看其语义为$$ \mathrm{dst}{r_0 i,; c_0 j} \mathrm{src}{i,j} $$即 Tile 中坐标为(i, j)的元素被写入 GlobalTensor 中以(r0, c0)为起点的对应位置。实际搬移的尺寸以src.GetValidRow()/src.GetValidCol()为准见下文有效区域约束而非 Tile 的静态形状。汇编语法PTO 汇编形式同步形式的最简写法tstore %t1, %sv_out[%c0, %c0]AS Level 1SSA 形式pto.tstore %src, %mem : (!pto.tile..., !pto.partition_tensor_viewMxNxdtype) - ()AS Level 2DPS 形式pto.tstore ins(%src : !pto.tile_buf...) outs(%mem : !pto.partition_tensor_viewMxNxdtype)在自动Auto模式下编译器/运行时负责资源放置与调度直接发射pto.tstore在手动Manual模式下需要先用pto.tassign显式绑定 tile 资源如pto.tassign %arg0, tile(0x1000)再发射指令。C 内建接口TSTORE 的 C 内建接口声明于 include/pto/common/pto_instr.hpp内部声明与 include/pto/common/constants.hpp对外统一通过公共头pto/pto-inst.hpp即 include/pto/pto-inst.hpp暴露。所有重载均返回RecordEvent可通过尾部的WaitEvents... events参数参与事件同步内部经detail::PtoWaitEvents(events...)统一处理。四族重载签名// 1. 普通搬出无量化 template typename TileData, typename GlobalData, AtomicType atomicType AtomicType::AtomicNone, typename... WaitEvents PTO_INST RecordEvent TSTORE(GlobalData dst, TileData src, WaitEvents... events); // 2. 标量预量化preQuantScalar template typename TileData, typename GlobalData, AtomicType atomicType AtomicType::AtomicNone, typename... WaitEvents PTO_INST RecordEvent TSTORE(GlobalData dst, TileData src, uint64_t preQuantScalar, WaitEvents... events); // 3. 向量量化fpScaling 位置的 fp tile template typename TileData, typename GlobalData, typename FpTileData, AtomicType atomicType AtomicType::AtomicNone, ReluPreMode reluPreMode ReluPreMode::NoRelu, typename... WaitEvents PTO_INST RecordEvent TSTORE(GlobalData dst, TileData src, FpTileData fp, WaitEvents... events); // 4. TSTORE_FP历史 fp 量化形式源码兼容入口 template typename TileData, typename GlobalData, typename FpTileData, AtomicType atomicType AtomicType::AtomicNone, ReluPreMode reluPreMode ReluPreMode::NoRelu, typename... WaitEvents PTO_INST RecordEvent TSTORE_FP(GlobalData dst, TileData src, FpTileData fp, WaitEvents... events);从源码结构看pto_instr.hpp上述每个基本重载之外还有带STPhase Phase的UF-aware版本通过STPhase作为首个模板参数选择搬出相位以及带TStoreL2Hint l2Control的 L2-hint 版本pto_instr.hpp最终全部路由到TSTORE_IMPL...。关键语义细节TSTORE_FP(...)为历史 fp 量化形式保留源码兼容入口并直接映射到TSTORE_IMPL(dst, src, fp)。规范同名TSTORE(..., fp, ...)重载仅在FpTileData::Loc TileType::Scaling时参与匹配std::enable_if_t约束后端实现仍可继续检查额外合法性。带STPhase Phase的 UF-aware 重载仅在PTO_NPU_ARCH_A5、PTO_NPU_ARCH_A2A3、PTO_NPU_ARCH_KIRIN9030、PTO_NPU_ARCH_KIRINDEV0000或__CPU_SIM编译宏下暴露pto_instr.hpp即向量量化 STPhase 形式仅在存在对应后端实现的目标上可用A2A3、A5、kirin9030、kirinDev0000 和 CPU 模拟器。底层实现映射以 A5 后端 include/pto/npu/a5/TStore.hpp 为例TSTORE_IMPL的分发逻辑清晰展示了三种数据路径源 Tile 为TileType::Vec时走TStore...内部按 ND/DN/NZ 布局调用TStoreVecND/TStoreVecDN等例程通过set_loop_size_ubtoout、set_loop1/2_stride_ubtoout配置 burst 循环与跨距TStore.hpp源 Tile 为TileType::Acc时走TStoreAcc...L0C→GM 的copy_matrix_cc_to_gm路径unit flag 写在 Xt 寄存器而非位置参数带标量/向量量化参数的重载会先调用set_quant_pre(preQuantScalar)或通过TStoreAccFp传入 Scaling 位置的 fp tile再执行搬出TStore.hpp。若atomicType AtomicType::AtomicAdd实现会在搬出前SetAtomicAdd...()、搬出后set_atomic_none()恢复保证原子模式的启停严格包围本次搬出TStore.hpp。A2/A3 与 kirinX90 分别有独立的 TStore.hpp、TStore.hpp 实现公共的寄存器/内存搬运例程则沉淀在 include/pto/common/arch/register/tstore_common.hpp 与 include/pto/common/arch/memory/tstore_common.hpp。搬出侧 STPhase 相位规则unit flagSTPhase与累加侧AccPhase在 include/pto/common/type.hpp 中定义enum class STPhase : uint8_t { Unspecified 0x0, Partial 0x2, Final 0x3, }; enum class AccPhase : uint8_t { Unspecified 0x0, Unknown Unspecified, // 兼容别名 Partial 0x2, Final 0x3, };搬出侧STPhase的取值规则与累加侧不对称产生该 L0C 结果的TMATMUL必须已经是AccPhase::Final即数据已就绪STPhase::Final用于最后一次搬出并释放 unit flagSTPhase::Partial只用于同一块 L0C 分多次搬出时的非末次那几条它不释放 unit flag把STPhase::Partial与AccPhase::Partial配对会让 fixpipe 等待一个不会到来的标志而挂死。该规则已在 L0C→L1、L0C→UB、L0C→GM 三条搬出路径上于 Ascend 950PR 仿真测试确认。其中 TSTORE 走的是 L0C→GM 的copy_matrix_cc_to_gmunit flag 写在 Xt 寄存器而非位置参数由tstore_acc2gm的case_vector_quant_uf_multi_drain用例覆盖见下文测试章节。L2 cache hint搬出缓存策略TSTORE 支持可选首模板参数TStoreL2Hint l2Control默认NormalFirstVictim用于控制搬出数据在 L2 cache 中的驻留策略TSTORE(dst, src); // 默认 NormalFirstVictim TSTORETStoreL2Hint::NotAllocClean(dst, src); // 不分配缓存、写直达clean TSTORETStoreL2Hint::NotAllocClean, AtomicType::AtomicAdd(dst, src); // 与原子写组合与AtomicType/STPhase/ReluPreMode组合时TStoreL2Hint放在最前源码注释明确不要在旧重载集的TileData前插入默认 hint以免与TSTORETileT, GTensor, AtomicType::AtomicAdd的既有调用发生歧义见 pto_instr.hpp。L2 hint 的实际转发行为由编译宏PTO_FORWARD_L2HINT_TO_IMPL控制关闭时仅(void)static_castuint8_t(l2Control)吸收参数后走无 hint 路径。支持的TStoreL2Hint枚举定义于 type.hpp枚举值A2/A3A5NormalFirstVictim0无效果支持NormalLastVictim1无效果支持NormalPersistent2无效果支持NotAllocClean4无效果支持注意A2/A3 上 L2 hint无效果所有取值均为 no-op无 store L2 控制A5 上表内取值透传给 DMACPU / costmodel 忽略。该枚举与 AscendC 的asc_store_l2_cache_mode对齐当前仅开放NotAllocClean一种 not-alloc store 模式。数据类型与布局约束TSTORE 的合法性与目标硬件强相关实现检查分为两套平台规则。通用约束所有平台有效区域实现使用src.GetValidRow()/src.GetValidCol()作为传输大小。运行时所有dst.GetShape(dim)值和src.GetValidRow()/GetValidCol()必须 0。Atlas A2/A3 训练/推理系列产品源 tile 位置必须是以下之一TileType::Vec、TileType::Mat、TileType::Acc。对于源 tile 位置为TileType::Vec/TileType::MatTileData::DType必须是int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t、half、bfloat16_t、float之一sizeof(TileData::DType) sizeof(GlobalData::DType)布局必须匹配 ND/DN/NZ或特殊情况TileData::Rows 1或TileData::Cols 1。该特殊情况下遍历方式取自 Tile 布局而非GlobalTensor布局向量按一次连续搬运写入不使用另一维的跨距。因此 ColMajor 的[N, 1]Tile 经 NDGlobalTensor落盘时占用N个连续元素而不是每行跨距一个元素对于int64_t/uint64_t仅支持 ND→ND 或 DN→DN。对于源 tile 位置为TileType::Acc包括带量化参数的调用形式和原子写入变体支持的布局转换NZ2ND、NZ2NZ、NZ2NC1HWC0、NZ2NDC1HWC0不支持 NZ2DN目标布局必须是 ND、NZ、NC1HWC0 或 NDC1HWC0源数据类型必须是int32_t或float不使用量化时目标数据类型必须是int32_t/float/half/bfloat16_tACC→GM 数据类型支持取决于调用形式调用形式源数据类型支持的目标数据类型TSTORE(dst, acc)floatfloat、half、bfloat16_tTSTORE(dst, acc)int32_tint32_tTSTORE(dst, acc, preQuantScalar)/TSTORE(dst, acc, fp)/TSTORE_FP(dst, acc, fp)floatint8_t、uint8_tTSTORE(dst, acc, preQuantScalar)/TSTORE(dst, acc, fp)/TSTORE_FP(dst, acc, fp)int32_tint8_t、uint8_t、half其它未列出的跨类型组合不属于支持范围。静态形状约束1 TileData::Cols 4095ND 布局下1 TileData::Rows 8192NZ、NC1HWC0 或 NDC1HWC0 布局下1 TileData::Rows 65535且TileData::Cols % 16 0运行时1 src.GetValidCol() 4095。Ascend 950PR / Ascend 950DT源 tile 位置必须是TileType::Vec或TileType::Acc此目标不支持 Mat 存储。对于源 tile 位置为TileType::Vecsizeof(TileData::DType) sizeof(GlobalData::DType)TileData::DType必须是int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t、half、bfloat16_t、float、float8_e4m3_t、float8_e5m2_t、hifloat8_t、float8_e8m0_t、float4_e1m2x2_t、float4_e2m1x2_t之一新增 FP8/FP4 系列类型布局必须匹配 ND/DN/NZ或Rows 1/Cols 1的特殊情况语义同 A2/A3强制执行额外的对齐约束例如ND 布局下行主序宽度以字节计必须是 32 的倍数DN 布局下列主序高度以字节计必须是 32 的倍数但有特殊情况例外。这一约束与 A5 实现中CheckStaticVec的静态检查逻辑相印证TStore.hpp。对于源 tile 位置为TileType::Acc包括带量化参数的调用形式和原子写入变体支持的布局转换NZ2ND、NZ2NZ、NZ2NHWC、NZ2NCHW、NZ2NCDHW不支持 NZ2DN目标布局必须是 ND、NZ、NHWC、NCHW 或 NCDHW源数据类型必须是int32_t或float不使用量化时目标数据类型必须是int32_t/float/half/bfloat16_tACC→GM 数据类型支持取决于调用形式调用形式源数据类型支持的目标数据类型TSTORE(dst, acc)floatfloat、half、bfloat16_tTSTORE(dst, acc)int32_tint32_tTSTORE(dst, acc, preQuantScalar)/TSTORE(dst, acc, fp)/TSTORE_FP(dst, acc, fp)floatint8_t、uint8_t、half、bfloat16_t、hifloat8_t、float8_e4m3_t、floatTSTORE(dst, acc, preQuantScalar)/TSTORE(dst, acc, fp)/TSTORE_FP(dst, acc, fp)int32_tint8_t、uint8_t、half、bfloat16_t其它未列出的跨类型组合不属于支持范围。静态形状约束与 A2/A3 对行/列的约束相同AtomicAdd额外限制目标数据类型为支持的原子类型。编程示例自动Auto模式#include pto/pto-inst.hpp using namespace pto; template typename T void example_auto(__gm__ T* out) { using TileT TileTileType::Vec, T, 16, 16; using GShape Shape1, 1, 1, 16, 16; using GStride BaseShape2DT, 16, 16, Layout::ND; using GTensor GlobalTensorT, GShape, GStride, Layout::ND; GTensor gout(out); TileT t; TSTORE(gout, t); }手动Manual模式#include pto/pto-inst.hpp using namespace pto; template typename T void example_manual(__gm__ T* out) { using TileT TileTileType::Vec, T, 16, 16; using GShape Shape1, 1, 1, 16, 16; using GStride BaseShape2DT, 16, 16, Layout::ND; using GTensor GlobalTensorT, GShape, GStride, Layout::ND; GTensor gout(out); TileT t; TASSIGN(t, 0x1000); // 手动模式下先显式绑定 tile 资源 TSTORETileT, GTensor, AtomicType::AtomicAdd(gout, t); // 原子累加搬出 }汇编示例自动模式由编译器/运行时负责资源放置与调度pto.tstore %src, %mem : (!pto.tile..., !pto.partition_tensor_viewMxNxdtype) - ()手动模式先显式绑定资源再发射指令当该指令包含 tile 操作数时可选# 可选 # pto.tassign %arg0, tile(0x1000) # pto.tassign %arg1, tile(0x2000) pto.tstore %src, %mem : (!pto.tile..., !pto.partition_tensor_viewMxNxdtype) - ()测试验证与实现佐证TSTORE 在仓库中拥有跨平台、跨形态的定向测试覆盖是验证上文约束与相位规则的第一手证据。A5Ascend 950PR定向用例tests/npu/a5/src/st/testcase/tstore_acc2gm/main.cpp 中的tstore_acc2gm测试覆盖了大量 NZ→ND/NZ 布局、跨数据类型uint16_t→uint16_t、uint16_t→int8_t等的 ACC 搬出组合其中与文档直接对应的 3 个用例// issue 552: per-channel 随路量化TSTORE_FP与 unit flag 并行 TEST_F(TStoreAcc2gmTest, case_vector_quant_uf_final) { test_tstore_acc2gm_vector_nz2nd10, uint16_t, uint16_t, 15, 15, 31(); } // 同一块 L0C 多次搬出非末次 STPhase::Partial末次 STPhase::Final TEST_F(TStoreAcc2gmTest, case_vector_quant_uf_multi_drain) { test_tstore_acc2gm_vector_nz2nd11, uint16_t, uint16_t, 15, 15, 31(); }按照文档记录在 Ascend 950PR 板机、CANN 9.2.0 环境下tstore_acc2gm的 3 个定向用例case38、case_vector_quant_uf_final、case_vector_quant_uf_multi_drain全部通过max diff 均为 0覆盖 per-channel 量化基线、Final和Partial后接Final连同 TEXTRACT、TINSERT 和 TMOV本轮 24 个定向搬出用例全部上板通过。该结果仅覆盖所选用例不代表完整 A5 ST 测试集。CPU 模拟器tests/cpu/st/testcase/tstore_acc2gm/main.cpp 提供 NZ→ND 普通搬出test_tstore_acc2gm_nz2nd、标量预量化test_tstore_acc2gm_scalar_nz2nd、NDC1HWC0 标量量化test_tstore_acc2gm_scalar_nz2NDC1HWC0与 ReLU 预处理的 CPU 参考实现与数值校验便于在没有 NPU 板机的环境下快速验证 TSTORE 的语义正确性。其他平台A2/A3 tests/npu/a2a3/src/st/testcase/tstore_acc2gm/main.cppkirin9030 tests/npu/kirin9030/src/st/testcase/tstore_acc2gm/main.cppcostmodel tests/costmodel/st/testcase/tstore/main.cpp各平台测试通过统一的run_st.shtests/run_st.sh等脚本组织构建与执行。与其他文档的关系TSTORE 的向量量化形式对应独立的指令文档 docs/isa/TSTORE_FP.md 及其中文版 docs/isa/TSTORE_FP_zh.mdTSTORE_FP 作为历史 fp 量化入口二者共享底层TSTORE_IMPL。搬入侧的对称指令 TLOAD 见 docs/isa/TLOAD_zh.md数学语义与约束的通用约定可参考 docs/isa/conventions_zh.md。总结TSTORE 是 PTO-ISA 数据搬出体系的核心指令其能力可归纳为四个维度位置与布局支持 UBVec与 L0CAcc含 Mat作为源支持 ND/DN/NZ/NHWC/NCHW/NCDHW/NC1HWC0/NDC1HWC0 等目标布局及对应转换且两代平台A2/A3 与 Ascend 950PR/950DT规则不同编码前务必核对目标平台约束原子写入通过AtomicType::AtomicAdd模板参数实现 GM 侧原子累加实现层以SetAtomicAdd/set_atomic_none严格包围搬出随路量化标量preQuantScalar、向量FpTileDataScaling 位置与 ReLU 预处理ReluPreMode三档可选支持 int8/uint8/half 等量化输出资源与缓存控制STPhase::Final/Partial管理 L0C unit flag 的释放时机错误配对会导致 fixpipe 挂死TStoreL2Hint控制 A5 上的 L2 cache 驻留策略。配合仓库中 A5/A2A3/CPU 的tstore_acc2gm定向测试开发者可以在编写算子时按先查平台约束表、再选调用形式、最后定相位与缓存策略的顺序安全高效地使用 TSTORE 完成结果落盘。【免费下载链接】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),仅供参考
返回列表