数组的前缀和(Prefix Sum)问题及其并行算法

一、问题简介


首先,我们来看一下什么是前缀和(Prefix Sum)问题。对于一个长度为N的数组(假设下标从1到N),那么前缀和(有时也称累加和cumulative sum)算法的伪代码是下面这样的

for(i=2;i<=N;i++)
V[i] = V[i-1] + V[i];
也就是说,对于一个输入的数组,我们所得之结果是一个等长的数组,而结果数组中的每个元素(假设是第x个元素)都是原数组中对应位置的前x项和。例如:


下图所示为Prefix Sum问题的串行算法的示意:


可见,串行版本的Prefix Sum问题的规模(size)是N-1,因为我们一共需要执行N-1次(加和)计算。而这个问题的深度(depth)也是N-1,因为它需要N-1个时间步(time steps)来完成。可见,size对depth的比是1,这其实表示我们可以做一些并行化的考虑(并行化执行时,同一time上完成的steps,仅算一个time step)。事实上,我们确实可以把Prefix Sum问题的depth降下来,不过这要以增大其size为代价。


二、Upper/Lower 并行算法


Upper/Lower算法是一种基于分治法设计的用于解决Prefix Sum问题的并行化算法。具体来说,Upper/Lower算法会把数组里的元素分成两半,即lower half和high half。然后Prefix Sum会在lower half和high half上分别递归地(通过分治法)来进行计算。最后再high half的所有结果要加上lower half输出结果中的最大值即可。如下图所示为递归执行的最后一层的示意。


下图给出的是包含逐层递归的全部执行过程。


如果我们用来表示在长度为N的输入上执行的用于求解Prefix Sum问题的Upper/Lower算法,那么我们则有如下定理:


此外,如果N不是2的若干次幂,我们则可以用下面这个上下界来给出S(N)的范围:


由于采用了二分法,所以我们可以知道的depth等于 t = log2N,其中N=2^t。


三、Odd/Even并行算法


另外一种用于解决Prefix Sum问题的并行化算法就是Odd/Even算法,记作。这个方法和前面介绍的Upper/Lower算法非常相像,也是基于分治法设计的。只是这回,我们在每层迭代时,是根据数组元素下标的奇偶性来将元素分成两组。下图所示为一个简单的示例:


Odd/Even算法的执行中有个主要的步骤往复交替。首先,prefix sum的操作总是在偶数项上执行,如下图所示:


其次,一旦偶数项上的操作执行完毕,那么偶数上的结果就将被加到下一个(相邻的)奇数项上,如下图所示:

所以我们不难发现,在执行过程中,每次将输入二分,都会使得操作的depth增加2层,一层是做相邻两个元素的加和,一层是将中间结果累加到相应的位置上去。当N=4时,的执行需要用到2层操作。现在考虑当N=2^t时,的depth为多少。根据之前的分析易得:


同样地,我们还可以计算所涉及的size为(注意我们在计算时用到了等比数列的求和公式):


可见的size要比的size小很多,但同时的depth也要比的depth大很多


四、Ladner-Fischer并行算法


最后要介绍的这种并行算法是由Ladner和Fischer在1980年左右提出的。Ladner-Fischer算法使得我们可以在depth和size之间进行更加精细的平衡,它在很大程度上是Upper/Lower算法和Odd/Even算法的结合。例如下面是当N=8时,Ladner-Fischer算法的执行示例:


下面是当N=16时,Ladner-Fischer算法的执行示例:


此处我们也不再对Ladner-Fischer算法的具体细节做过多的涉及,有兴趣的读者可以参阅相关资料以了解更多。


Ladner-Fischer算法的size和depth分析比较复杂,我们这里也不详细讨论(其中用到了斐波那契数的一些性质),下表总结对比了本文中提到的几种并行算法的情况:



(本文完)

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 30
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白马负金羁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值