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