并行与分布式系统中的并行前缀和(扫描)算法:工作负载优化(Work-Optimal)并行扫描算法
字数 2027 2025-11-04 11:59:17
并行与分布式系统中的并行前缀和(扫描)算法:工作负载优化(Work-Optimal)并行扫描算法
题目描述
在并行与分布式系统中,前缀和(也称扫描)是一个基础操作。给定一个输入数组 \(A = [a_0, a_1, ..., a_{n-1}]]\),前缀和操作生成一个输出数组 \(B = [b_0, b_1, ..., b_{n-1}]\),其中每个元素 \(b_i\) 是 \(a_0\) 到 \(a_i\) 的和(包含性扫描)或 \(a_0\) 到 \(a_{i-1}\) 的和(排他性扫描)。工作负载优化并行扫描算法旨在使用 \(O(n)\) 的总操作量(工作负载)和 \(O(\log n)\) 的时间步数,在 \(p\) 个处理器上高效计算前缀和,避免简单并行方法中的 \(O(n \log n)\) 操作开销。
解题过程
-
问题分析
- 朴素并行方法(如递归加倍)在 \(O(\log n)\) 时间内完成,但总操作数为 \(O(n \log n)\),远高于串行算法的 \(O(n)\),导致工作负载非最优。
- 目标:设计算法在 \(O(\log n)\) 时间步内仅执行 \(O(n)\) 次加法操作,实现工作负载最优(work-efficient)。
-
算法核心思想:平衡树与反向传播
- 将输入数组视为完全二叉树的叶子节点(若 \(n\) 非 2 的幂,填充虚拟元素 0)。
- 分两阶段:
- 上扫阶段(Reduce Phase):自底向上计算子树局部和,存储于内部节点。
- 下扫阶段(Downsweep Phase):自顶向下传播前缀和,结合左兄弟节点的累加和。
-
详细步骤
步骤 1:数据结构准备- 将数组 \(A\) 映射到平衡二叉树结构,树高 \(h = \lceil \log_2 n \rceil\)。每个节点存储:
value:当前子树元素和(上扫阶段计算)。prefix:当前节点的前缀和(下扫阶段计算)。
- 初始化所有叶子节点的
value为 \(A[i]\),内部节点的value和prefix为 0。
步骤 2:上扫阶段(自底向上求和)
- 从叶子层到根层,逐层并行处理:
- 对于每个内部节点 \(v\),其
value等于左孩子value+ 右孩子value。 - 示例:节点 \(v\) 的左孩子值为 \(L\),右孩子值为 \(R\),则设置 \(v.\text{value} = L + R\)。
- 时间步数:\(O(\log n)\),总加法操作数 \(O(n)\)(因二叉树节点数 \(2n-1\),每节点一次加法)。
- 对于每个内部节点 \(v\),其
步骤 3:下扫阶段(自顶向下传播前缀和)
- 根节点前缀和设为其左孩子值(排他扫描)或自身值(包含扫描)。以排他扫描为例:
- 根节点:
prefix = 0(排他扫描起始)。 - 从根向下,对每个节点 \(v\) 并行:
- 左孩子
prefix= \(v.\text{prefix}\)。 - 右孩子
prefix= \(v.\text{prefix} + \text{左孩子.value}\)。
- 左孩子
- 叶子节点的
prefix即为最终前缀和结果。
- 根节点:
- 时间步数:\(O(\log n)\),总操作数 \(O(n)\)。
步骤 4:输出构造
- 收集叶子节点的
prefix值,得到输出数组 \(B\)。对于包含性扫描,将叶子自身的值加到prefix上。
- 将数组 \(A\) 映射到平衡二叉树结构,树高 \(h = \lceil \log_2 n \rceil\)。每个节点存储:
-
示例演算(排他扫描)
输入 \(A = [3, 1, 4, 2]\)(n=4)。- 上扫阶段:
叶子层:节点值 [3, 1, 4, 2]。
父层:左父值=3+1=4,右父值=4+2=6。
根节点值=4+6=10。 - 下扫阶段:
根前缀=0。
左父前缀=0,右父前缀=0+4=4。
叶子前缀:左叶1=0,左叶2=0+3=3,右叶1=4,右叶2=4+4=8。
输出 \(B = [0, 3, 4, 8]\)(排他扫描结果)。
- 上扫阶段:
-
工作负载与时间复杂度分析
- 总加法操作数:上扫阶段 \(n-1\) 次,下扫阶段 \(n-1\) 次,总计 \(2n-2 \in O(n)\)。
- 并行时间步:每阶段 \(\log n\) 步,总时间 \(O(\log n)\)。
- 工作负载最优性:总操作量与串行算法同阶,且并行时间高效。
-
分布式环境适配
- 在分布式内存系统(如MPI)中,数组分块存储于不同处理器。需在局部扫描后,通信交换边界累加和,调整局部结果。
- 优化点:减少处理器间通信轮次,结合树形通信模式(如蝶形网络)降低延迟。
此算法通过平衡树结构将计算均匀分布,确保工作负载最优,是并行前缀和问题的标准高效解法。