“work efficient 的并行 scan有 $W=\Theta(n)$、$D=\Theta(\log n)$。Brent 定理给 $$ T P=O(n/P+\log n). $$ 当…”
形式陈述 ​
接口与代数前提 ​
给定幺半群
inclusive scan 输出
只要求结合律,不要求交换律或逆元。若
Upsweep:建立归约树 ​
先把长度补到二次幂,填充值为
Upsweep 不变量是:高度
设补齐后长度
Downsweep:传播左侧上下文 ​
把根的外部前缀设为
其中
Downsweep 不变量只承担一个重心:节点携带的是“严格位于本节点区间左侧”的聚合。右孩子加上左摘要,左孩子不加本区间任何元素,因此叶端点自然得到 exclusive 语义。
Downsweep 同样访问
由Brent 调度定理,
直觉
Upsweep 先为每个连续区间建立聚合摘要,downsweep 再把“严格位于当前区间左边”的上下文从根传播到叶。每个叶最终收到自己的 exclusive 前缀;树上两个方向各只做线性工作,却把依赖链压到对数深度。
例子与边界
字符串拼接的状态轨迹 ​
取非交换运算字符串拼接,输入 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.