并行前缀和向下扫描 - 输入大小不是2的幂

时间:2014-09-04 03:38:57

标签: algorithm parallel-processing

我正在实现http://www.cs.cmu.edu/~guyb/papers/Ble93.pdf中讨论的前缀和算法。我面临的问题是输入大小不是2的幂。我使用这个前缀和实现并行快速排序的分区。具体来说,我在下面的向下扫描阶段算法中遇到了问题。

 x[n – 1] = 0
 for d = log2(n) – 1 down to 0 do 
       for all k = 0 to n – 1 by 2^(d+1) in parallel do 
            t = x[k +  2^d  – 1]
            x[k +  2^d  – 1] = x[k +  2^(d+1) – 1]
            x[k +  2^(d+1) – 1] = t +  x[k +  2^(d+1) – 1]
问题1:在上述算法中,假设n = 10,对于d = 2且k = 8,索引k + 2 ^ d-1> n。 k + 2 ^(d + 1)-1> n的情况也是如此。这导致应用程序核心转储。我们应该如何处理n不是2的幂的情况? 问题2:对于输入序列1,1,1,0,0,0,0,0,0,0,1,正确的前缀和是1,2,3,3,3,3,3,3,3 ,3,4。考虑我忽略index大于n的操作。如果我手工计算,我会根据上面的论文3,4,5,6,6,6,6,6,0,0,0得到以下前缀。

让我知道如何处理这些问题。

1 个答案:

答案 0 :(得分:-1)

如果您不受某种特定语言的限制,请考虑将一起使用,以利用existing parallel prefix algorithm implementation。以下是文档的摘录。

描述

parallel_scan(范围,正文)计算并行前缀,也称为并行扫描。这种计算是并行计算中的一种高级概念,有时在看似具有固有连续依赖性的场景中很有用。

并行前缀的数学定义如下。设×是与左标识元素id×的关联运算。序列z0,z1,... zn-1上的×的并行前缀是序列y0,y1,y2,... yn-1,其中:

y0 = id× × z0
yi = yi-1 × zi

例如,如果×是加法,则并行前缀对应运行总和。并行前缀的串行实现是:

T temp = id×;
for( int i=1; i<=n; ++i ) {
    temp = temp × z[i];
    y[i] = temp;
}

并行前缀通过重新关联×的应用并使用两遍来并行执行此操作。它可以调用×最多两倍于串行前缀算法的次数。给定正确的粒度和足够的硬件线程,它可以执行串行前缀,因为即使它做了更多工作,它也可以跨多个硬件线程分配工作。