带有 break openmp 的并行 If-else 循环

Posted

技术标签:

【中文标题】带有 break openmp 的并行 If-else 循环【英文标题】:Parallelel If-else loop with break openmp 【发布时间】:2014-03-21 04:56:11 【问题描述】:

我想知道是否有办法在 openmp 中并行化这段代码。此循环需要找到必须在另一个算法中分析的next 元素。所以这个循环分析两个向量visitedused,如果它找到一个被访问但没有使用的元素,next等于k并退出循环设置k等于维度+1,如果有't 元素已访问且未使用,循环尝试查找未访问且未使用的元素并设置 next=k。

重要的是else if 中的语句不要中断循环,因为向量中可以访问元素。

for (k=0;k<dimension;k++)
    if (visited[k] == 1 && used[k]==0)
        next = k;
        fail =0;
        k=dimension+1;
     

    else if (visited[k] == 0 && used[k]==0) 
        next = k;
        fail = 1;
    


如何将其与 pragma omp for 并行化?

【问题讨论】:

"peace of code" 只是一个不错的错字,请不要编辑 :) 不就是在for循环前加一个omp指令吗?参考:link 【参考方案1】:

这样的代码很难并行化。

首先你必须摆脱你隐含的break,重置k

然后您必须为您的 nextfail 变量创建向量,并将您的部分结果存储在其中。

现在您的循环可以并行化,因为不再有相互依赖关系,只是您的结果现在是您仍然需要分析的向量。

要分析结果向量,您必须对它们进行前缀计算,以找到第一个索引 i(如果有),其中 fail[i]0,并将 next[i] 作为结果。

所有这一切都可以完成,但没有什么先验表明你会因此获得加速。这在很大程度上取决于您的不同案例出现的概率。

【讨论】:

以上是关于带有 break openmp 的并行 If-else 循环的主要内容,如果未能解决你的问题,请参考以下文章

openMP 没有并行线程

OpenMP 并行等待

C++ OpenMP 未并行运行

openMP 并行部分中的共享变量有些奇怪

C++ OpenMP 和 gcc 4.8.1 - 并行化循环时的性能问题

使用 openmp 时运行的线程数不一致