首页/新闻资讯/正文详情

PTO-ISA TCMP 指令详解:Tile 比较与打包谓词掩码的跨平台实现指南

发布时间:2026/9/20 23:55:16 来源:云帆数科 栏目:资讯中心
PTO-ISA TCMP 指令详解:Tile 比较与打包谓词掩码的跨平台实现指南
PTO-ISA TCMP 指令详解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-isaTCMPTile Compare是 Ascend CANN 并行 Tile 操作虚拟指令集PTO-ISAParallel Tile Operation中的核心矢量比较指令它逐元素比较两个 Tile 的数据将比较结果以**打包的谓词掩码packed predicate mask**形式写入第三个 Tile是 Tile 级条件分支、数据过滤、掩码生成等算法的基础构件。本篇文章以 TCMP 指令文档 为骨架结合仓库内include/pto下的 A2A3、A5、CPU 三套实现与tests/cpu/st/testcase/tcmp中的测试用例完整讲解 TCMP 的数学语义、汇编语法、C 内建接口、类型约束、掩码编码规则与实战用法读者读完后可以在自己的 PTO kernel 中正确使用TCMP生成掩码并理解其在各平台上的行为差异。指令概述与数学语义TCMP 的语义非常直接比较两个 Tile并写入一个打包的谓词掩码。概念上对于有效区域中的每个元素(i, j)指令定义一个谓词$$ p_{i,j} \left(\mathrm{src0}{i,j}\ \mathrm{cmpMode}\ \mathrm{src1}{i,j}\right) $$其中cmpMode是本次比较采用的模式p_{i,j}为布尔值。所有谓词位按照实现定义的打包布局packed layout存入目标 Tiledst。也就是说dst中存放的不是逐元素的 0/1 数值而是将 8 个比较结果压缩进 1 个字节的高密度位掩码——这正是它在内存带宽上优于逐元素写出的原因。CmpMode六种比较模式CmpMode枚举定义在 include/pto/common/type.hpp#L189-L196取值如下enum class CmpMode : uint8_t { EQ 0, NE 1, LT 2, LE 3, GT 4, GE 5, };六个模式分别对应相等、不等、小于、小于等于、大于、大于等于覆盖了绝大多数数据筛选场景。在后续的汇编形式中比较模式通过属性cmpMode #pto.cmpEQPTO 汇编层或cmpMode #ptocmp xxAS Level 1/2指定。汇编语法TCMP 提供三种粒度的汇编形式从 PTO 指令集汇编同步形式到 MLIR 风格的 SSA 再到 DPS 数据流形式。同步形式PTO 汇编%dst tcmp %src0, %src1 {cmpMode #pto.cmpEQ} : !pto.tile... - !pto.tile...AS Level 1SSA 形式——操作数与结果都是!pto.tile...值%dst pto.tcmp %src0, %src1{cmpMode #ptocmp xx}: (!pto.tile..., !pto.tile...) - !pto.tile...AS Level 2DPS 数据流形式——操作数改用带存储属性的!pto.tile_buf...明确ins输入与outs输出区分pto.tcmp ins(%src0, %src1{cmpMode #ptocmp xx}: !pto.tile_buf..., !pto.tile_buf...) outs(%dst : !pto.tile_buf...)C 内建接口在 C kernel 中TCMP 以模板内建函数的形式暴露公共头文件为pto/pto-inst.hpp声明位于 include/pto/common/pto_instr.hpp#L333-L339template typename TileDataDst, typename TileDataSrc0, typename TileDataSrc1, typename... WaitEvents PTO_INST RecordEvent TCMP(TileDataDst dst, TileDataSrc0 src0, TileDataSrc1 src1, CmpMode cmpMode, WaitEvents ... events);接口要点dst、src0、src1三个 Tile 分别对应目标掩码、左操作数、右操作数cmpMode传入CmpMode枚举值如CmpMode::GT变参WaitEvents支持事件同步接口内部先调用detail::PtoWaitEvents(events...)等待前序事件再通过MAP_INSTR_IMPL(TCMP, ...)宏分发到具体平台的实现返回RecordEvent可作为后续指令的等待事件参与流水编排。约束条件A2A3 与 A5 的实现差异TCMP 在不同硬件代际上的支持面差异明显编写可移植 kernel 前务必对照约束。A2A3Atlas A2/A3 训练/推理系列检查项实现位于 include/pto/npu/a2a3/TCmp.hpp编译期与运行期检查包括输入类型仅支持int32_t、half、float三种输出类型必须为uint8_tTile 位置src0/src1/dst的TileType::Loc必须为TileType::Vec矢量单元静态有效边界TileDataSrc::ValidRow TileDataSrc::Rows且TileDataSrc::ValidCol TileDataSrc::Cols编译期用static_assert保证运行期形状src0与src1的有效行数、有效列数必须分别相等且src0.GetValidRow() dst.GetValidRow()目标列语义dst的有效列数描述的是打包容量不要求等于源有效列数int32_t 特例仅支持EQ与NENE对相等比较结果取反其余模式一律走EQ路径。从源码 include/pto/npu/a2a3/TCmp.hpp#L27-L65 可以看到A2A3 的底层是vcmpv_eq/lt/gt/ge/le系列矢量比较指令且定义了单次发射最大 repeat 数TCMP_REPEAT_MAX 240超过部分通过外层numLoop循环切分。NE的实现方式是在比较之后额外插入pipe_barrier(PIPE_V)并执行一次vnot对掩码取反include/pto/npu/a2a3/TCmp.hpp#L102-L111。A5Ascend 950PR / 950DT检查项实现位于 include/pto/npu/a5/TCmp.hpp支持面显著扩大输入类型支持uint32_t、int32_t、int64_t、uint64_t、uint16_t、int16_t、uint8_t、int8_t、float、half、bfloat16_t共 11 种输出为打包谓词字节可使用 RowMajor 的uint8_t掩码 Tile迭代域以src0.GetValidRow()/src0.GetValidCol()为比较次数src1必须提供对应的有效元素dst有效列只描述打包容量不决定比较次数编译期检查要求三个 Tile 均为TileType::Vec且为 RowMajor 布局见 include/pto/npu/a5/TCmp.hpp#L301-L325 的TcmpCheck。A5 实现按元素宽度分派到三条路径include/pto/npu/a5/TCmp.hpp#L327-L344sizeof(T) 8int64/uint64走Int64Compare将 64 位数据拆成高/低 32 位寄存器对先比较高位、再按模式用psel/por组合低位结果最终pdintlv_b8psts(..., PK)完成位打包sizeof(T) 4走TCmp_32B用双发射 pdintlv_b8交叉解交织完成 32 位元素的位压缩sizeof(T) 2/1走TCmp_8B_16B单发比较后按PK/NORM分布写入。掩码编码规则掩码的具体位布局由目标平台定义文档与实现给出了 A5 平台64 位输入的明确规则对 64 位输入第j列的比较结果存放在该行第j / 8个字节的第j % 8位最低有效位在前little-endian bit order对于uint8_t掩码有效形状可设为[R, ceil(C / 8)]其中[R, C]是源 Tile 的有效形状物理Cols需要按 32 字节对齐行地址按目标 Tile 的物理行步长RowStride计算最后一个有效位之后的填充位取值未指定不应依赖其值。CPU 模拟实现 include/pto/cpu/TCmp.h#L48-L66 印证了这一规则它按字宽uint8_t为 8 位、uint32_t为 32 位将源列切分为validWords ceil(srcValidCol / kBitsPerWord)个打包字逐位packedWord | (cmp bit)组装再写入目标 Tile。CPU 侧还额外支持uint32_t输出类型此时 dst 数据类型断言放宽为uint8_t/uint32_t见 include/pto/cpu/TCmp.h#L100-L102并在写掩码前调用ZeroTileData将目标清零避免脏数据。实战示例Auto 模式Auto 模式下 Tile 的资源放置与调度由编译器/运行时管理只需声明 Tile 类型并调用接口#include pto/pto-inst.hpp using namespace pto; void example_auto() { using SrcT TileTileType::Vec, float, 16, 16; using MaskT TileTileType::Vec, uint8_t, 16, 32, BLayout::RowMajor, -1, -1; SrcT src0, src1; MaskT mask(16, 2); TCMP(mask, src0, src1, CmpMode::GT); }注意MaskT的声明物理Cols 32满足 32 字节对齐运行期构造时传入有效形状(16, 2)即 16 行 × 2 个打包字节ceil(16 / 8) 2正好容纳 16×16 源区域 16 行每行 16 个比较位的掩码。Manual 模式Manual 模式下需要先用TASSIGN显式绑定各 Tile 的物理地址再发射 TCMP#include pto/pto-inst.hpp using namespace pto; void example_manual() { using SrcT TileTileType::Vec, float, 16, 16; using MaskT TileTileType::Vec, uint8_t, 16, 32, BLayout::RowMajor, -1, -1; SrcT src0, src1; MaskT mask(16, 2); TASSIGN(src0, 0x1000); TASSIGN(src1, 0x2000); TASSIGN(mask, 0x3000); TCMP(mask, src0, src1, CmpMode::GT); }对应的 PTO 汇编形式同样体现了自动/手动两种风格# Auto mode: compiler/runtime-managed placement and scheduling. %dst pto.tcmp %src0, %src1{cmpMode #ptocmp xx}: (!pto.tile..., !pto.tile...) - !pto.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.tcmp %src0, %src1{cmpMode #ptocmp xx}: (!pto.tile..., !pto.tile...) - !pto.tile...端到端验证CPU 仿真测试仓库在 tests/cpu/st/testcase/tcmp/tcmp_kernel.cpp 提供了完整的 CPU 仿真验证用例展示了 TCMP 与TLOAD/TSTORE的组合使用范式template typename T, typename TDst, int kGRows_, int kGCols_, int kTRows_, int kTCols_ AICORE void runTCmp(__gm__ TDst __out__* out, __gm__ T __in__* src0, __gm__ T __in__* src1, pto::CmpMode mode) { constexpr int kBitsPerDst sizeof(TDst) * 8; constexpr int kPackedCols (kTCols_ kBitsPerDst - 1) / kBitsPerDst; using SrcTile TileTileType::Vec, T, kTRows_, kTCols_, BLayout::RowMajor, -1, -1; using DstTile TileTileType::Vec, TDst, kTRows_, kTCols_, BLayout::RowMajor, -1, -1; SrcTile src0Tile(kTRows_, kTCols_); SrcTile src1Tile(kTRows_, kTCols_); DstTile dstTile(kTRows_, kPackedCols); TASSIGN(src0Tile, 0); TASSIGN(src1Tile, kTRows_ * kTCols_ * sizeof(T)); TASSIGN(dstTile, 2 * kTRows_ * kTCols_ * sizeof(T)); TLOAD(src0Tile, src0Global); TLOAD(src1Tile, src1Global); TCMP(dstTile, src0Tile, src1Tile, mode); TSTORE(dstGlobal, dstTile); }该用例的显式模板实例化覆盖了 CPU 侧支持的类型组合tests/cpu/st/testcase/tcmp/tcmp_kernel.cpp#L61-L90float、int32_t、int64_t、uint64_t、aclFloat16搭配uint8_t输出以及uint32_t、int32_t、uint16_t、int16_t、uint8_t、int8_t、float、aclFloat16含可选bfloat16_t搭配uint32_t输出与上述约束章节完全对应。测试目录同时提供了 gen_data.py 生成对比数据并通过tests/cpu/st/testcase/CMakeLists.txt挂入 ST 测试框架配合tests/run_cpu_tests.sh即可在 CPU 仿真环境下验证掩码输出的正确性。小结功能定位TCMP 是 Tile 级逐元素比较指令输出按位打包的谓词掩码而非逐元素的 0/1 数据适合作为后续TSEL、TGATHER等掩码驱动指令的数据源模式选择CmpMode提供EQ/NE/LT/LE/GT/GE六种模式A2A3 上int32_t输入仅支持EQ/NE其余类型需关注平台差异掩码布局A5 上 64 位输入按行内“第j/8字节第j%8位、LSB 在前”编码uint8_t掩码有效形状取[R, ceil(C/8)]、物理列 32 字节对齐填充位不可依赖跨平台实现A2A3 走vcmpv_*原生比较 repeat 切分240 上限A5 按 8/4/2/1 字节宽度分派三条打包路径并支持 64 位拆比较CPU 仿真侧则提供位打包参考实现与完整 ST 用例三套实现共同保障了 PTO-ISA 的跨平台一致性。【免费下载链接】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),仅供参考

相关推荐

OmO Agent-Model Matching 指南:用 model_profile 与模型链驾驭多模型编排
OmO Agent-Model Matching 指南:用 model_profile 与模型链驾驭多模型编排

OmO Agent-Model Matching 指南:用 model_profile 与模型链驾驭多模型编排 【免费下载链接】oh-my-openagent OmO: Just type "mass ulw" keyword with your prompt. Now you are the master of graph engineering. 项目地址: https://gitcode.com/gh_m… · 2026/9/20 23:55:16

深入剖析 Netty MpscLinkedQueue 无锁队列:NioEventLoop 任务队列的高性能实现原理
深入剖析 Netty MpscLinkedQueue 无锁队列:NioEventLoop 任务队列的高性能实现原理

文档教程知识库 【免费下载链接】source-code-hunter 😱 从源码层面,剖析挖掘互联网行业主流技术的底层实现原理,为广大开发者 “提升技术深度” 提供便利。目前开放 Spring 全家桶,Mybatis、Netty、Dubbo 框架,及 Red… · 2026/9/20 23:55:16

VSCode 插件梳理,让 Codex 跑 Agent:Key 用 TaoToken
VSCode 插件梳理,让 Codex 跑 Agent:Key 用 TaoToken

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

CSS动画卡顿真相:GPU合成层优化实战指南
CSS动画卡顿真相:GPU合成层优化实战指南

1. 项目概述:为什么一个CSS动画会卡成PPT,而另一个却丝滑如德芙?“CSS动画卡顿”这五个字,几乎是我过去三年里被问得最多的问题。不是“怎么加动画”,而是“加了之后页面直接卡死”。上周帮一个做在线教育平台的团队排… · 2026/9/21 0:40:26

OpenSSH 8.x 下 Oracle 19c RAC OUI SSH 连接失败解决指南
OpenSSH 8.x 下 Oracle 19c RAC OUI SSH 连接失败解决指南

先说个结论:你手动 ssh/scp 都能通,不代表 Oracle 19c RAC 安装界面里的 OUI 能通。我在 RHEL 8 系列系统上装 19c Grid Infrastructure 时,就被这一幕卡了整整一个下午:两台节点的 ssh 互信、免密登录全都正常,可一走… · 2026/9/21 0:40:26

OpenResearch:本地优先的研究工作流协议
OpenResearch:本地优先的研究工作流协议

1. OpenResearch 不是另一个 CLI 工具,而是本地优先研究工作流的底层协议OpenResearch 这个名字乍看像某个开源项目仓库名,或是某家科技公司的内部代号——但结合当前全网围绕CLI、autoresearch、local-first的密集搜索热度,以及大量重复出现… · 2026/9/21 0:40:26

pytest自动化测试框架进阶指南:从fixture到数据驱动与工程化实践
pytest自动化测试框架进阶指南:从fixture到数据驱动与工程化实践

1. 为什么说pytest是自动化测试进阶的第一选择1.1 先看看那些"跑得通但活不下去"的测试脚本做Python自动化测试做到一定阶段,你会发现一个扎心的现象:很多人写的测试代码,能跑,但没人敢改。我接手过一套几百个函数的接口… · 2026/9/21 0:40:26

OpenResearch实践指南:用Git和Markdown构建可回溯的研究工作流
OpenResearch实践指南:用Git和Markdown构建可回溯的研究工作流

上个月我们团队内部做了一个小决定,把一份已经做了三个月的行业研究报告,从“散落在十几个聊天窗口和共享文档里的素材”,彻底迁移到一套 OpenResearch 工作流上。当时只是抱着“试试看能不能少挨几次催”的念头,结果跑完一个完整… · 2026/9/21 0:40:26

本地AI视频剪辑实战:Palmier Pro完整体验与避坑指南
本地AI视频剪辑实战:Palmier Pro完整体验与避坑指南

在 Mac 上折腾视频剪辑这些年,我见过太多“新概念剪辑工具”,上来都说自己有多智能,结果百分之八十是套了一层 AI 壳,剪个片子还是得靠手。2024 年底我开始用 Palmier Pro,本来没抱太高期待,几周体验下来反… · 2026/9/21 0:39:26

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

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

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

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

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

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

Claude Code 按智谱AI指南装完,ANTHROPIC_BASE_URL 改走 TaoToken 兼容通道行不行
Claude Code 按智谱AI指南装完,ANTHROPIC_BASE_URL 改走 TaoToken 兼容通道行不行

/* 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 0:00:18

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程
agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and … · 2026/9/21 0:00:18

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,… · 2026/9/21 0:00:18

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码