我有一个运行多次迭代的代码,只有满足条件时,才会保存迭代的结果。这自然地表示为 while 循环。我试图使代码并行运行,因为每个实现都是独立的。所以我有这个:
while(nit<avit){
#pragma omp parallel shared(nit,avit)
{
//do some stuff
if(condition){
#pragma omp critical
{
nit++;
\\save results
}
}
}//implicit barrier here
}
Run Code Online (Sandbox Code Playgroud)
这工作正常...但是每次实现之后都会存在一个障碍,这意味着如果我在并行块内所做的事情在一次迭代中比其他迭代花费的时间更长,那么我的所有线程都在等待它完成,而不是继续下一次迭代。
有没有办法避免这种障碍,使线程继续工作?我平均进行了数千次迭代,所以再进行几次迭代也不会造成什么影响(如果变量nit在已经运行的线程中没有增加)...
我试图将其变成并行的 for,但是 for 循环中的自动增量使变量nit变得疯狂。这是我的尝试:
#pragma omp parallel shared(nit,avit)
{
#pragma omp for
for(nit=0;nit<avit;nit++){
//do some stuff
if(condition){
\\save results
} else {
#pragma omp critical
{
nit--;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它继续工作并围绕 for 循环进行,但我的nit变量采用不可预测的值...正如人们可以从不同线程在不同时间增加和减少它所期望的那样。
我还尝试将 for 循环中的增量留空,但它无法编译,或者试图欺骗我的代码,使其在 for 循环中没有增量,例如
...
incr=0;
for(nit=0;nit<avit;nit+=incr)
...
Run Code Online (Sandbox Code Playgroud)
但后来我的代码崩溃了......
有任何想法吗?
谢谢 …