带有 break openmp 的并行 If-else 循环
Posted
技术标签:
【中文标题】带有 break openmp 的并行 If-else 循环【英文标题】:Parallelel If-else loop with break openmp 【发布时间】:2014-03-21 04:56:11 【问题描述】:我想知道是否有办法在 openmp 中并行化这段代码。此循环需要找到必须在另一个算法中分析的next
元素。所以这个循环分析两个向量visited
和used
,如果它找到一个被访问但没有使用的元素,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
。
然后您必须为您的 next
和 fail
变量创建向量,并将您的部分结果存储在其中。
现在您的循环可以并行化,因为不再有相互依赖关系,只是您的结果现在是您仍然需要分析的向量。
要分析结果向量,您必须对它们进行前缀计算,以找到第一个索引 i
(如果有),其中 fail[i]
是 0
,并将 next[i]
作为结果。
所有这一切都可以完成,但没有什么先验表明你会因此获得加速。这在很大程度上取决于您的不同案例出现的概率。
【讨论】:
以上是关于带有 break openmp 的并行 If-else 循环的主要内容,如果未能解决你的问题,请参考以下文章