【问题标题】:parallel programming using Visual studio 2017使用 Visual Studio 2017 进行并行编程
【发布时间】:2017-11-23 11:04:09
【问题描述】:
int partition(int arr[], int l, int h)
{
    int x = arr[h];
    int i = (l - 1);
#pragma omp parallel for
    for (int j = l; j <= h - 1; j++)
    {
        if (arr[j] <= x)
        {
            i++;
            swap(&arr[i], &arr[j]);
        }
    }
    swap(&arr[i + 1], &arr[h]);
    return (i + 1);
}

我尝试在迭代快速排序程序上使用 OpenMP。 上面的代码是分区部分,它使用 arr[] 中的最后一个元素作为枢轴 我想在快速排序中,xxx 枢轴 yyy 随着我从最左边增加到枢轴,首先交换哪个数字并不重要,这些数字小于枢轴

但产生的答案不是排序数组。(部分排序) 在那之后,我猜这是由“i++”上的竞争条件引起的 我测试了 i(printf i 在交换之后/之前),i 是连续的(错误的顺序,但没关系?) 这应该意味着从最左边到枢轴位置的值已经改变,没有竞争条件。

我也试过添加

#pragma omp atomic

之前是i++,但是改之后好像没什么不同。 我只在这个循环上使用并行。而且我不知道代码的哪一部分导致了无序排序。

【问题讨论】:

    标签: c++ sorting visual-studio-2017 openmp


    【解决方案1】:
    1. 为了使并行算法起作用,for 循环的各个迭代通常应该是独立的。在这种情况下,各个迭代不是独立的。

    2. 竞态条件不仅可以发生在 i++ 部分,还可以发生在交换部分。

    【讨论】:

    • 假设竞争条件没有发生在 i 上。用 j 交换对应 i 的 arr 不应影响答案,例如。 0->x 小于枢轴。 i 对于每次迭代都是连续的。这意味着将 0->x 与相应的 arr[j] 交换。由于 arr[0->x] 小于枢轴。应该不会影响后续操作吧?
    • 你对在这个函数中使用 OpenMP 有什么建议吗?
    猜你喜欢
    • 2017-07-09
    • 2019-10-17
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    相关资源
    最近更新 更多