我有一个OpenMP代码,如下所示
while(counter < MAX) {
#pragma omp parallel reduction(+:counter)
{
// do monte carlo stuff
// if a certain condition is met, counter is incremented
}
}
因此,只要计数器低于某个值,该想法就是可用线程执行并行部分 . 取决于场景(我在这里做MC的东西,所以它是随机的),计算可能需要很长时间,因此这里的 Worker 之间存在不 balancer ,由于并行结束时的隐含障碍而变得明显部分 .
似乎#pragma omp parallel for可能有办法绕过这个(即nowait指令/动态调度),但我不能使用它,因为我不知道for循环的上部迭代次数 .
任何想法/设计模式如何处理这种情况?
最好的祝福!
1 回答
在一个并行部分中运行所有内容并以原子方式访问
counter
.由于原子访问,您无法直接检查while条件 . 请注意,此代码将超调,即在并行部分之后可能
counter > MAX
. 请记住,counter
由许多线程共享和读取/更新 .