feat(vpto): 支持 stateful stream 融合 - #1260
Conversation
CA Model 性能验证:16B group store使用 测试约束
CA 结果
相对 1PT baseline:
关于 1PT 的
|
CA 性能验证:
|
| 方案 | kernel ticks | system ticks | RVEC busy | store 指令 |
|---|---|---|---|---|
origin/main |
9434 | 9648 | 5082 | 384 × RV_VST(其中 inner loop 为 1PT_B32) |
PR (VPTOStatefulStreamFusion) |
9394 | 9605 | 5048 | 256 × RV_VST + 64 × RV_VSTUI + 16 × RV_VSTAI |
变化:kernel -40(-0.42%),system -43(-0.45%),RVEC busy -34(-0.67%)。两组 load 均为 RV_VLD=320;主要计算指令数一致。该 case 的 VSTUI/VSTAI 分别对应循环内连续 stream store 与循环收尾的 vstas。
另外两个近期更新的 opt case(blockquant_bf16_group4_scale_expand_vmi_opt.pto、compute_y1_to_fp8_fp16_vmi_opt.pto)入口参数是 UB pointer,不具备当前 host validation 所需的 GM kernel ABI;已确认 lowering 结果,但没有伪造端到端性能数字。临时 benchmark 位于 .work/stateful-opt-bench/,未加入提交。
补充:为另外两个
|
| 方案 | kernel ticks | system ticks | RVEC busy | store |
|---|---|---|---|---|
| main | 2203 | 2415 | 96 | 1 × RV_VSTS |
| PR | 2204 | 2417 | 97 | 1 × RV_VSTUI + 1 × RV_VSTAI |
即单次独立 stream 在运行时实际对齐时成本约 +1 kernel tick;非对齐 off=1 的 PR 为 2207 kernel ticks。
另一个发现:原 opt case 的 load 和 store 共用动态 %off。如果实际传 off=1,当前两次 load 仍 lower 为 RV_VLDS 并触发 misalign;当前 PR 修复的是 store 路径,原 case 本身不能证明非对齐 load 已支持。
compute_y1_to_fp8_fp16
参数使用 blockCount=16, vlHalf=128,实际运行地址连续且对齐,但 vlHalf 保留为运行时参数,以忠实保留原 case 的“编译期可能非对齐”语义。
| 方案 | kernel ticks | system ticks | RVEC busy | store |
|---|---|---|---|---|
| main | 2399 | 2612 | 197 | 16 × RV_VSTS |
| PR | 2413 | 2626 | 211 | 16 × RV_VSTUI + 16 × RV_VSTAI |
PR 为 +14 kernel ticks / +14 RVEC busy。这里当前 lowering 是每轮独立 init_align → vstus → vstas,没有跨 16 轮融合成一条 stream。
这不是 pass 漏掉一个可直接证明的连续流:循环步长为运行时 2 * vlHalf,IR 中无法证明它恒等于 256B payload。若要跨迭代融合,需要前端/IR 提供该等式,或者生成 stride == payload_bytes 的运行时 guard 后走 fused fast path。
更正性能 benchmark 范围前一条评论对
真正对应“多条 1PT 合并成 stateful unaligned stream”的测试应使用明确 lower 成 |
|
根据端到端地址形态调整了两个 opt case(commit
三条原始 RUN/FileCheck 均通过;changed-code compliance: 0 errors, 0 warnings。 |
137422c to
73bf9d9
Compare
背景
VMI 连续
vload/vstore及部分group_storelowering 会产生多条独立的 stateful unaligned stream,重复初始化和 flush,增加访存指令与 align 状态管理开销。修改内容
vldas/vldus、init_align/vstus/vstasSSA align 链。group_store的连续场景,避免多轮 1PT_B32 抽取和地址操作,直接生成 stateful store stream。VPTOStatefulStreamFusionpass(CLI:-vpto-stateful-stream-fusion):vldas -> vldus*load streams;init_align -> vstus* -> vstasstore streams,覆盖 ordinary store 与 group store;scf.for迭代传递base/align:loop 外初始化,loop 内每轮继续vldus/vstus,loop 后一次vstas收尾;!pto.alignSSA 管理 align 状态,不向 VMI 接口暴露物理寄存器编号。范围说明
expand_load、通用group_load、group_slot_load不新增非对齐路径。vsts。验证
ninja -C build pto-test-opt PTOASCompilerllvm-lit -sv build/test/lit/vmi_new:524/524 通过fused_quant_dequant_vmi_optfocused lit:2/2 通过check_changed_code.py --repo . --base origin/main:0 error,0 warninggit diff --check已有 A5 CA model 基准显示:单块
vlds约 50 cycles,vldas+vldus约 51 cycles;双块 load2xvlds约 61 cycles,vldas+2xvldus约 60 cycles。此次 loop-carried store 的指令形态从 4 组init_align/vstus/vstas降为 1 次初始化、4 次vstus、1 次vstas;该形态已由 opt case 的 VPTO FileCheck 覆盖,CA case 后续可直接复用同一 kernel 做 cycle 对比。