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

时间:2014-02-20 10:11:39

标签: c++ c for-loop parallel-processing openmp

我想知道是否有办法在openmp中并行化这段代码。此循环需要查找必须在另一算法中分析的next元素。因此,此循环分析两个向量visitedused,如果它找到一个被访问但未使用的元素,next等于k并退出循环设置k等于维度+ 1,如果没有访问和未使用的元素,循环尝试查找未访问但未使用的元素并设置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并行化?

1 个答案:

答案 0 :(得分:0)

此类代码并行化并不容易。

首先,在重置break时,您必须摆脱隐含的k

然后,您必须为nextfail变量制作向量,并将部分结果存储在那里。

现在你的循环可以被平行化,因为不再存在相互依赖性,只是你的结果现在是你仍需要分析的向量。

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

所有这一切都可以完成,但没有任何事先说过你将获得加速。这在很大程度上取决于您的不同案例出现的概率。