ARTICLE DETAIL

资讯详情

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

PTO ISA 指令详解:TFILLPAD_INPLACE 原地填充语义、C++ 内建接口与汇编形式

PTO ISA 指令详解:TFILLPAD_INPLACE 原地填充语义、C++ 内建接口与汇编形式 PTO ISA 指令详解TFILLPAD_INPLACE 原地填充语义、C 内建接口与汇编形式【免费下载链接】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-isaTFILLPAD_INPLACE 是 CANN pto-isaParallel Tile OperationAscend 面向 Tile 级运算的虚拟指令集中数据搬运 / 布局指令族的一个变体指令用于在不额外分配目标缓冲的前提下对 Tile 有效区域之外的元素执行原地填充。本文以 docs/isa/TFILLPAD_INPLACE.md 为主体结合仓库内 C 内建接口、CPU 仿真与 NPUA2/A3、A5后端实现源码完整讲解该指令的数学语义、三种填充模式、PadValue 填充值机制、汇编语法与约束帮助开发者正确地在自动模式与手动模式下使用该指令。指令概览与定位TFILLPAD_INPLACE 是 TFILLPAD 的原地in-place填充变体属于数据搬运 / 布局类别。在 docs/PTOISA.md 的指令索引中它与 TFILLPAD、TFILLPAD_EXPAND、TMOV 等并列功能描述为In-place fill/pad variant原地填充/填充变体。该指令的关键特征有两个原地性in-place目标与源必须别名alias同一存储即填充操作直接作用于源 Tile 所在缓冲不产生独立的读-写副本路径实现定义implementation-defined其具体的后端行为由目标平台决定文档中docs/isa/TFILLPAD_INPLACE.md明确标注了这一点。在 docs/mkdocs/src/manual/appendix-d-instruction-family-matrix.md 的指令族矩阵中TFILLPAD_INPLACE 归属于reshape_move模板操作数为dst, src两个 Tile 操作数与 TFILLPAD、TFILLPAD_EXPAND、TMOV 属于同一模板族这从侧面印证了它本质上是 TFILLPAD 在模式参数上的一个特化。数学语义与 PTO 指令集的一般约定一致TFILLPAD_INPLACE 的语义定义在**有效区域valid region**上即以 Tile 的运行时有效行数ValidRow与有效列数ValidCol为边界其余行为标记为实现定义。对 TFILLPAD 家族而言其语义可概括为对目标 Tile 的每个元素(i, j)当i src.GetValidRow()且j src.GetValidCol()时保持有效区域内的源数据不变原地模式下源即目标因此该区域数据原样保留其余填充区元素以TileDataDst::PadVal决定的编译期填充值pad填充。完整的数学表达与PadValueMap位模式表见 docs/isa/TFILLPAD.md。填充值的选取规则如下内置的Zero/Min/Max由PadValueMapDType, PadVal按数据类型映射到对应的位模式自定义位模式使用PadValueCustom(...)直接透传原始比特。在**原地模式InPlace**下由于目标与源是同一块存储上述语义实际上等价于保留有效区域数据把右边界列填充与下边界行填充两个方向上的越界区域统一写成 pad 值从而把一块只写满部分数据的 Tile 物化为完整静态形状、边界值确定的规整 Tile。C 内建接口TFILLPAD_INPLACE 的 C 内建接口声明于 include/pto/common/pto_instr.hpptemplate typename DstTileData, typename SrcTileData, typename... WaitEvents PTO_INST RecordEvent TFILLPAD_INPLACE(DstTileData dst, SrcTileData src, WaitEvents ... events);本质TFILLPAD 模式特化的兼容别名从实现看TFILLPAD_INPLACE并非独立的底层指令而是TFILLPAD在TFillPadMode::InPlace模式下的源码兼容别名。在 include/pto/common/pto_instr.hpp 中template typename DstTileData, typename SrcTileData, typename... WaitEvents PTO_INST RecordEvent TFILLPAD_INPLACE(DstTileData dst, SrcTileData src, WaitEvents... events) { return TFILLPADTFillPadMode::InPlace(dst, src, events...); }而模式枚举定义于 include/pto/common/type.hppenum class TFillPadMode : uint8_t { Normal 0, InPlace 1, Expand 2, };带模式的TFILLPAD主模板同样在 include/pto/common/pto_instr.hpp 中通过static_assert校验模式取值并在if constexpr分支中分发到MAP_INSTR_IMPL(TFILLPAD_INPLACE, ...)。同理TFILLPAD_EXPAND也只是TFillPadMode::Expand的别名三个名字在 C 层保持源码兼容docs/isa/TFILLPAD.md#L72 亦明确说明这一点。等待事件与返回值接口的WaitEvents... events变参是 PTO 指令的通用异步同步机制指令发射前通过detail::PtoWaitEvents(events...)等待这些事件完成返回的RecordEvent可被后续指令继续依赖用于构建数据依赖链。这一机制与 PTO 指令集整体的发射-记录事件-等待事件编程模型一致详见 docs/coding/Event.md。后端实现映射TFILLPAD_INPLACE 的模板分发由宏MAP_INSTR_IMPL按编译目标展开到对应后端头文件目标实现文件关键点CPU 仿真include/pto/cpu/TFillPad.hppTFILLPAD_INPLACE_IMPLstatic_assert要求 dst/src 的 Rows/Cols 完全一致随后走inplacetrue的通用实现NPU A5include/pto/npu/a5/TFillPad.hppTFILLPAD_INPLACE_IMPL同样要求 Rows/Cols 一致内部以TFillPad..., true模板参数控制是否跳过有效区拷贝NPU A2/A3include/pto/npu/a2a3/TFillPad.hpp与 A5 结构一致static_assert约束相同代价模型include/pto/costmodel/pto_instr.hpp在 costmodel 中同样以TFILLPADTFillPadMode::InPlace形式注册在 A5 后端的TFillPadTileDataDst, TileDataSrc, inplace内核函数中include/pto/npu/a5/TFillPad.hppinplacefalse时先通过CopyValidElementsVec把有效区数据从 src 拷到 dst而原地模式inplacetrue跳过整段有效区拷贝只执行两步填充行内列填充对每一有效行从packedValidCol偏移起用vdup生成的 pad 向量寄存器配合vstus无对齐 scatter-store逐块写出列填充区行填充从srcValidRow * dstStride起始对整行块用vsts带谓词掩码写出行填充区。也就是说原地模式相比普通模式节省了读有效区 → 写目标区的一次搬移这是该变体在性能上的核心收益。从源码结构可以推断原地填充适合目标与源复用同一缓冲、仅需补全边界值的场景例如算子流水中上一阶段的输出在下一阶段直接作为带 padding 的规整输入。汇编语法TFILLPAD_INPLACE 在汇编层面有两种形式分别对应 PTO 汇编的两个层级AS Level 1SSA 形式%dst pto.tfillpad_inplace %src : !pto.tile... - !pto.tile...SSA 形式以%dst ... %src的定值-使用关系表达数据流操作数类型为!pto.tile...Tile 抽象类型省略具体形状、布局参数。AS Level 2DPS 形式pto.tfillpad_inplace ins(%src : !pto.tile_buf...) outs(%dst : !pto.tile_buf...)DPSDestination-Predicate-Source形式显式声明输入ins(...)与输出outs(...)操作数类型下沉为!pto.tile_buf...Tile 缓冲区类型与底层缓冲语义对齐。三种填充模式对比要正确使用 TFILLPAD_INPLACE需要先理解它与兄弟指令的差异。TFILLPAD 家族按TFillPadMode分为三种模式docs/isa/TFILLPAD.md#L66-L72模式C 别名静态形状要求语义TFillPadMode::NormalTFILLPAD目标与源静态形状必须一致Rows/Cols相等拷贝源到目标并填充边界TFillPadMode::InPlaceTFILLPAD_INPLACE目标与源静态形状一致且必须别名同一存储原地补全填充区TFillPadMode::ExpandTFILLPAD_EXPAND目标静态形状可大于源Dst::Rows Src::Rows且Dst::Cols Src::Cols拷贝并扩展填充到更大目标三种模式的静态形状断言在 CPU 与 NPU 后端的TFILLPAD_*_IMPL中均有static_assert落实例如 include/pto/cpu/TFillPad.hpp编译期即可拦截非法用法。选择原则可以归纳为需要保留源数据另作他用时用Normal目标形状需要放大时用Expand仅需把已有缓冲的边界补全为确定值时用InPlace。约束TFILLPAD_INPLACE 继承 TFILLPAD 家族的全部约束docs/isa/TFILLPAD.md#L74-L88并结合原地语义增加自身限制类型/布局/位置/形状合法性由后端决定文档明确说明type/layout/location/shape legality is backend-dependent对特定后端应以其实现说明为规范性约束dst/src 静态形状必须一致TFILLPAD_INPLACE_IMPL中static_assert(TileDataDst::Cols TileDataSrc::Cols TileDataDst::Rows TileDataSrc::Rows)如 include/pto/npu/a5/TFillPad.hpp原地别名要求目标与源必须指向同一块存储这是原地模式区别于普通模式的本质约束填充值不能为NullVec 类型重载要求TileDataDst::PadVal ! PadValue::Nullinclude/pto/npu/a5/TFillPad.hpp否则无法确定填充位模式数据类型约束sizeof(Dst::DType) sizeof(Src::DType)且元素大小为 1、2 或 4 字节打包类型fp4x2按 1 字节 DType 处理每元素占两个 nibble在 A5 上其ValidCol/Cols按 nibble 计数与 TLOAD/TSTORE/TCVT 一致填充长度按ceil(Cols/2)打包字节计算Mat 类型重载当TileType Mat时该重载为TFILLPAD的 Mat 专用形式要求布局满足!isRowMajor SLayout::RowMajorNZ 布局且PadVal只能为Zero或Null。填充值PadValue机制填充区写什么值由 Tile 的编译期模板参数TileDataDst::PadVal决定。PadValue枚举定义于 include/pto/common/type.hppenum class PadValue : uint64_t { Null 0, Zero 1, Max 2, Min 3, CustomBase 0x100000000ULL, // 自定义值起始标记bit 32 置位 };Zero/Min/Max是按数据类型映射的位模式映射表PadValueMap的完整内容见 docs/isa/TFILLPAD.md浮点类型float/half/bfloat16_t映射为0/-inf/inf整型映射为类型 min/maxfloat8_e4m3_t无 inf映射为有限极值float8_e5m2_t/hifloat8_t含±inffloat4_e2m1x2_t/float4_e1m2x2_t两个 nibble 同时为极值。低精度映射仅在 A5及 fp8/fp4 的 CPU 仿真生效hifloat8_t仅 A5 支持自定义位模式PadValueCustom系列函数include/pto/common/constants.hpp将 bit 32 置位后把原始比特存入低 32 位运行时经GetPadValueTileData()解码后直接透传写入填充区。例如PadValueCustom(-1.0f)、PadCustom0.5ffp16/bf16 需用PadValueCustom16(bits16)直接传 16 位表示。float8_e8m0_t没有 Zero/Min/Max 语法糖必须使用PadValueCustom。CPU 仿真侧include/pto/cpu/TFillPad.hpp与 NPU 共用同一套GetPadValue位模式解码对 4/2/1 字节类型分别以std::bit_cast还原为 DType 值再经cpu::parallel_for_1d逐元素写出有效区拷贝 填充区写 pad的结果行为与 NPU 位模式保持一致。平台支持情况根据 include/README.md 的指令支持矩阵列为各后端平台行末为 CPU 仿真与各 NPU 平台TFILLPAD_INPLACE 在 CPU 仿真与 A2/A3 平台标记为 TODO在 A5、kirin 系列等平台标记为 Yes。这意味着A5 及后续平台可直接使用该指令含 fp8/fp4 等低精度填充位模式CPU 仿真与 A2/A3接口与实现已就绪见 include/pto/cpu/TFillPad.hpp 与 include/pto/npu/a2a3/TFillPad.hpp但支持状态在矩阵中尚未标注完成使用时请以当前发布版本的 ReleaseNote 与支持矩阵为准。在成本模型侧include/pto/costmodel/pto_instr.hppTFILLPAD_INPLACE 同样以模式分支形式注册可参与性能仿真与指令周期估算。汇编形式示例ASM自动模式Auto Mode自动模式下指令的放置与调度由编译器/运行时统一管理用户只需写出数据流# Auto mode: compiler/runtime-managed placement and scheduling. %dst pto.tfillpad_inplace %src : !pto.tile... - !pto.tile...手动模式Manual Mode手动模式下Tile 资源必须先显式绑定、再发射指令。当指令包含 tile 操作数时可通过pto.tassign把参数绑定到具体 tile 地址# Manual mode: resources must be bound explicitly before issuing the instruction. # Optional for tile operands: # pto.tassign %arg0, tile(0x1000) # pto.tassign %arg1, tile(0x2000) %dst pto.tfillpad_inplace %src : !pto.tile... - !pto.tile...PTO 汇编形式两级形式对照%dst pto.tfillpad_inplace %src : !pto.tile... - !pto.tile... # AS Level 2 (DPS) pto.tfillpad_inplace ins(%src : !pto.tile_buf...) outs(%dst : !pto.tile_buf...)这些汇编模板同时被仓库的文档归一化工具 docs/tools/normalize_isa_docs.py 用作 ISA 文档的一致性基准保证各指令页的汇编示例与工具链解析规则保持一致。典型使用场景与示例TFILLPAD_INPLACE 的典型价值在于把部分填充的 Tile物化为形状规整、边界确定的完整 Tile从而让后续算子可以直接按完整静态形状运算无需在每一级都处理有效区边界。这在卷积 img2col、软硬件流水、矩阵分块等场景中尤为重要——有效区之外的元素被统一写成 pad 值后后续数学运算如归约、矩阵乘的结果是确定且可预测的。一个基于 C 内建接口的示意Vec 类型、原地模式目标与源为同一 Tile#include pto/pto-inst.hpp using namespace pto; void fill_pad_inplace_example() { // Vec Tile16x16RowMajor 布局有效区 8x8填充值为 PadValue::Min using TileT TileTileType::Vec, float, 16, 16, BLayout::RowMajor, 16, 16, SLayout::NoneBox, TileConfig::fractalABSize, PadValue::Min; TileT tile; tile.SetValidRow(8); // 运行时有效行 tile.SetValidCol(8); // 运行时有效列 TFILLPAD_INPLACE(tile, tile); // 原地填充保留 8x8 有效区其余写 -inf }更完整的可运行示例含普通模式、Mat 模式参见 docs/isa/TFILLPAD.md以及 docs/isa/README.md 中对该指令的索引说明。动手实践方面可参考 docs/getting-started.md 完成环境搭建后在 demos 与 kernels 目录中寻找使用数据搬运/布局指令的实际算子工程指令级编程模型与 Tile 概念可进一步阅读 docs/coding/ProgrammingModel.md 与 docs/coding/GlobalTensor.md。小结TFILLPAD_INPLACE 是 TFILLPAD 家族中面向原地补全边界的变体它在 C 层是TFILLPADTFillPadMode::InPlace的兼容别名在汇编层同时提供 SSA 与 DPS 两种形式约束目标与源必须别名同一存储、静态形状一致。理解其与 Normal、Expand 两种模式的差异以及PadValue填充值的位模式映射含 fp8/fp4 等低精度类型与自定义位模式是正确使用该指令的关键。需要进一步深入时建议通读 docs/isa/TFILLPAD.md家族语义与约束全集并结合 include/pto/npu/a5/TFillPad.hpp、include/pto/cpu/TFillPad.hpp 的后端实现逐行研读。【免费下载链接】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),仅供参考
返回列表