“数组与序列提供索引,交换群支持常见区间差。它与差分数组互逆,并扩展到计数、异或、二维积分图和离线频率查询。顺序 RAM 中构建为确定性最坏 $O(n)$ 工作;并行前缀扫描把同一结合运算改写…”
接口与代数前提 ​
给定幺半群
inclusive scan 输出
只要求结合律,不要求交换律或逆元。若
Upsweep:建立归约树 ​
先把长度补到二次幂,填充值为
Upsweep 不变量是:高度
整棵二叉树有
Downsweep:传播左侧上下文 ​
把根的外部前缀设为
其中
Downsweep 不变量只承担一个重心:节点携带的是“严格位于本节点区间左侧”的聚合。右孩子加上左摘要,左孩子不加本区间任何元素,因此叶端点自然得到 exclusive 语义。
Downsweep 同样访问
由Brent 调度定理,
字符串拼接的状态轨迹 ​
取非交换运算字符串拼接,输入 a,b,c,d,单位元为空串。Upsweep 得到第一层 ab,cd,根为 abcd。Downsweep 从根前缀 "" 开始:左半收到 "",右半收到 ab;左半两叶得到 "" 与 a,右半两叶得到 ab 与 abc。
最终 exclusive 输出为 "",a,ab,abc,inclusive 输出再分别拼当前字符,得到 a,ab,abc,abcd。若在右孩子更新时写成
Stream compaction ​
对每个输入并行计算保留标志
因为不同保留元素的前缀计数不同,scatter 下标互异,无需并发写同一槽。Scan 在这里不仅求和,还把全局稳定压缩转换成局部位置计算;输入相对次序被保留。
内存冲突与实现 ​
概念树可单独存
在 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.