PTO-ISA TSHL 指令详解:Tile 级逐元素左移的汇编语法、C++ 内建接口与多平台实现

发布时间:2026/9/20 20:25:14
PTO-ISA TSHL 指令详解:Tile 级逐元素左移的汇编语法、C++ 内建接口与多平台实现 PTO-ISA TSHL 指令详解Tile 级逐元素左移的汇编语法、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-isa导读TSHLTile Shift Left是 CANN PTO-ISA 虚拟指令集中用于对两个 Tile 做逐元素左移的向量运算指令其语义等价于对有效区域内的每个元素执行dst src0 src1。本文以 docs/isa/TSHL.md 为核心骨架结合仓库中的多平台实现源码A2A3、A5、A6与 A5 平台 ST 测试用例完整讲解 TSHL 的数学语义、三种汇编书写形式、C 内建接口签名、各平台数据类型与形状约束以及 A6 平台上“有符号移位量”的底层仿真实现。读完本文你将能够正确地在自动模式与手动模式下书写/生成 TSHL 汇编并通过 C 内建接口在算子内核中调用该指令。指令概览与数学语义TSHL 属于 PTO-ISA 的逐元素element-wise二元向量运算指令操作对象是两个 Tilesrc0、src1结果写入第三个 Tiledst。在指令枚举中TSHL 被归类到向量流水PIPE_V见 include/pto/common/event.hpp 中的PTO_DEFINE_OP_PIPE(Op::TSHL, PIPE_V)。对有效区域内每个元素(i, j)其数学语义为$$ \mathrm{dst}{i,j} \mathrm{src0}{i,j} \ll \mathrm{src1}_{i,j} $$即dst的每个元素由src0对应位置的元素按照src1对应位置元素给出的移位量向左移位得到。其中src1是逐元素的移位量 Tile而不是立即数标量这也是 TSHL 与标量移位指令 TSHLS 的本质区别——TSHLS 使用单个标量作为统一移位量而 TSHL 允许 Tile 内每个元素拥有独立的移位量。仓库中的include/README.md第 154 行将 TSHL 列入 PTO-ISA 支持的指令清单其行为与TSHLS、TSHR右移互为姊妹指令。汇编语法TSHL 指令在 PTO-ISA 中支持三种粒度的书写形式同步形式的 PTO 汇编、AS Level 1SSA 形式与 AS Level 2DPS 形式。同步形式PTO 汇编%dst tshl %src0, %src1 : !pto.tile...!pto.tile...是 PTO 的 tile 类型描述符...处填写具体的数据类型、形状与布局参数。AS Level 1SSA 形式SSA 形式将两个输入与一个输出显式写成函数式调用返回!pto.tile...类型值%dst pto.tshl %src0, %src1 : (!pto.tile..., !pto.tile...) - !pto.tile...AS Level 2DPS 形式DPSData Parallel Semantics形式使用ins(...)/outs(...)将输入与输出分开声明操作数类型为物理缓冲类型!pto.tile_buf...pto.tshl ins(%src0, %src1 : !pto.tile_buf..., !pto.tile_buf...) outs(%dst : !pto.tile_buf...)C 内建接口TSHL 的 C 内建接口声明于 include/pto/common/pto_instr.hpp公共包含头为pto/pto-inst.hpptemplate typename TileDataDst, typename TileDataSrc0, typename TileDataSrc1, typename... WaitEvents PTO_INST RecordEvent TSHL(TileDataDst dst, TileDataSrc0 src0, TileDataSrc1 src1, WaitEvents ... events);接口要点模板参数TileDataDst、TileDataSrc0、TileDataSrc1为三个 Tile 的元数据类型用于在编译期推导数据类型与布局WaitEvents...为可变参数的事件类型。返回RecordEvent指令发射后返回一个可赋给Event...的事件对象用于跨指令的流水同步。源码中TSHL内部先调用detail::PtoWaitEvents(events...)等待传入的前置事件再通过宏MAP_INSTR_IMPL(TSHL, dst, src0, src1)分发到具体平台实现include/pto/common/pto_instr.hpp。用法示例典型的流水编排是先TLOAD加载两个输入再TSHL计算最后TSTORE_VEC写回。A5 平台 ST 测试内核 tests/npu/a5/src/st/testcase/tshl/tshl_kernel.cpp 展示了事件链的标准写法EventOp::TLOAD, Op::TSHL event0; EventOp::TSHL, Op::TSTORE_VEC event1; TLOAD(src0Tile, src0Global); event0 TLOAD(src1Tile, src1Global); event1 TSHL(dstTile, src0Tile, src1Tile, event0);约束与检查规则TSHL 的约束分为编译期静态检查static_assert与运行时断言PTO_ASSERT两类各平台通过TShlCheck模板函数统一实施A2A3 见 include/pto/npu/a2a3/TShl.hppA5 见 include/pto/npu/a5/TShl.hpp。公共约束所有平台dst、src0、src1必须使用相同的元素类型否则编译期报错Fix: TSHL has invalid data type.dst、src0、src1必须是行主序row-major布局否则编译期报错Fix: TSHL only support row major layout.运行时形状检查src0.GetValidRow()/GetValidCol()与src1.GetValidRow()/GetValidCol()必须与dst的GetValidRow()/GetValidCol()一致否则触发PTO_ASSERT报Fix: TSHL input tile src0/src1 valid shape mismatch with output tile dst shape.有效区域指令以dst.GetValidRow()/dst.GetValidCol()作为迭代域三个 Tile 有效形状一致是正确计算的前提。平台差异检查项A2A3Atlas A2/A3 训练/推理系列A5Ascend 950PR/Ascend 950DTA6支持元素类型uint8_t、int8_t、uint16_t、int16_t、uint32_t、int32_t在 A2A3 基础上增加int64_t、uint64_t与 A5 一致8 种类型全支持移位量语义按普通整数左移处理与 A2A3 一致src1按有符号数解释负值使移位方向反转按\|src1\|右移64 位特殊规则不支持 64 位类型支持 64 位类型对int64_t/uint64_t实际移位量为src1 63A6 平台的移位量语义细节A6 的TShl实现include/pto/npu/a6/TShl.hpp为兼容 A5 的语义做了特殊处理A6 硬件vshl/vshr只接受无符号移位量且不会对负值反转方向。为了复现“负数反向移位”的语义实现中同时计算两种结果再按通道选择negMask (src1 0) // 按有符号数比较得到负数掩码 absSrc1 |src1| // 负数通道取绝对值 tmpL src0 |src1| // vshl无符号移位量 tmpR src0 |src1| // vshr有符号 src0 为算术右移无符号为逻辑右移 dst negMask ? tmpR : tmpL // vsel 按通道选择底层实现原理A2A3循环展开的朴素实现A2A3 实现include/pto/npu/a2a3/TShl.hpp直接按有效区域双层循环逐元素计算dstPtr[j i * dstRowStride] src0Ptr[j i * src0RowStride] src1Ptr[j i * src1RowStride]并在循环前后通过PtoSetWaitFlagPIPE_V, PIPE_S()/PtoSetWaitFlagPIPE_S, PIPE_V()设置向量流水与标量流水之间的等待标志。当三个 Tile 形状一致时可走constexpr特化路径相同行步长否则分别使用各自的行步长参数。A5硬件向量指令映射A5 实现include/pto/npu/a5/TShl.hpp将 TSHL 映射到硬件vshl向量指令对有符号类型int8_t/int16_t/int32_t使用ShlOpvshl(reg_dst, reg_src0, reg_src1, preg, MODE_ZEROING)对无符号类型使用ShlOp2将移位量寄存器按同宽度有符号类型重解释后执行vshl对int64_t/uint64_t走Int64BinaryInt64Op::Shl, ...专用路径由 32 位向量指令组合模拟 64 位移位。BinaryInstr...内部按elementsPerRepeat CCE_VL / sizeof(T)与blockSizeElem BLOCK_BYTE_SIZE / sizeof(T)组织向量发射。A6有符号移位量的软件仿真A6 实现include/pto/npu/a6/TShl.hpp如上一节所述通过vcmp_ltvsubvsel求绝对值、同时执行vshl/vshr并按负数掩码选择结果64 位类型则走Int64ShiftBinaryfalse, ...路径。使用示例以下来自 docs/isa/TSHL.md 的完整 C 示例可直接放入算子内核#include pto/pto-inst.hpp using namespace pto; void example() { using TileT TileTileType::Vec, uint32_t, 16, 16; TileT x, sh, out; TSHL(out, x, sh); }要点说明TileTileType::Vec, uint32_t, 16, 16声明了一个向量单元、uint32_t元素、16 行 × 16 列的 Tilex为被移位数据sh为逐元素移位量out为结果调用前应通过TASSIGN或自动模式机制为三个 Tile 完成内存ubuf分配并在多流水场景下按上文示例传入Event事件保证TLOAD → TSHL → TSTORE_VEC的顺序。汇编形式示例自动模式自动模式下资源放置与调度由编译器/运行时统一管理用户只需描述数据流# Auto mode: compiler/runtime-managed placement and scheduling. %dst pto.tshl %src0, %src1 : (!pto.tile..., !pto.tile...) - !pto.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.tshl %src0, %src1 : (!pto.tile..., !pto.tile...) - !pto.tile...PTO 汇编形式PTO 汇编将同步形式与 AS Level 2DPS形式并列给出便于对照%dst tshl %src0, %src1 : !pto.tile... # AS Level 2 (DPS) pto.tshl ins(%src0, %src1 : !pto.tile_buf..., !pto.tile_buf...) outs(%dst : !pto.tile_buf...)验证与测试仓库在 A5 平台提供了完整的 STSystem Test用例目录 tests/npu/a5/src/st/testcase/tshl/tshl_kernel.cpp定义runTShlAICORE 内核使用TileTileType::Vec, T, kTRows_, kTCols_, BLayout::RowMajor, -1, -1动态形状 Tile并通过TASSIGN(src0Tile, 0x0)、TASSIGN(src1Tile, 0x10000)、TASSIGN(dstTile, 0x20000)为三个 Tile 显式绑定 ubuf 地址——这是手动模式资源绑定的真实写照main.cpp基于 GTest 的测试主体覆盖多组kTRows_/kTCols_/vRows/vCols组合与 in-place 场景LaunchTShlInplace并对比 golden 数据gen_data.py生成测试输入与期望输出的参考数据。同目录的 tshls 则是 TSHLS标量移位量版本的对应用例可用于对照学习两者的差异。相关指令对照指令语义移位量来源文档TSHL逐元素左移dst src0 src1Tile逐元素独立docs/isa/TSHL.mdTSHLSTile 按标量左移dst src scalar标量立即数docs/isa/TSHLS.mdTSHR逐元素右移dst src0 src1Tile逐元素独立docs/isa/TSHR.md编写移位类算子时若所有元素共享同一移位量应优先使用标量版本TSHLS接口见 include/pto/common/pto_instr.hpp仅当每个元素需要不同移位量如按位域解包、逐元素变长移位时才使用TSHL并注意 A6 平台上负数移位量会反转移位方向这一语义差异。【免费下载链接】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),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询