用C语言编写的快速排序中的赛车条件与OpenMP并行化

时间:2012-02-15 14:16:03

标签: c openmp parallel-processing

在这个快速排序实现中,我认为我正在运行的程序进入了一个我无法理解的起源状态。所以我转向SO社区寻求指导。

如果我在quicksort()中的for循环之前删除“#pragma omp parallel for private(i)”,那么它会正确排序。

下面是一个排序示例和代码。

Unsorted
3 6 7 5 3 5 6 2 9 1

Sorted
0 1 2 3 3 5 6 7 9 5 



    size_t average (size_t a, size_t b)
    {
            return (a + b) / 2;
    }

    void swap (int *array, size_t x, size_t y)
    {
            int tmp;
            tmp = array[x];
            array[x] = array[y];
            array[y] = tmp;
    }

    void quicksort (int *array, int left, int right)
    {
            int i, last;

            if (left >= right)
            {
                    return;
            }

            swap (array, left, average(left, right));
            last = left;

            #pragma omp parallel for private(i)
            for (i = left + 1; i <= right; i++)
            {
                    if (array[i] < array[left] )
                    {
                            #pragma omp critical
                            {
                                    last++;
                            }
                            swap(array, last, i);
                    }
            }

            swap (array, left, last);

            #pragma omp parallel sections
            {
                    #pragma omp section
                    {
                            quicksort(array,left,last-1);
                    }

                    #pragma omp section
                    {
                            quicksort (array, last+1, right);
                    }
            }
    }

2 个答案:

答案 0 :(得分:3)

您在该循环中执行的交换操作彼此密切相关。这里无法获得并行性。

但是,使用两个平行部分开发的分支并行性,这不是必需的。你有性能问题吗?

答案 1 :(得分:0)

当我尝试多线程时,我通常将快速排序分解为其子句。这样,每个交换操作都独立于所有其他操作。看起来交换操作是您实现的问题。

我不知道你是否能够使用堆栈存储需要排序的子范围,但我发现它最适合我的实现。我正在运行一个双8核工作站,也使用openmp。除前几步外,16个核心为100%。