非常类似于该问题,在openmp中对数组进行排序,该数组具有数百个视图,但没有正确答案。 因此,我再次尝试在这里再次询问。 我知道这与加速或性能有关的开销和无用性。 这只是进入openMP的一个小例子。 这是insertSort的事实,这是我的课程教师给出的。

这是我的代码:

std::vector<int> insertionSort(std::vector<int> a) {
    int i, j, k;
    #pragma omp parallel for private(i,j,k)
    for(i = 0; i < a.size(); i++) {
    #pragma omp critical
        k = a[i];
        for (j = i; j > 0 && a[j-1] > k; j--)

        #pragma omp critical
        {
            a[j] = a[j-1];
            a[j] = k;
        }
    }
 return a;
 }

我知道关键的方面是线程访问(读取和写入)a元素之间的竞争条件,这就是为什么我将关键部分放在所有元素周围。 这似乎还不够。 我在这里想念什么。 没有编译指示,排序是正确的。

  ask by Simeon translate from so

本文未有回复,本站智能推荐:

2回复

在openmp中对数组进行排序

我有100个元素的数组,需要使用OpenMP使用插入排序进行排序。 当我并行化排序时,它不会给出正确的值。 有人能帮我吗
1回复

Openmp中循环内部的关键部分

我有以下代码: dist是一个私有变量,而newmemebership和min_dist是一个共享变量。对于我的测试用例,如果我们运行代码而不添加关键部分构造,代码仍然有效。据我所知,它不应该因为两个线程可能正在运行在i的相同值上可能会修改导致冲突的min_dist [i]和newmembe
2回复

关键部分openMP

我想知道我们需要在哪里设置关键部分? 如果有多个线程具有一个共享数组,并且每个线程都想写在不同的位置,即使每个线程都写到数组中的不同位置,它也都需要放在关键部分吗? 可以说我有二维数组M [3] [3],initial_array [3]和一些双精度变量,我想计算一些东西并将其存储在M的
2回复

OpenMP-关键部分+减少

我目前正在学习使用C和OpenMP进行并行编程。 我想编写简单的代码,其中两个共享值由多个线程递增。 首先,我使用了还原指令,它的工作原理就是这样。 然后我切换到使用关键指令启动关键部分 - 它也有效。 出于好奇,我试图合并这两个解决方案并检查行为。 我期待两个有效的,相等的值。
2回复

OpenMP如何实现对关键部分的访问?

我想读取一个输入文件(在C / C ++中)并尽可能快地独立处理每一行。 处理本身需要几个滴答,所以我决定使用OpenMP线程。 我有这个代码: 我的问题是,如何确定要使用的最佳线程数? 理想情况下,我希望在运行时动态检测到这一点。 我不理解parallel的DYNAMIC计划选项,
1回复

openmp中的关键指令是否可以进行变量命名?

我想运行以下循环来并行计算元素。 由于count[j]仅通过迭代更新,其中(X[i] / exp) % 10评估为j我想为每个定义一个不同的临界区。 我首先想到在每个数组元素上使用reduction 子句,但这给出了编译错误。 我知道这段代码是错误的,但我应该如何实现这种事情?
1回复

OpenMP:用锁替换关键部分

如何用omp_locks代替关键部分? 我原始的带有关键部分的代码是这样的,可以正常工作: 现在我做同样的事情,但是用锁代替: 但是由于某种原因,我得到了错误的结果。 我在这里做错什么了吗? 另外,当我尝试使用多个锁(例如,要写入的每个数组元素)时,似乎陷入了死锁?
1回复

OpenMP了解关键构造中的死锁

我试图准确理解为什么在并行区域中发生死锁时,关键构造嵌套在关键构造中。 我曾咨询以下资源: 这个源的作者写道: 在OpenMP中,如果在关键区域内调用包含另一个关键区域的函数,则会发生这种情况。 在这种情况下,被调用函数的关键区域将等待第一个关键区域终止 - 这将永远不会发生。