hw-native-sys/pto-isa/pto-isa-operator-implementation

Claude Code and agent skill by hw-native-sys/pto-isa

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

使用PTO-ISA实现指定算子功能的完整流程指南,涵盖ISA指令选择、数据流分析、指令功能解释和kernel代码生成

Install

npx vskill@latest install hw-native-sys/pto-isa/pto-isa-operator-implementation

SKILL.md

PTO-ISA算子实现指南

本指南为使用PTO-ISA实现指定算子功能提供完整的流程指导。

目录

  1. 概述
  2. 工作流程
  3. 步骤详解
  4. ISA指令分类参考
  5. 数据流分析框架
  6. 示例
  7. 最佳实践
  8. 常见问题

概述

本skill专门用于帮助开发者从PTO-ISA指令集中选择合适的指令来实现指定的算子功能,并生成完整的kernel代码。

适用场景
  • 用户指定具体的算子功能需求(如: "实现GELU激活函数"、"实现Batch Normalization")
  • 需要分析PTO-ISA指令集并选择合适的指令组合
  • 需要理解数据在硬件上的流动过程
  • 需要生成可直接使用的kernel代码
关键特性
  • ISA指令选择: 从PTOISA_zh.md文档中分析并选择合适的指令
  • 数据流分析: 按数据处理顺序分析数据流向
  • Vector计算: gm → ub → vector → ub → gm
  • Cube计算(矩阵乘): GM → L1 → L0A/L0B → L0C → GM
  • 指令功能解释: 详细解释每个ISA指令在算子实现中的作用
  • 代码生成: 输出完整的kernel代码实现

工作流程

当用户指定算子功能后,遵循以下工作流程:

用户指定算子功能
↓
步骤1: 阅读PTOISA_zh.md
↓
步骤2: 分析算子需求,列举ISA指令
↓
步骤3: 按数据流顺序解释指令功能
↓
步骤4: 输出kernel代码实现

步骤详解

步骤1: 阅读PTOISA_zh.md文档

目标: 全面了解PTO-ISA指令集,识别可能与算子相关的指令类别。

行动:

  1. 阅读文档路径: pto-isa/docs/PTOISA_zh.md
  2. 重点关注指令索引表,识别以下类别的指令:
  • 内存指令: TLOAD, TSTORE, TPREFETCH (GM <-> Tile数据搬运)
  • 逐元素计算: TADD, TSUB, TMUL, TDIV, TMAX, TMIN (Tile-Tile操作)
  • 标量操作: TADDS, TSUBS, TMULS, TDIVS (Tile-标量操作)
  • 数学函数: TLOG, TEXP, TSQRT, TRSQRT, TPOW (数学运算)
  • 激活函数: TRELU, TPRELU, TLRELU (激活操作)
  • 轴归约/扩展: TROWSUM, TCOLSUM, TROWMAX, TCOLMAX (轴操作)
  • 广播操作: TROWEXPANDADD, TCOLEXPANDADD (广播加法)
  • 类型转换: TCVT (类型转换)
  • 选择操作: TSEL, TSELS (条件选择)
  • 矩阵操作: TMATMUL, TGEMV (矩阵计算)
  1. 记录每个相关指令的:
  • 指令名称
  • 功能描述
  • 所属类别
  • 适用场景

输出: 相关ISA指令列表

步骤2: 整理并列举需要使用的ISA指令

目标: 根据算子功能需求,确定具体的ISA指令组合。

分析框架:

2.1 算子功能分解

将算子功能分解为基本操作:

算子类型分解步骤典型指令
激活函数输入加载 + 计算 + 输出存储TLOAD + TEXP/TLOG/TRELU + TSTORE
归约操作输入加载 + 归约 + 输出存储TLOAD + TROWSUM/TCOLSUM + TSTORE
逐元素运算输入加载 + 运算 + 输出存储TLOAD + TADD/TSUB/TMUL/TDIV + TSTORE
广播操作输入加载 + 广播 + 运算 + 存储TLOAD + TROWEXPANDADD + TSTORE
矩阵运算(Cube)输入加载 + 数据搬运 + 矩阵乘 + 输出存储TLOAD + TMOV + TMATMUL + TSTORE (GM→L1→L0A/L0B→L0C→GM)
类型转换输入加载 + 转换 + 输出存储TLOAD + TCVT + TSTORE
条件运算输入加载 + 比较 + 选择 + 存储TLOAD + TCMP + TSEL + TSTORE
2.2 ISA指令选择原则

最小化原则: 使用最少的指令完成功能,减少数据搬运。

数据流优化:

  • Vector计算: 遵循 gm → ub → vector → ub → gm 的基本数据流
  • Cube计算(矩阵乘): 遵循 GM → L1 → L0A/L0B → L0C → GM 的矩阵数据流

同步考虑: 指令间使用Event同步或手动标志同步。

示例:

算子: GELU激活函数
GELU(x) = x * Φ(x) ≈ 0.5 * x * (1 + tanh(sqrt(2/π) * (x + 0.044715 * x^3)))
指令选择:
1. TLOAD: 从GM加载输入x到UB
2. TMUL: 计算 x^3 (x * x * x)
3. TMULS: 计算 0.044715 * x^3 (标量乘法)
4. TADD: 计算 x + 0.044715 * x^3
5. TMULS: 计算 sqrt(2/π) * (x + ...) (标量乘法)
6. TEXP/TLOG: 计算tanh函数 (可选,或使用近似)
7. TADD: 计算 1 + tanh(...)
8. TMULS: 计算 0.5 * (结果) (标量乘法)
9. TMUL: 计算 x * 最终结果
10. TSTORE: 将结果从UB存储到GM

输出: 按执行顺序排列的ISA指令列表

步骤3: 按数据处理顺序详细解释指令功能

目标: 详细说明每个指令在数据流中的作用。

数据流框架:

Vector计算数据流
数据流向: gm → ub → vector → ub → gm
阶段1: GM → UB (数据加载,使用TLOAD)
阶段2: UB → Vector (计算准备)
阶段3: Vector计算 (核心计算,使用TADD/TMUL/TEXP等)
阶段4: Vector → UB (计算结果)
阶段5: UB → GM (数据存储,使用TSTORE)
Cube计算数据流 (矩阵乘)
数据流向: GM → L1 → L0A/L0B → L0C → GM
阶段1: GM → L1 (矩阵数据加载,使用TLOAD)
阶段2: L1 → L0A/L0B (数据搬运到矩阵计算单元,使用TMOV)
阶段3: Cube计算 (矩阵乘法,使用TMATMUL,结果到L0C)
阶段4: L0C → GM (计算结果存储,使用TSTORE)

关键区别:

  • Vector计算: 使用UB(Unified Buffer)作为中间缓冲区,执行逐元素操作
  • Cube计算: 使用L1和L0缓冲区(L0A/L0B/L0C),执行矩阵乘法操作
3.1 指令功能解释模板

对每个指令,按以下模板解释:

指令: [指令名称]
阶段: [GM/UB/Vector阶段]
功能: [具体功能描述]
数据流: [输入 → 输出的数据流向]
示例: [具体使用示例]
同步需求: [是否需要同步,如何同步]
3.2 阶段详解

阶段1: GM → UB (数据加载)

指令: TLOAD
功能: 从GlobalTensor (GM) 加载数据到Tile (UB)
数据流: GlobalMemory[srcGlobal] → UnifiedBuffer[srcTile]
输入: GlobalTensor对象,描述GM上的数据布局
输出: Tile对象,存储加载到UB的数据
同步需求:
- 推荐使用Event同步: Event<Op::TLOAD, Op::NextOp>
- 或手动同步: set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0)
示例:
TLOAD(srcTile, srcGlobal);
event0 = TLOAD(src1Tile, src1Global); // 带Event返回

阶段2/3: Vector计算 (核心计算)

根据具体算子,选择相应的计算指令:

逐元素加法: TADD
功能: 两个Tile的逐元素加法
数据流: UB[src0Tile] + UB[src1Tile] → UB[dstTile]
输入: 两个源Tile
输出: 一个目标Tile
同步需求: Event<Op::TLOAD, Op::TADD>
示例:
event1 = TADD(dstTile, src0Tile, src1Tile, event0);
标量乘法: TMULS
功能: Tile与标量的逐元素乘法
数据流: UB[srcTile] * scalar → UB[dstTile]
输入: 一个源Tile + 一个标量值
输出: 一个目标Tile
同步需求: Event<Op::PreviousOp, Op::TMULS>
示例:
event2 = TMULS(dstTile, srcTile, (T)scalar, event1);
指数运算: TEXP
功能: Tile的逐元素指数运算 (e^x)
数据流: exp(UB[srcTile]) → UB[dstTile]
输入: 一个源Tile
输出: 一个目标Tile
同步需求: Event<Op::PreviousOp, Op::TEXP>
示例:
event3 = TEXP(dstTile, srcTile, event2);
最大值选择: TMAX
功能: 两个Tile的逐元素最大值
数据流: max(UB[src0Tile], UB[src1Tile]) → UB[dstTile]
输入: 两个源Tile
输出: 一个目标Tile
同步需求: Event<Op::PreviousOp, Op::TMAX]
示例:
event4 = TMAX(dstTile, src0Tile, src1Tile, event3);

Cube计算阶段: 矩阵乘法 (GM → L1 → L0A/L0B → L0C → GM)

矩阵乘法: TMATMUL
功能: 矩阵乘法计算 C = A * B
数据流:
- GM → L1: GlobalMemory[矩阵A/B] → L1Buffer[MatTile] (TLOAD)
- L1 → L0A/L0B: L1Buffer[MatTile] → L0Buffer[Left/RightTile] (TMOV)
- L0A/L0B → L0C: 矩阵乘法计算 (TMATMUL)
- L0C → GM: L0Buffer[AccTile] → GlobalMemory[结果] (TSTORE)
输入: 矩阵A和B (通过MatTile加载)
输出: 矩阵C (通过AccTile存储)
同步需求:
- TLOAD完成后: Event<Op::TLOAD, Op::TMOV> 或 set_flag(PIPE_MTE2, PIPE_MTE1)
- TMOV完成后: Event<Op::TMOV, Op::TMATMUL> 或 set_flag(PIPE_MTE1, PIPE_M)
- TMATMUL完成后: Event<Op::TMATMUL, Op::TSTORE_VEC> 或 set_flag(PIPE_M, PIPE_FIX)
示例:
// 1. 加载矩阵到L1
TLOAD(aMatTile, src0Global);
TLOAD(bMatTile, src1Global);
// 2. 搬运数据到L0A/L0B
#ifndef __PTO_AUTO__
set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0);
wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0);
#endif
TMOV(aTile, aMatTile);
TMOV(bTile, bMatTile);
// 3. 矩阵乘法计算
#ifndef __PTO_AUTO__
set_flag(PIPE_MTE1, PIPE_M, EVENT_ID0);
wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID0);
#endif
TMATMUL(cTile, aTile, bTile);
// 4. 存储结果
#ifndef __PTO_AUTO__
set_flag(PIPE_M, PIPE_FIX, EVENT_ID0);
wait_flag(PIPE_M, PIPE_FIX, EVENT_ID0);
#endif
TSTORE(dstGlobal, cTile);

阶段5: UB → GM (数据存储)

指令: TSTORE
功能: 将Tile数据存储到GlobalTensor (GM)
数据流: UnifiedBuffer[dstTile] → GlobalMemory[dstGlobal]
输入: Tile对象,UB上的数据
输出: GlobalTensor对象,GM上的数据
同步需求:
- 推荐使用Event同步: Event<Op::LastOp, Op::TSTORE_VEC>
- 或手动同步: set_flag(PIPE_V, PIPE_MTE3, EVENT_ID0)
示例:
TSTORE(dstGlobal, dstTile, eventLast);

输出: 按数据流顺序的完整指令功能解释文档

步骤4: 输出kernel代码实现

目标: 生成完整的、可运行的kernel代码。

代码结构:

cpp
/**
Copyright (c) 2025 Huawei Technologies Co., Ltd.
...
*/
#include <pto/pto-inst.hpp>
#include "acl/acl.h"
using namespace pto;
namespace OperatorName {
// ==================== Device函数 ====================
template <typename T, int kTRows_, int kTCols_, int vRows, int vCols>
__global__ AICORE void runOperator(__gm__ T *out, __gm__ T *src0, ...)
{
// 1. 类型定义
using DynShapeDim5 = Shape<1, 1, 1, vRows, vCols>;
using DynStrideDim5 = Stride<1, 1, 1, vCols, 1>;
using GlobalData = GlobalTensor<T, DynShapeDim5, DynStrideDim5>;
using TileData = Tile<TileType::Vec, T, kTRows_, kTCols_, BLayout::RowMajor, -1, -1>;
// 2. Tile和GlobalTensor声明
TileData src0Tile(vRows, vCols);
TileData dstTile(vRows, vCols);
TASSIGN(src0Tile, 0x0);
TASSIGN(dstTile, sizeof(T) * TileData::Numel);
GlobalData src0Global(src0);
GlobalData dstGlobal(out);
// 3. Event声明 (推荐使用Event同步)
Event<Op::TLOAD, Op::CALC_OP> event0;
Event<Op::CALC_OP, Op::TSTORE_VEC> event1;
// 4. 数据加载 (gm → ub)
event0 = TLOAD(src0Tile, src0Global);
// 5. 核心计算 (vector计算)
event1 = CALC_OP(dstTile, src0Tile, ..., event0);
// 6. 数据存储 (ub → gm)
TSTORE(dstGlobal, dstTile, event1);
out = dstGlobal.data();
}
// ==================== Host函数 ====================
template <typename T, int kTRows_, int kTCols_, int vRows, int vCols>
void launchOperator(T *out, T *src0, ..., void *stream)
{
if constexpr (std::is_same_v<T, aclFloat16>) {
runOperator<half, kTRows_, kTCols_, vRows, vCols>
<<<1, nullptr, stream>>>((half *)out, (half *)src0, ...);
} else {
runOperator<T, kTRows_, kTCols_, vRows, vCols><<<1, nullptr, stream>>>(out, src0, ...);
}
}
// ==================== 模板实例化 ====================
template void launchOperator<float, 64, 64, 64, 64>(float *out, float *src0, ..., void *stream);
template void launchOperator<aclFloat16, 16, 256, 16, 256>(aclFloat16 *out, aclFloat16 *src0, ..., void *stream);
} // namespace OperatorName

代码生成要点:

  1. 命名规范: kernel文件命名为 t<操作指令>_kernel.cpp
  2. 模板参数: T (数据类型), kTRows_, kTCols_ (Tile维度), vRows, vCols (有效数据维度)
  3. 类型转换: aclFloat16需要转换为half类型
  4. 缓冲区分配: 使用TASSIGN紧密排布Tile地址
  5. 同步策略: 推荐使用Event同步,备选手动标志同步
  6. 模板实例化: 为常用配置提供实例化

输出: 完整的kernel代码文件

ISA指令分类参考

内存指令 (GM <-> Tile)
指令功能数据流适用场景
TLOADGM → UB/L1GlobalMemory → UnifiedBuffer/L1BufferVector和Cube计算
TSTOREUB/L0C → GMUnifiedBuffer/L0Buffer → GlobalMemoryVector和Cube计算
TPREFETCH预取到UB缓存提示性预取Vector计算优化
MGATHER索引收集加载GM[索引] → UBVector计算
MSCATTER索引散播存储UB → GM[索引]Vector计算

注意:

  • TLOAD可以加载到UB (Vector计算) 或L1Buffer (Cube计算)
  • TSTORE可以存储UB (Vector计算) 或L0C (Cube计算) 的数据
逐元素计算指令 (Tile-Tile)
指令功能表达式
TADD逐元素加法dst = src0 + src1
TSUB逐元素减法dst = src0 - src1
TMUL逐元素乘法dst = src0 * src1
TDIV逐元素除法dst = src0 / src1
TMAX逐元素最大值dst = max(src0, src1)
TMIN逐元素最小值dst = min(src0, src1)
TCMP比较(生成掩码)predicate = cmp(src0, src1)
TSHL逐元素左移dst = src0 << src1
TSHR逐元素右移dst = src0 >> src1
TAND逐元素按位与dst = src0 & src1
TOR逐元素按位或dst = src0src1
TXOR逐元素按位异或dst = src0 ^ src1
TNOT逐元素按位取反dst = ~src
标量操作指令 (Tile-标量)
指令功能表达式
TADDSTile加标量dst = src + scalar
TSUBSTile减标量dst = src - scalar
TMULSTile乘标量dst = src * scalar
TDIVSTile除标量dst = src / scalar
TMINSTile与标量最小值dst = min(src, scalar)
TMAXSTile与标量最大值dst = max(src, scalar)
TCMPSTile与标量比较predicate = cmp(src, scalar)
TEXPANDS标量广播到Tiledst = broadcast(scalar)
数学函数指令
指令功能表达式
TLOG自然对数dst = log(src)
TEXP指数运算dst = exp(src)
TSQRT平方根dst = sqrt(src)
TRSQRT倒数平方根dst = 1/sqrt(src)
TPOW幂运算dst = src0 ^ src1
TRECIP倒数dst = 1/src
TABS绝对值dst = abs(src)
TNEG取负dst = -src
激活函数指令
指令功能表达式
TRELUReLUdst = max(0, src)
TPRELUPReLUdst = max(0, src) + slope * min(0, src)
TLRELULeaky ReLU (标量斜率)dst = max(0, src) + scalar * min(0, src)
轴归约/扩展指令
指令功能操作
TROWSUM行求和每行所有列求和
TROWPROD行乘积每行所有列乘积
TROWMAX行最大值每行所有列最大值
TROWMIN行最小值每行所有列最小值
TROWARGMAX行argmax每行最大值列索引
TROWARGMIN行argmin每行最小值列索引
TCOLSUM列求和每列所有行求和
TCOLPROD列乘积每列所有行乘积
TCOLMAX列最大值每列所有行最大值
TCOLMIN列最小值每列所有行最小值
TCOLARGMAX列argmax每列最大值行索引
TCOLARGMIN列argmin每列最小值行索引
TROWEXPAND行广播将行首元素广播到整行
TCOLEXPAND列广播将列首元素广播到整列
广播运算指令
指令功能操作
TROWEXPANDADD行广播加法每行 + 广播标量向量
TROWEXPANDSUB行广播减法每行 - 广播标量向量
TROWEXPANDMUL行广播乘法每行 * 广播标量向量
TROWEXPANDDIV行广播除法每行 / 广播标量向量
TROWEXPANDMAX行广播最大值max(每行, 广播标量向量)
TROWEXPANDMIN行广播最小值min(每行, 广播标量向量)
TROWEXPANDEXPDIF行指数差exp(每行 - 广播标量向量)
TCOLEXPANDADD列广播加法每列 + 广播标量向量
TCOLEXPANDSUB列广播减法每列 - 广播标量向量
TCOLEXPANDMUL列广播乘法每列 * 广播标量向量
TCOLEXPANDDIV列广播除法每列 / 广播标量向量
TCOLEXPANDMAX列广播最大值max(每列, 广播标量向量)
TCOLEXPANDMIN列广播最小值min(每列, 广播标量向量)
TCOLEXPANDEXPDIF列指数差exp(每列 - 广播标量向量)
数据搬运指令 (缓冲区数据移动)

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 90 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
58
Repository forks
40
7-day trend score
20

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/hw-native-sys/pto-isa/pto-isa-operator-implementation/badge)](https://verified-skill.com/skills/hw-native-sys/pto-isa/pto-isa-operator-implementation)

Something wrong with this skill or its page? Tell us.