Skip to content

[Feature] Simplify Vector Instruction Semantics #804

@Zhendong404

Description

@Zhendong404

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_B32MRG4CHN_B8MRG2CHN_B* 等。Dual load/store(vldsx2/vstsx2)还有 DINTLV_B*BDINTLVINTLV_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.pyptodsl/ptodsl/_surface_types.py
  • VPTO ODS 定义:include/PTO/IR/VPTOOps.td

Proposed API / behavior

No response

Alternatives considered

No response

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions