Skip to content

并行前缀扫描

parallel prefix scan · parallel scan · prefix computation

用上扫归约和下扫传播在线性工作、对数深度内计算任意幺半群运算的全部前缀。

接口与代数前提

给定幺半群 (M,,e) 与序列 a0,,an1。Exclusive scan 输出

yi=a0ai1,y0=e;

inclusive scan 输出 zi=yiai。本文后续算法先求 exclusive 版本,避免空前缀和单位元在边界处另设特判。

只要求结合律,不要求交换律或逆元。若 不交换,左右子树的组合顺序必须始终是“左摘要 右摘要”;任意交换会计算另一种前缀。

Upsweep:建立归约树

先把长度补到二次幂,填充值为 e。叶子按原顺序存输入;每个内部节点保存左右孩子摘要的有序组合。第 0 层并行计算相邻二元组,第 1 层并行合并长度 2 的块,直到根保存全序列摘要。

Upsweep 不变量是:高度 h 的已完成节点恰保存其连续叶区间、长度 2h 的聚合。归纳步由结合律成立;不需要把区间内部重新排序。

整棵二叉树有 n1 个内部节点,每个只做一次 ,所以 work 为 n1,span 为 log2n

Downsweep:传播左侧上下文

把根的外部前缀设为 e。若某内部节点收到进入其区间前的前缀 p,左孩子收到 p,右孩子收到

pL,

其中 L 是 upsweep 保存的左子树摘要。两个孩子随后并行继续。到叶 i 时,收到的正是 a0ai1

Downsweep 不变量只承担一个重心:节点携带的是“严格位于本节点区间左侧”的聚合。右孩子加上左摘要,左孩子不加本区间任何元素,因此叶端点自然得到 exclusive 语义。

Downsweep 同样访问 O(n) 个节点、深度 O(logn)。上下两遍合计

W=Θ(n),D=Θ(logn).

Brent 调度定理P 处理器时间为 O(n/P+logn)

字符串拼接的状态轨迹

取非交换运算字符串拼接,输入 a,b,c,d,单位元为空串。Upsweep 得到第一层 ab,cd,根为 abcd。Downsweep 从根前缀 "" 开始:左半收到 "",右半收到 ab;左半两叶得到 ""a,右半两叶得到 ababc

最终 exclusive 输出为 "",a,ab,abc,inclusive 输出再分别拼当前字符,得到 a,ab,abc,abcd。若在右孩子更新时写成 Lp,加法例子看不出错误,字符串例子会立即暴露次序颠倒。

Stream compaction

对每个输入并行计算保留标志 bi{0,1},对标志做 exclusive sum scan 得到位置 pi。若 bi=1,就把元素写到输出 out[pi];最后元素总数是根总和。

因为不同保留元素的前缀计数不同,scatter 下标互异,无需并发写同一槽。Scan 在这里不仅求和,还把全局稳定压缩转换成局部位置计算;输入相对次序被保留。

内存冲突与实现

概念树可单独存 2n 个节点,容易满足 EREW;in-place Blelloch 布局把内部摘要写回数组指定位置,需按层核对每个槽只有一个写者。Upsweep 与 downsweep 之间必须有依赖同步,不能让后者读到未完成摘要。

在 GPU 上,warp、shared-memory bank conflict 与跨 block scan 还需分层处理。块内 scan、块总和 scan、再把块前缀加回的三阶段仍保持同一不变量,但 barrier 和全局内存流量不在抽象 work/span 中。

数值与接口边界

浮点加法不满足精确结合律,树形 scan 与串行左折叠可能有不同舍入结果;这不是 data race,却会破坏 bitwise reproducibility。需要确定复现时应固定树形、使用更高精度或补偿方案。

没有单位元时仍可定义非空 inclusive scan,但标准 downsweep 的根前缀无法设值;需改算法或显式提供 identity。Segmented scan 还要在摘要中携带段首标记,不能仅在普通结果上事后清零。

参考资料
  • Guy Blelloch, Prefix Sums and Their Applications, CMU Technical Report, 1990.
  • W. Daniel Hillis, Guy Steele, Data Parallel Algorithms, Communications of the ACM, 1986.
  • Mark Harris, Shubhabrata Sengupta, John Owens, Parallel Prefix Sum (Scan) with CUDA, GPU Gems 3, 2007.