ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

CANN PTO-ISA ConvTile 编程模型:卷积算子的片上 Tile 计算单元与地址绑定实战

CANN PTO-ISA ConvTile 编程模型:卷积算子的片上 Tile 计算单元与地址绑定实战 CANN PTO-ISA ConvTile 编程模型卷积算子的片上 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-isaConvTile 是 PTOParallel Tile Operation指令集中面向卷积类算子的固定容量 2D~6D 片上缓冲对象既是卷积计算的最小计算单元也是TLOAD/TSTORE等数据搬运指令的主要操作对象。本文基于docs/coding/ConvTile_zh.md并结合 pto_tile.hpp 源码与 TASSIGN 指令文档完整讲解pto::ConvTile的类型定义、布局与形状约束、地址绑定机制以及一段可直接编译运行的最小示例帮助你用 PTO 编写第一个卷积类内核。ConvTile 表示什么从概念上说ConvTile驻留在片上 Tile 存储中类似寄存器文件或片上 SRAM并通过TLOAD/TSTORE与全局内存GM之间搬运数据。与通用的二维Tile不同ConvTile支持 2 到 6 个维度专门服务于卷积类算子的多维度数据布局如 batch、通道、高度、宽度等。一个ConvTile主要由五类属性定义属性说明示例位置LocationTile 所属的逻辑存储类别矩阵/立方寄存器等TileType::Mat、TileType::Vec元素类型Element type标量元素类型float、half、int8_t等缓冲区大小Buffer sizeConvTile的静态缓冲容量4096元素个数布局Layout指导 lowering 与目标相关优化路径NCHW、NHWC、NC1HWC0等形状Shapepto::ConvTileShape...支持最多 6 个维度ConvTileShape1, 1, 16, 16, 16这些属性的具体承载形式就是下文的 C 模板类型pto::ConvTile其定义位于 include/pto/common/pto_tile.hpp。pto::ConvTile类型ConvTile通过 C 模板类型声明模板参数依次对应上述五类属性pto::ConvTile pto::TileType Loc_, // 位置Tile 的逻辑/物理存储类别 Element_, // 元素类型标量类型 BufferSize_, // 静态容量 pto::Layout_ layout, // 布局枚举 pto::ConvTileShape Shape_ // 形状最多 6 维 ;从源码看pto_tile.hppConvTile结构体将这些模板参数公开为编译期常量供后续指令特化使用template TileType Loc_, typename Element_, const int BufferSize_, Layout Layout_, typename Shape_ struct ConvTile { using DType Element_; // 元素类型 using ShapeType Shape_; // 形状类型 static constexpr TileType Loc Loc_; // 位置 static constexpr int bufferSize BufferSize_; // 静态容量 static constexpr Layout layout Layout_; // 布局 ... };位置TileTypeTileType表示 Tile 的逻辑/物理存储类别同时参与指令重载选择和编译期检查。ConvTile常见的合法位置包括TileType::Vec向量 Tile 存储UB / 向量流水线。TileType::Mat通用矩阵 Tile 存储矩阵 L1。每条指令允许使用哪些位置应以 docs/isa/ 下对应指令文档为准。例如TLOAD指令文档会说明其源/目的 Tile 的合法TileType组合。容量BufferSize_BufferSize_定义了 Tile 对象的静态容量以元素个数计。多数指令要求 Tile 具备静态形状以便在编译期进行特化和优化。ConvTile在声明时通过static_assert限制形状维数见源码 pto_tile.hppstatic constexpr int totalDimCount ShapeType::totalDimCount; static_assert( totalDimCount 1 totalDimCount ConvTileDetail::MAX_CONVTILE_DIM, ConvTile only support 1D~6D Shapes!);即ConvTile仅支持 1D~6D 形状越界会在编译期直接报错。布局pto::LayoutConvTile包含一个布局枚举。文档中列举了卷积场景最常用的几种NCHWNHWCNC1HWC0FRACTAL_ZFRACTAL_Z_S16S8在源码 type.hpp 中可以看到完整的Layout枚举除上述卷积布局外还包括ND行主序、DN列主序、NZcube 分形、GNC1HWC0、GNCHW、NDC1HWC0、NCDHW、FRACTAL_Z_3D以及 MX/HIF4 系列的专用布局MX_A_ZZ、MX_B_NN、HIF4_A_ZZ、HIF4_B_NN等。布局信息会影响后端实现、lowering 路径以及特定目标上的快速路径选择。形状pto::ConvTileShapepto::ConvTileShape...Shapes支持 1 到 6 个整型模板参数。每个维度既可以是编译期常量也可以是pto::DYNAMIC即-1定义见 pto_tile.hpp。静态维度保存在类型信息中可通过ConvTileShape::staticShape[dim]获取。动态维度保存在运行时对象ConvTileShape::shape[dim]中并由ConvTileShape(...)构造函数赋值。源码中ConvTileShape的实现pto_tile.hpp提供了staticShape6 个维度的编译期数组、dynamicDimCount动态维度数量以及 1~6 参数的构造函数。构造函数通过static_assert检查运行时传入参数个数是否与动态维度数量一致例如PTO_INTERNAL ConvTileShape(int64_t n) { static_assert( dynamicDimCount 1, 1-parameter constructors is only applicable to Shape with 1 dynamic dimension.); ... }因此若构造参数不匹配例如形状声明了 2 个动态维度却只传 1 个运行参数会在编译期报错。此外ConvTile还提供了SetDynamicShape成员pto_tile.hpp用于在内核运行时按需设置动态维度同样以static_assert校验参数个数与类型template typename... Ints PTO_INTERNAL void SetDynamicShape(Ints... vals) { static_assert(sizeof...(vals) dynamicDimCount, Number of dynamic values does not match dynamic dimension count!); static_assert((std::is_same_vInts, int64_t ...), Dynamic values must be int64_t type!); ... }卷积元数据ConvTile 的隐藏字段除模板参数外源码中的ConvTile结构体还携带一组运行时卷积元数据pto_tile.hpp用于在手动放置流程中描述卷积计算的窗口参数是编写卷积内核时常用的配套接口字段类型默认值含义fmapH_/fmapW_uint16_t0特征图feature map高/宽padList_[4]uint8_t{0,0,0,0}四方向 paddingfilterH_/filterW_uint16_t1卷积核高/宽dilationH_/dilationW_uint16_t1膨胀率strideH_/strideW_uint16_t1卷积步长padValue_DType0padding 填充值channelSize_uint16_t0通道数repeatStride_/repeatTime_/repeatMode_uint16_t/uint8_t0 / 1 / 0指令 repeat 相关参数dstStride_/dstMposition_uint16_t0目标 stride / M 位置A2A3 架构除外transpose_boolfalse是否转置smallChannel_boolfalse小通道模式对应的GetXxx/SetXxx接口如SetFmapH、SetPadList、SetFilterH、SetStrideH、SetPadValue、SetTranspose等均已声明为PTO_INTERNAL可直接在 PTO Lib 内核代码中调用。地址绑定TASSIGN在手动放置流程中TASSIGN(tile, addr)用于把一个ConvTile对象绑定到实现定义的片上地址在自动模式定义了__PTO_AUTO__下TASSIGN(tile, addr)可能被处理为 no-op。具体约束参考 docs/isa/TASSIGN.md。两种调用形式形式一运行时地址不做编译期越界检查地址值在编译期不可知template typename T, typename AddrType PTO_INST void TASSIGN(T obj, AddrType addr);形式二编译期地址带静态越界检查Addr是非类型模板参数编译器通过static_assert执行检查template std::size_t Addr, typename T PTO_INST void TASSIGN(T obj);编译期检查项形式二会触发以下编译期检查断言 ID 对应 docs/coding/debug_zh.md 中的修复配方FIX-A12检查条件断言 ID错误信息内存空间存在capacity 0SA-0351Memory space is not available on this architecture.Tile 放得下tile_size capacitySA-0352Tile storage size exceeds memory space capacity.地址不越界Addr tile_size capacitySA-0353addr tile_size exceeds memory space capacity (out of bounds).地址对齐Addr % alignment 0SA-0354addr is not properly aligned for the target memory space.内存空间、容量与对齐内存空间、容量和对齐由 Tile 的TileType即Loc模板参数自动确定各架构的默认容量见下表A2A3 / A5 / Kirin9030 / KirinX90对齐均为 32 BTileType内存A2A3A5Kirin9030KirinX90对齐VecUB192KB256KB128KB128KB32 BMatL1512KB512KB512KB1024KB32 BLeftL0A64KB64KB32KB64KB32 BRightL0B64KB64KB32KB64KB32 BAccL0C128KB256KB64KB128KB32 BBiasBias1KB4KB1KB1KB32 BScalingFBuffer2KB4KB7KB6KB32 BScaleLeftL0AN/A4KBN/AN/A32 BScaleRightL0BN/A4KBN/AN/A32 B容量可在构建时通过-D宏覆盖例如-DPTO_UBUF_SIZE_BYTES262144参见 include/pto/common/buffer_limits.hpp。注意该编译期检查重载仅对Tile与ConvTile类型可用对于GlobalTensor应使用TASSIGN(obj, pointer)形式一。约束若obj是 Tile含ConvTile手动模式未定义__PTO_AUTO__addr必须是整型并被重新解释为 Tile 的存储地址。自动模式定义了__PTO_AUTO__TASSIGN(tile, addr)为 no-op。若obj是GlobalTensoraddr必须是指针类型且指向的元素类型必须与GlobalTensor::DType匹配。地址绑定示例运行时地址不做编译期检查#include pto/pto-inst.hpp using namespace pto; void example_runtime() { using TileT TileTileType::Vec, float, 16, 16; TileT a, b, c; TASSIGN(a, 0x1000); TASSIGN(b, 0x2000); TASSIGN(c, 0x3000); TADD(c, a, b); }编译期地址带静态越界检查void example_checked() { using TileT TileTileType::Vec, float, 16, 16; TileT a, b, c; TASSIGN0x0000(a); // OK: 0x0000 1024 192KB TASSIGN0x0400(b); // OK: 0x0400 1024 192KB TASSIGN0x0800(c); // OK: 0x0800 1024 192KB TADD(c, a, b); }越界示例触发 SA-0352 / SA-0353// TileVec, float, 256, 256 占用 256*256*4 256KB using BigTile TileTileType::Vec, float, 256, 256; BigTile t; TASSIGN0x0(t); // 主要触发 [SA-0352]tile_size(256KB) UB 容量(192KB, A2A3)最小示例下面是一个完整的 ConvTile 使用示例声明一个NC1HWC0布局、形状为1, 1, 16, 16, 16的Mat位置half类型 ConvTile构造对应的GlobalTensor视图先TASSIGN绑定片上地址再通过TLOAD从全局内存加载数据#include pto/pto-inst.hpp using namespace pto; void example(__gm__ half* in, __gm__ half* out) { using TileT ConvTileTileType::Mat, half, 4096, Layout::NC1HWC0, pto::ConvTileShape1, 1, 16, 16, 16; using GShape Shape1, 1, 16, 16, 16; using GStride Stride1 * 16* 16* 16, 16* 16* 16, 16 * 16, 16, 1; using GT GlobalTensorhalf, GShape, GStride, Layout::NC1HWC0; GT gin(in); TileT tile5d; TASSIGN(tile5d, 0x0); TLOAD(tile5d, gin); }几点说明TileT的BufferSize_4096对应形状1*1*16*16*16 4096个half元素即该 Tile 的静态容量bufferSize以元素个数计最终占用的字节数需乘以sizeof(half)。GShape/GStride定义了全局内存视图的形状与各维 strideGStride的第一个维度1*16*16*16表示 batch 维步长逐维递减直至最内层1。GlobalTensor的详细语义参见 GlobalTensor_zh.md。TASSIGN(tile5d, 0x0)在手动模式下把 Tile 绑定到片上地址0x0此处为演示实际应结合上文容量表规划地址布局避免越界与未对齐。TLOAD(tile5d, gin)完成 GM 到片上 Tile 的数据搬运TSTORE则负责反向写回。两个指令的完整语义见 TLOAD.md 与 TSTORE.md。与相关概念的衔接与Tile的关系ConvTile与通用二维Tile见 Tile_zh.md同属于 PTO 的片上缓冲抽象共享TileType、TASSIGN等机制区别在于ConvTile面向卷积场景支持最多 6 维形状并携带卷积元数据字段。与GlobalTensor的关系GlobalTensor是全局内存GM的轻量级视图ConvTile通过TLOAD/TSTORE与GlobalTensor之间交换数据见 GlobalTensor_zh.md。编程模型上下文Auto/Manual 两种开发风格、SPMD/MPMD 执行模型等背景概念可参考 ProgrammingModel_zh.md抽象执行模型见 abstract-machine_zh.md。进一步阅读ConvTile 英文原版PTO 卷积类指令总览逐条指令的 TileType 合法性、布局要求与数据流语义TASSIGN 指令详解含全部编译期检查项与各架构容量表include/pto/common/pto_tile.hppConvTile/ConvTileShape/Shape/Stride完整实现include/pto/common/type.hppLayout枚举全集include/pto/common/constants.hppC0_SIZE_BYTE、FRACTAL_NZ_ROW、MX_ROW_LEN等布局常量【免费下载链接】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),仅供参考
返回列表