Batcher奇怪的甚至合并排序并行策略

时间:2015-11-27 01:36:25

标签: c sorting openmp

我正在尝试并行化batcher的奇数甚至合并排序。 到目前为止我取得的进展是这个

如果有如下数组 a [8] = {8,6,4,2,1,7,3,5} 我在上面数组的两半使用 omp parallel ,如下所示

    #pragma omp parallel for num_threads(4)
    for (i = 0; i < halfSize; ++i)
    {
        for (j = i + 1; j < halfSize; ++j)
        {
            if (a[i] > a[j])
            {
                temp =  a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }   

    #pragma omp parallel for num_threads(4)
    for (i=halfSize; i < arraySize; ++i)
    {
        for (j = i + 1; j < arraySize; ++j)
        {
            if (a[i] > a[j])
            {
                temp =  a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }   

在上面的halfSize是4而arraySize是8,这基本上并行化了给定数组的两半,所以最终结果如下 a [8] = {2,4,6,8,1,3,5,7}

现在根据Batcher的奇数偶数合并排序算法,我必须对上面排序的数组的偶数位置元素和奇数位置元素进行排序。

为了以并行的方式实现这一点,我可以对偶数元素进行并行处理,对奇数元素进行并行处理。就像上面两个并行的循环一样。 我需要建议,希望你们能保持简单。

完成上述步骤后,我必须交换从上面步骤获得的数组中的相邻元素(第一个元素除外)。我将使用最终的并行来做到这一点。是这样的首选方式。

1 个答案:

答案 0 :(得分:0)

标题提到合并排序,但在wiki上查看之后,Batcher的算法是面向硬件的排序网络的类型:一系列比较/交换电路,其组可以并行执行。索引模式比仅相邻的偶数和奇数对更复杂。维基图显示了一个包含8个整数数组的示例,以及允许并行操作的分组。请注意,索引的示例代码输出与图表的顺序不同。

在wiki底部附近的Batcher文章是一个迭代算法,用于选择用于比较/交换电路的索引。我不知道它是否与8元素案例的图表相匹配。

http://en.wikipedia.org/wiki/Batcher_odd%E2%80%93even_mergesort

http://en.wikipedia.org/wiki/Sorting_network

我不确定它是一种软件排序的实用方法,但它可以用来测试最终会成为硬件实现的方法。