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),仅供参考

相关新闻

WorkBuddy安装全攻略:Windows/macOS环境配置与避坑指南

WorkBuddy安装全攻略:Windows/macOS环境配置与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 23:49:51 阅读更多 →
Page Assist:把本地大模型装进浏览器侧边栏的完整指南

Page Assist:把本地大模型装进浏览器侧边栏的完整指南

Page Assist:把本地大模型装进浏览器侧边栏的完整指南 【免费下载链接】page-assist Use your locally running AI models to assist you in your web browsing 项目地址: https://gitcode.com/GitHub_Trending/pa/page-assist 在读一篇英文长文时&#xff0…

2026/9/20 20:25:57 阅读更多 →
masscan 完整实战指南:互联网级异步 TCP 端口扫描器的参数详解、配置实践与源码原理

masscan 完整实战指南:互联网级异步 TCP 端口扫描器的参数详解、配置实践与源码原理

网络安全渗透测试CLI 【免费下载链接】masscan TCP port scanner, spews SYN packets asynchronously, scanning entire Internet in under 5 minutes. 项目地址: https://gitcode.com/gh_mirrors/ma/masscan 点击查看 免费下载 导读 本文以 doc/masscan.8.markdo…

2026/9/22 1:05:27 阅读更多 →

最新新闻

3步搞定美国人平均寿命数据校验,最佳实践避坑指南

3步搞定美国人平均寿命数据校验,最佳实践避坑指南

3步搞定美国人平均寿命数据校验,最佳实践避坑指南 配置环境就卡半天,是不是你也曾为了一个看似简单的数据校验逻辑,在本地和测试环境之间反复横跳?明明代码在本地跑得飞快,一到线上就报错,或者精度丢失导致业务逻辑错乱。别急,这不只是你一个人的问题…

2026/9/22 1:43:55 阅读更多 →
闫辉速查手册:3个底层优化让Java接口快10倍

闫辉速查手册:3个底层优化让Java接口快10倍

闫辉速查手册:3个底层优化让Java接口快10倍 复制来的代码跑不通,报错日志像天书一样刷屏,90%的应届生都卡在这一步。别急着删库重练,你需要一份能直接落地的 闫辉 性能优化 速查手册…

2026/9/22 1:43:55 阅读更多 →
:D是什么意思 视频吧手写实现

:D是什么意思 视频吧手写实现

3个底层逻辑搞懂:D是什么意思视频吧手写实现与性能优化 配置环境就卡半天,是不是经常遇到?刚把 Node.js 装好,npm install 转了十分钟还没动静,或者 Python…

2026/9/22 1:43:55 阅读更多 →
3道高频面试题拆解g674源码 告别教程依赖

3道高频面试题拆解g674源码 告别教程依赖

3道高频面试题拆解g674源码 告别教程依赖 看了一堆教程还是不会写项目?别急,这锅不该教程背,得背在“只抄不读”上。 很多后端开发卡在“能跑就行”的阶段,面试时遇到 高频面试题 问底层原理,脑子一片空白。比如今天我们要聊的 g674…

2026/9/22 1:43:55 阅读更多 →
图解原理搞懂ping检测:告别配置环境卡半天的3个实战技巧

图解原理搞懂ping检测:告别配置环境卡半天的3个实战技巧

图解原理搞懂ping检测:告别配置环境卡半天的3个实战技巧 你是不是也遇到过这种情况?为了验证服务器通不通,或者检查网络设备是否在线,结果在命令行里敲了半天 ping…

2026/9/22 1:43:55 阅读更多 →
pp助手ios7入门到精通:5个真实场景对比,面试官最想看这个

pp助手ios7入门到精通:5个真实场景对比,面试官最想看这个

pp助手ios7入门到精通:5个真实场景对比,面试官最想看这个 面试被问“为什么选这个方案”答不上来,或者只会背八股文,现场让你写个Demo却卡壳?这种尴尬我见得太多了。很多学员觉得pp助手ios7只是老掉牙的安卓工具,但在特定遗留系统或逆…

2026/9/22 1:42:55 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →