
PTO-ISA TEXPANDS 指令详解将标量广播填充至 Tile 的标量扩展算子【免费下载链接】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-isaTEXPANDS 是 CANN pto-isa 指令集中用于将单个标量广播填充到目标 Tile 全区域的标量扩展Scalar Expand指令常用于 Tile 的初始化、置零或常量填充等场景。本文以 TEXPANDS_zh.md 为主体结合仓库内 CPU/NPU 的指令实现源码与 ST 测试用例完整梳理该指令的数学语义、三种汇编形式、C 内建接口、平台约束与底层实现原理帮助开发者在自动Auto与手动Manual两种编程模式下正确使用 TEXPANDS。指令概览名称与定位TEXPANDS 是Tile Expand Scalar的缩写语义为将标量广播到目标 Tile 中把单个标量值写入目标 Tile 有效区域的每一个元素属于典型的单源、广播写型指令。它不读取任何 Tile 数据源只依赖一个标量立即数或寄存器值因此天然适合Tile 的零初始化如TEXPANDS(dst, 0.0f)常量填充如 padding 区域的固定值填充在手动模式下与 TASSIGN 配合先绑定 Tile 资源再写入初值。数学语义对有效区域内的每个元素(i, j)指令执行如下赋值$$ \mathrm{dst}_{i,j} \mathrm{scalar} $$其中scalar为与目标 Tile 数据类型DType一致的标量值。与需要同时读取两个操作数的二元指令如 TADD、TMUL不同TEXPANDS 的源只有一个标量因此指令发射不依赖任何 Tile 数据依赖仅需保证目标 Tile 的资源已就绪。与其他指令的关系从仓库中的使用示例如 texpands_kernel.cpp可以看到 TEXPANDS 的典型调用链TASSIGN(dst, 0x400)为 Tile 绑定片上资源手动模式TEXPANDS(dstTile, scalar)将标量广播写入 Tileset_flag/wait_flag或Event建立流水级同步TSTORE(dstGlobal, dstTile)将结果写回 Global Memory。汇编语法TEXPANDS 在汇编层面有三种表达形式覆盖同步形式、SSA 中间表示AS Level 1与 DPSData Parallel Semantics形式AS Level 2。同步形式%dst texpands %scalar : f32, !pto.tile...%scalar为标量值: f32指明标量类型!pto.tile...为目标 Tile 类型%dst为广播填充后的结果 Tile。AS Level 1SSA%dst pto.texpands %scalar : dtype - !pto.tile...SSA 形式中每个值只被定义一次%scalar作为唯一输入%dst作为输出值类型由dtype与!pto.tile...联合描述。AS Level 2DPSpto.texpands ins(%scalar : dtype) outs(%dst : !pto.tile_buf...)DPS 形式显式区分ins输入标量与outs输出 Tile 缓冲目标以!pto.tile_buf...表示实际承载数据的缓冲区。C 内建接口声明位置与公共头文件TEXPANDS 的 C 内建接口声明于 include/pto/common/pto_instr.hpp公共包含头为pto/pto-inst.hpp即 include/pto/pto-inst.hpp。接口定义如下template typename TileData, typename... WaitEvents PTO_INST RecordEvent TEXPANDS(TileData dst, typename TileData::DType scalar, WaitEvents ... events);接口语义解析参数含义TileData目标 Tile 类型TileTileType::Vec|Mat, T, Rows, Cols, ...或 ConvTile编译期确定位置、形状与数据类型dst目标 Tile 引用指令将标量广播写入其有效区域scalar标量值类型为TileData::DType与 Tile 元素类型一致WaitEvents... events可选事件列表指令发射前通过detail::PtoWaitEvents(events...)等待这些事件完成实现异步流水同步接口实际实现中pto_instr.hpp通过MAP_INSTR_IMPL(TEXPANDS, dst, scalar)将调用映射到各平台的TEXPANDS_IMPL实现返回RecordEvent供后续指令如 TSTORE作为依赖事件使用。例如在 texpands_mat_kernel.cpp 中EventOp::TEXPANDS_MAT, Op::TSTORE_MAT evtExpands_Store; evtExpands_Store TEXPANDSTileData(MatTile, value); TSTORE(dstGlobal, MatTile, evtExpands_Store);TEXPANDS返回的evtExpands_Store作为事件参数传给TSTORE保证写回在广播填充完成后才发起。约束与适用条件TEXPANDS 在编译期static_assert/PTO_ASSERT执行一系列实现检查不同平台约束存在差异。Atlas A2/A3 训练系列产品 / Atlas A2/A3 推理系列产品Tile 位置为向量TileData::Loc TileType::VecTileData::DType必须是以下类型之一int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、half、bfloat16_t、float静态有效边界TileData::ValidRow TileData::Rows且TileData::ValidCol TileData::Cols。Tile 位置为矩阵TileData::Loc TileType::Mat数据类型约束与 Vec 相同有效边界TileData::Rows * TileData::Cols * sizeof(TileData::DType) / 32必须位于[1, 32767]范围内。Ascend 950PR / Ascend 950DTA5 系列Vec 位置静态有效边界TileData::ValidRow TileData::Rows且TileData::ValidCol TileData::Cols数据类型扩展为uint8_t、int8_t、uint16_t、int16_t、uint32_t、int32_t、int64_t、uint64_t、half、bfloat16_t、float新增 64 位整型支持。Mat 位置数据类型约束同 Vec含 64 位整型对Layout::NC1HWC0或Layout::FRACTAL_Zshape0 * shape1 * shape2 * shape3必须在[1, 32767]范围内对Layout::NDC1HWC0或Layout::FRACTAL_Z_3Dshape0 * shape1 * shape2 * shape3 * shape4必须在[1, 32767]范围内。上述范围限制源于硬件重复repeat计数的位宽从源码 a2a3/TExpandS.hpp 与 a5/TExpandS.hpp 可见EXPANDS_MAX_SUPPORT_REPEAT_TIMES 32767对应 repeat 配置位域[14:0]。有效区域Valid Region语义TEXPANDS 的填充范围取决于 Tile 位置相关概念可参考 conventions_zh.mdVec 位置在dst.GetValidRow()/dst.GetValidCol()指定的有效区域内填充dst。有效区域是运行时计算域Rows/Cols描述物理存储形状有效形状改变不影响物理步长Mat 位置Tile在TileData::Rows/TileData::Cols上填充dst按整个物理形状填充Mat 位置ConvTile在ConvTileData的shape内填充dst。源码级实现解析CPU 实现CPU 模拟实现位于 include/pto/cpu/TExpands.hpp核心逻辑TExpands_Impl按布局分三种路径RowMajor 非分形布局按行并行dst[base c] src外层循环使用cpu::parallel_for_rows并行、内层循环使用PTO_CPU_VECTORIZE_LOOP向量化ColMajor 非分形布局交换行列循环顺序base c * Rows分形S Fractal布局通过GetTileElementOffsettile_shape(r, c)计算分形存储下的元素偏移保证在 5HD 等分形排布下仍能正确写入。CPU 实现同样遵循有效区域语义TEXPANDS_IMPL在入口处读取dst.GetValidRow()与dst.GetValidCol()作为实际填充范围。NPU A2/A3 实现A2/A3 实现位于 include/pto/npu/a2a3/TExpandS.hppVec 与 Mat 分属不同底层路径Vec 路径核心是vector_dup向量复制指令。实现先按连续/非连续两种情况优化连续场景行主序且单行或整列有效直接用TExpandsVec1D一次性复制validRow * validCol个元素非连续场景用TExpandsVec2Dstride按行循环复制stride 取RowStride/ColStride每条复制前通过SetVectorCount(nElem)设置向量长度结束后SetFullVecMaskByDTypeT()恢复全量掩码。Mat 路径TExpandsMatTile/TExpandsMat5HD将 Tile 总字节数除以 32B 块大小得到 repeat 次数构造 repeat 配置位域后调用pto_create_cbuf_matrix整片填充。repeat 配置的位域含义源码注释明确标注[46:32] 相邻两次 repeat 之间的 repeat gap [30:16] 每次 repeat 的 block 数此处为 1 [14:0] repeat 次数即填充的 32B 块数上限 32767ConvTile 路径TExpandsMat5HD依据GetShape(0..4)计算总字节数对应NC1HWC0/C1HWNC0等 5 维布局。NPU A5 实现A5 实现位于 include/pto/npu/a5/TExpandS.hppVec 路径基于BinaryInstrExpandSOpT, ...框架ExpandSOp::BinSInstr通过vdup(reg_dst, scalar, preg, MODE_ZEROING)在寄存器级完成标量广播复制并按行主序/列主序自动交换行列。与 A2/A3 不同A5 对 64 位整型有专门优化当DType为int64_t/uint64_t时走Int64Fill路径利用vbr将 64 位标量拆成高低 32 位寄存器、vintlv交织、vsts分段存储该路径要求行主序布局static_assert(TileData::isRowMajor, TEXPANDS B64 currently requires row-major layout.)Mat 路径同样使用pto_create_cbuf_matrix与 repeat 配置位域并针对 1/2/4 字节类型做不同的值扩展如 1 字节值扩展为 32 位重复模式。编程示例自动模式Auto自动模式下编译器/运行时负责 Tile 的资源放置与调度无需手动绑定#include pto/pto-inst.hpp using namespace pto; void example_auto() { using TileT TileTileType::Vec, float, 16, 16; TileT dst; TEXPANDS(dst, 0.0f); }手动模式Manual手动模式需先用 TASSIGN 显式绑定 Tile 的片上资源再发射指令#include pto/pto-inst.hpp using namespace pto; void example_manual() { using TileT TileTileType::Vec, float, 16, 16; TileT dst; TASSIGN(dst, 0x1000); TEXPANDS(dst, 0.0f); }完整 Kernel 示例来自 ST 测试仓库 tests/cpu/st/testcase/texpands/texpands_kernel.cpp 给出了包含加载、广播填充、同步与写回的完整用例骨架TileData dstTile(kVRows_, kVCols_); TASSIGN(dstTile, 0x0 0x400); // 绑定片上资源 TEXPANDS(dstTile, scalar); // 标量广播填充 set_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); // 向量核→搬移核同步 wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); TSTORE(dstGlobal, dstTile); // 写回 Global Memory该测试覆盖了float、int32_t、int64_t、uint64_t、half、int16_t、bfloat16_t等类型以及整 Tile64×64与部分有效区域60×60、1×3600、16×200 等场景并针对不同PadValueNull/Max验证了边界填充行为。汇编形式示例# 自动模式由编译器/运行时负责资源放置与调度。 %dst pto.texpands %scalar : dtype - !pto.tile...# 手动模式先显式绑定资源再发射指令。 # 可选绑定示例 # pto.tassign %arg0, tile(0x1000) # pto.tassign %arg1, tile(0x2000) %dst pto.texpands %scalar : dtype - !pto.tile...%dst texpands %scalar : f32, !pto.tile... # AS Level 2 (DPS) pto.texpands ins(%scalar : dtype) outs(%dst : !pto.tile_buf...)测试与验证仓库为 TEXPANDS 提供了跨平台、跨位置类型的完整 ST 测试矩阵CPU 模拟tests/cpu/st/testcase/texpands/Vec 位置含多种数据类型与有效区域组合NPU A2/A3tests/npu/a2a3/src/st/testcase/texpands/ 与 texpands_mat/后者覆盖 Mat 位置与 ConvTile 5 维布局texpands_mat_kernel.cpp 中通过TEXPANDSTileData(MatTile, value)与TSTORE事件串联验证写入正确性NPU A5tests/npu/a5/src/st/testcase/texpands/ 与 texpands_mat/验证 64 位整型广播等 A5 新增能力衍生使用TEXPANDS 还被用于其他算子的 kernel 实现中如 hashfind、tscatter 等测试用例作为常量填充辅助手段。每个测试目录下均配有gen_data.py期望数据生成与main.cpp校验入口可通过仓库的 run_cpu.py / run_st.sh 等脚本按既有流程运行验证。总结TEXPANDS 是 pto-isa 指令集中最基础也最常用的广播写指令之一数学语义简单dst[i,j] scalar但正确使用需要同时理解三件事——汇编层面三种形式同步/SSA/DPS的表达差异C 内建接口TEXPANDS(dst, scalar, events...)的类型约束与事件同步机制以及各平台A2/A3 与 Ascend 950PR/950DT在数据类型、布局和 repeat 范围上的实现检查差异。结合本文给出的 CPU/NPU 实现原理与 ST 测试用例开发者可以据此在自动与手动两种模式下安全高效地完成 Tile 初始化、置零与常量填充并为深入理解 PTO 向量/矩阵指令家族如 TASSIGN、TSTORE、TADD 等建立坚实基础。【免费下载链接】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),仅供参考