Parallelel If-else 循环与中断 openmp

Parallelel If-else loop with break openmp

本文关键字:中断 openmp 循环 If-else Parallelel      更新时间:2023-10-16

我想知道是否有办法在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;
    }
}

如何使用杂注 omp 并行化它?

这样的代码并行化并非易事。

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

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

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

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

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