流水线并行

本文档从阶段执行、缓冲组织和显式同步等角度,说明 PTO Tile Lib 中的流水线重叠方式。

本文档重点讨论 load、transform、compute、store 等阶段在软件层面的组织方式。

1. PTO 中的流水线重叠

在 PTO kernel 中,流水线优化通常指:让不同阶段的工作尽量重叠执行,从而避免数据搬运与计算被不必要地串行化。

一个常见的高层视角是:

TLOAD -> 布局 / 暂存变换 -> compute -> TSTORE

根据 kernel 不同,中间阶段可能包括:

  • TEXTRACT
  • TMOV
  • TTRANS
  • 各类向量计算指令
  • TMATMUL 等矩阵指令

这种理解与 docs/coding/opt.md 中的优化思路是一致的。

2. 硬件可见阶段与软件可见阶段

从软件层面看,PTO 开发者通常围绕以下阶段来组织思路:

  • 从 GM 加载 tile
  • 对已暂存数据做变换或重排
  • 执行 vector 或 cube 计算
  • 把结果写回 GM

这些阶段在硬件上的精确映射会受到 backend 影响,但编程目标是稳定的:

  • 在依赖允许时尽量让有价值的阶段重叠
  • 减少不必要的停顿
  • 避免为了局部依赖而把整个流水线全部排空

3. 缓冲的作用

流水线重叠通常依赖以下缓冲方式:

  • 双缓冲
  • 分阶段临时 tile
  • 显式的 producer-consumer 同步

核心思想可以概括为:

  • 当一个 tile 正在被后续阶段消费时,另一个 tile 可以同时为更早阶段做好准备

这种方式是否有收益,取决于:

  • kernel 结构
  • 主导瓶颈
  • 可用片上资源
  • 依赖关系是否建立正确

4. Event 与同步的作用

当前仓库已经在 docs/coding/Event.md 中给出了显式事件模型。

对于 PTO 中的细粒度同步,这份文档是当前最可靠的公开依据。

更稳妥的原则包括:

  • 只为真实依赖加入同步
  • 更偏向 producer-consumer 顺序控制,而不是不必要的宽泛屏障
  • 事件使用方式应与文档中给出的 event 类型和 intrinsic 签名保持一致

在 device build 下,会使用类型化的 Event<SrcOp, DstOp> 表达依赖;在 CPU 仿真下,部分同步路径会被简化。

5. 预热、稳态与收尾

一个流水线 kernel 往往更适合分成三个阶段来理解:

  1. 预热:把第一批 tile 放入流水线
  2. 稳态:让连续 tile 之间的各阶段尽量重叠
  3. 收尾:完成剩余尚未结束的阶段

这种思路很有用,因为很多流水线问题并不是出在主循环本身,而是把首尾迭代错误地按稳态逻辑处理,导致依赖关系不正确。

6. 什么样的流水线更可能有效

当以下条件成立时,流水线通常更容易带来收益:

  • 数据搬运和计算都占有一定比例
  • 不同 tile 可以在有限缓冲下进入不同阶段
  • 同步关系足够精确,不会破坏预期重叠

而在以下情况下,流水线收益可能有限:

  • 某个单一阶段占据了几乎全部执行时间
  • 缓冲压力过高
  • 额外的变换或同步抵消了原本的重叠收益

因此,是否采用流水线并行,应围绕真实瓶颈判断,而不应默认所有 kernel 都会明显受益。

6. 表述边界

除非仓库源码或正式文档明确给出依据,否则以下内容都不应直接写成既定事实:

  • TCOMPUTE 这类占位式指令
  • docs/coding/Event.md 不一致的事件 API
  • “一定能达到 3-4× 吞吐提升”之类的统一结论
  • 把某种硬件阶段映射写成适用于所有目标的固定保证
  • 忽略 tile 合法性、布局约束和指令支持情况的伪代码示例

这些写法在非正式讨论中可以帮助说明概念,但不适合作为严格的仓库文档。

7. 流水线调优流程

一个更稳妥的调优流程是:

  1. 先从正确的非重叠或最小重叠 kernel 出发
  2. 通过 profiling 或分阶段计时找出主导阶段
  3. 逐步引入缓冲和细粒度同步
  4. 每次调度修改后都重新验证正确性
  5. 当 tile 大小或划分方式变化后,再次确认重叠是否仍然有效

这与 docs/coding/opt.md 中的调优思路是相互一致的。

9. 相关参考文档

在当前 PTO Tile Lib 仓库中,最相关的参考包括:

  • docs/coding/Event.md
  • docs/coding/Tile.md
  • docs/coding/tutorial.md
  • docs/coding/opt.md

9. 结语

在 PTO Tile Lib 中,更准确的流水线并行描述方式应当是:

  • 在合法前提下重叠 load / transform / compute / store 等阶段
  • 谨慎使用缓冲与显式同步
  • 围绕真实瓶颈进行调优,而不是抽象追求“更多重叠”

相比依赖虚构 API、占位式指令或固定性能结论,这种写法更符合当前仓库事实,也更适合作为严谨文档。