Summary
当前VPTO IR设计暴露过多A5特有硬件设计细节,用户难以理解和使用
Motivation / use case
背景(Background)
当前 VPTO/PTODSL 的向量指令 IR 设计直接暴露了 A5 硬件微架构的大量底层细节,用户在编写向量侧代码时必须手动处理以下复杂概念:
1. 访存分布模式(dist tokens)
pto.vlds / pto.vsts 需要用户指定字符串形式的 dist(distribution)属性来控制 UB 内存与 vreg 之间的字节映射方式。仅 load 侧就有 10+ 种:
| dist token |
含义 |
NORM |
连续加载 |
BRC_B8 / BRC_B16 / BRC_B32 |
广播单个元素到所有 lane |
US_B8 / US_B16 |
上采样 |
DS_B8 / DS_B16 |
下采样 |
UNPK_B8 / UNPK_B16 / UNPK_B32 |
解包 |
UNPK4 |
4 路解包 |
BRC_BLK |
块复制 |
E2B_B16 / E2B_B32 |
元素组到字节 lane 展开 |
SPLT4CHN / SPLT2CHN_B8 / SPLT2CHN_B16 |
通道分离 |
Store 侧还有 NORM_B*、1PT_B*、PK_B*、PK4_B32、MRG4CHN_B8、MRG2CHN_B* 等。Dual load/store(vldsx2/vstsx2)还有 DINTLV_B*、BDINTLV、INTLV_B* 等。
用户必须根据数据类型和访问模式手工选择正确的 dist token,且后缀(B8/B16/B32)必须与 vreg 元素宽度匹配,否则运行时行为错误或 IR 验证失败。
2. Mask 粒度约束
!pto.mask<G> 的粒度参数 G(b8/b16/b32)必须与操作向量的元素类型精确对应:
!pto.vreg<64xf32> → !pto.mask<b32>
!pto.vreg<128xf16> → !pto.mask<b16>
!pto.vreg<256xi8> → !pto.mask<b8>
三者对应同一物理寄存器(256-bit),但用户被迫在每一步都正确选择粒度。
3. 非对齐访问状态机
非对齐向量存取要求用户显式管理 !pto.align SSA 状态:
%a0 = pto.vldas %base // 初始化对齐状态
%v0, %a1 = pto.vldus %base, %a0 // 消费对齐状态,产生新状态
%v1, %a2 = pto.vldus %base, %a1
...
pto.vstus %aN, %offset, %value // 冲刷对齐状态
这在 MLIR 标准 dialect 中完全没有对应物,是纯硬件实现细节。
4. 地址空间枚举
!pto.ptr<T, space> 有 9 种地址空间:GM、UB(VEC)、MAT、LEFT、RIGHT、ACC、BIAS、SCALING、Zero。用户为每个指针选择正确的地址空间。
5. DMA 配置
pto.mte_gm_ub 等 DMA 操作接受 11+ 个裸 i64 操作数来描述多级循环、stride、padding,是寄存器传输级的接口。
6. 其他硬件模式
- Cube Fractal 布局:
CubeLoadFracMode(ND2NZ / DN2NZ)和 AccStoreMode(NZ2ND / NZ2DN / NZ2NZ)控制 NZ fractal 物理布局与逻辑布局之间的映射
- Cache 策略:L2 cache 的 15+ 种策略变体(non-temporal、write-back、write-through 等)
- 累加器存储量化:
AccStoreQuantPreMode 37 种预量化模式
- 同步:
set_flag / wait_flag 需手写 pipeline ID 和 event ID
本质问题
这些细节对于算法开发者来说是意外的复杂度(accidental complexity)。用户想表达的只是一个语义清晰的向量操作(如"从内存加载 64 个 f32"),却被要求指定 dist 模式、mask 粒度、地址空间等硬件实现细节。这与 MLIR Vector Dialect 的简洁语义形成鲜明对比:
// MLIR Vector Dialect — 用户想表达的
%v = vector.load %memref[%idx] : memref<256xf32>, vector<64xf32>
// VPTO — 用户被迫写的
%v = pto.vlds %ptr, %offset dist("NORM") : !pto.ptr<f32, #pto.address_space<UB>>, !pto.vreg<64xf32>
目标方案(Proposed Solution)
PTOAS/PTODSL 提供一套接近 MLIR Vector Dialect 语义的向量指令支持,让用户用高层语义编写向量计算,由编译器负责将标准 Vector Dialect IR lowering 为 VPTO 硬件指令。
用户算法意图(高层语义)
↓ PTODSL pto.vec.xxx API / 直接编写 Vector Dialect IR
MLIR Vector Dialect IR(标准语义,可复用 MLIR 生态)
↓ PTOAS vector-to-vpto lowering pass
VPTO 硬件指令(dist 选择、mask 粒度匹配、对齐状态机等由编译器自动处理)
编译器侧需自动完成的关键决策:
| 用户表达 |
编译器自动推导 |
vector.load %buf[%i] : vector<64xf32> |
dist=NORM, space=UB, mask=b32 |
vector.load with strided pattern |
dist=SPLT2CHN 或 UNPK 等 |
vector.mask |
自动选择 mask 粒度 |
vector.store to packed format |
dist=PK_B* |
| unaligned access |
自动插入 vldas/vldus/vstus 状态机 |
任务分解(Task Breakdown)
任务 1:PTODSL 提供 pto.vec 简化接口层
- 目标:设计并实现一套对齐 MLIR Vector Dialect 语义的
pto.vec.* Python API
- 范围:
pto.vec.load / pto.vec.store — 向量内存读写,隐藏 dist/mask/align 细节
pto.vec.masked_load / pto.vec.masked_store — 带 mask 的向量存取
pto.vec.reduce — 归约操作(add、max、min 等)
pto.vec.broadcast / pto.vec.splat — 广播/填充
pto.vec.transpose — 转置
pto.vec.contract — 收缩/矩阵乘
pto.vec.elementwise — 逐元素运算(add、mul、exp、div 等)
- codegen 目标:直接生成标准 MLIR Vector Dialect IR(不生成 PTO 自定义 dialect)
任务 2:PTOAS 支持 Vector Dialect 输入并 lowering 到 VPTO
- 目标:在 PTOAS 编译管线中新增一条路径,接受 MLIR Vector Dialect 作为输入
- 范围:
ptoas CLI 支持 Vector Dialect 输入(或自动检测)
- 实现
VectorToVPTO lowering pass:
- 根据数据类型和访问模式自动选择正确的
dist token
- 自动匹配 mask 粒度
- 自动插入对齐状态机(vldas/vldus/vstus)
- 自动选择地址空间
- 与现有 VPTO 后端(
VPTOLLVMEmitter)对接
- 验收标准:
- Vector Dialect IR 可被
ptoas 编译为可运行的 VPTO 代码
- lit 测试覆盖:
vector.load/store、masked 变体、reduction、broadcast、contract 等
非目标(Non-Goals)
- 不改变现有 VPTO 指令 IR 的语义或行为(新路径为增量功能)
- 不要求 cube 侧(PTO dialect)改用 vector dialect
- 不在此 issue 中解决 Vector Dialect → EmitC 后端 lowering(可后续跟进)
相关参考
- MLIR Vector Dialect 文档:https://mlir.llvm.org/docs/Dialects/Vector/
- VPTO 指令规范:
docs/vpto-spec.md
- 向量 load/store ISA 详细文档:
docs/isa/micro-isa/03-vector-load-store.md
- PTODSL 当前 VPTO 绑定:
ptodsl/ptodsl/_ops.py、ptodsl/ptodsl/_surface_types.py
- VPTO ODS 定义:
include/PTO/IR/VPTOOps.td
Proposed API / behavior
No response
Alternatives considered
No response
Additional context
No response
Summary
当前VPTO IR设计暴露过多A5特有硬件设计细节,用户难以理解和使用
Motivation / use case
背景(Background)
当前 VPTO/PTODSL 的向量指令 IR 设计直接暴露了 A5 硬件微架构的大量底层细节,用户在编写向量侧代码时必须手动处理以下复杂概念:
1. 访存分布模式(
disttokens)pto.vlds/pto.vsts需要用户指定字符串形式的dist(distribution)属性来控制 UB 内存与 vreg 之间的字节映射方式。仅 load 侧就有 10+ 种:NORMBRC_B8/BRC_B16/BRC_B32US_B8/US_B16DS_B8/DS_B16UNPK_B8/UNPK_B16/UNPK_B32UNPK4BRC_BLKE2B_B16/E2B_B32SPLT4CHN/SPLT2CHN_B8/SPLT2CHN_B16Store 侧还有
NORM_B*、1PT_B*、PK_B*、PK4_B32、MRG4CHN_B8、MRG2CHN_B*等。Dual load/store(vldsx2/vstsx2)还有DINTLV_B*、BDINTLV、INTLV_B*等。用户必须根据数据类型和访问模式手工选择正确的 dist token,且后缀(B8/B16/B32)必须与 vreg 元素宽度匹配,否则运行时行为错误或 IR 验证失败。
2. Mask 粒度约束
!pto.mask<G>的粒度参数G(b8/b16/b32)必须与操作向量的元素类型精确对应:!pto.vreg<64xf32>→!pto.mask<b32>!pto.vreg<128xf16>→!pto.mask<b16>!pto.vreg<256xi8>→!pto.mask<b8>三者对应同一物理寄存器(256-bit),但用户被迫在每一步都正确选择粒度。
3. 非对齐访问状态机
非对齐向量存取要求用户显式管理
!pto.alignSSA 状态:这在 MLIR 标准 dialect 中完全没有对应物,是纯硬件实现细节。
4. 地址空间枚举
!pto.ptr<T, space>有 9 种地址空间:GM、UB(VEC)、MAT、LEFT、RIGHT、ACC、BIAS、SCALING、Zero。用户为每个指针选择正确的地址空间。5. DMA 配置
pto.mte_gm_ub等 DMA 操作接受 11+ 个裸 i64 操作数来描述多级循环、stride、padding,是寄存器传输级的接口。6. 其他硬件模式
CubeLoadFracMode(ND2NZ / DN2NZ)和AccStoreMode(NZ2ND / NZ2DN / NZ2NZ)控制 NZ fractal 物理布局与逻辑布局之间的映射AccStoreQuantPreMode37 种预量化模式set_flag/wait_flag需手写 pipeline ID 和 event ID本质问题
这些细节对于算法开发者来说是意外的复杂度(accidental complexity)。用户想表达的只是一个语义清晰的向量操作(如"从内存加载 64 个 f32"),却被要求指定 dist 模式、mask 粒度、地址空间等硬件实现细节。这与 MLIR Vector Dialect 的简洁语义形成鲜明对比:
目标方案(Proposed Solution)
PTOAS/PTODSL 提供一套接近 MLIR Vector Dialect 语义的向量指令支持,让用户用高层语义编写向量计算,由编译器负责将标准 Vector Dialect IR lowering 为 VPTO 硬件指令。
编译器侧需自动完成的关键决策:
vector.load %buf[%i] : vector<64xf32>vector.loadwith strided patternvector.maskvector.storeto packed format任务分解(Task Breakdown)
任务 1:PTODSL 提供
pto.vec简化接口层pto.vec.*Python APIpto.vec.load/pto.vec.store— 向量内存读写,隐藏 dist/mask/align 细节pto.vec.masked_load/pto.vec.masked_store— 带 mask 的向量存取pto.vec.reduce— 归约操作(add、max、min 等)pto.vec.broadcast/pto.vec.splat— 广播/填充pto.vec.transpose— 转置pto.vec.contract— 收缩/矩阵乘pto.vec.elementwise— 逐元素运算(add、mul、exp、div 等)任务 2:PTOAS 支持 Vector Dialect 输入并 lowering 到 VPTO
ptoasCLI 支持 Vector Dialect 输入(或自动检测)VectorToVPTOlowering pass:disttokenVPTOLLVMEmitter)对接ptoas编译为可运行的 VPTO 代码vector.load/store、masked 变体、reduction、broadcast、contract 等非目标(Non-Goals)
相关参考
docs/vpto-spec.mddocs/isa/micro-isa/03-vector-load-store.mdptodsl/ptodsl/_ops.py、ptodsl/ptodsl/_surface_types.pyinclude/PTO/IR/VPTOOps.tdProposed API / behavior
No response
Alternatives considered
No response
Additional context
No response