c - 用 C 编写的快速排序中的赛车条件与 OpenMP 并行

标签 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);
                    }
            }
    }

最佳答案

您在该循环中执行的交换操作彼此深度依赖。此处无法获得并行性。

但是对于您使用两个并行部分开发的分支并行性,这应该不是必需的。你有这方面的性能问题吗?

关于c - 用 C 编写的快速排序中的赛车条件与 OpenMP 并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9294989/

相关文章:

c - openmp是否分配内存并释放所有内存

c++ - 并行区域内的 For 循环

c++ - cpp 中的并行 openMP 循环

arrays - Julia:在表达式中使用分布式数组

c - 我应该为成功的函数返回 0 还是 1?

c++ - 为什么符号扩展错误具有很高的安全风险?

java - 并发执行 : Future vs parallelstream

c# - 如何使用 Task 对象初始化 List

objective-c - 为什么我总是得到相同的随机值?

c - 有没有办法限制命令行参数的数量?