【openmp】for循环的break问题

  问题描述:在用openmp并行化处理for循环的时候,便无法在for循环中用break语句,那么我们如何实现这样的机制呢?在stackoverflow上看到一个不错的回答总结一下。

volatile bool flag = false;

#pragma omp parallel for shared(flag)
for(int i = 0;i < 100000;i++)
{
    if(flag) continue;
    if(element[i]...)
    {
          ...
          flag=true;
    }       
}

  其中volatile关键字的作用是使得flag变量的改变在所有进程中同步,即保证只要有一个线程将flag改为true,那么从flag值改变的这一刻起所有其他线程的flag值都将变为true,那么所有的线程就不会对element[i]继续进行判断,相当于饶了一个弯实在并行的for中实现了break。

  stackoverflow上针对这个答案还有一个改进版的答案也值得学习一下:

volatile bool flag = false;

for(int i = 0;i < 100&&!flag;i++) {
    int base = i*1000;
#pragma omp parallel for shared(flag)
    for(int j = base;j <= base+1000;j++) {
         if(flag) continue;
         if(element[i+base] ...)
         {
              ....
              flag=true;
         }
    }
}

  这样相当于将100000次循环拆成外层的串行for和内层并行for,并且在外层加入了判断机制,如果flag的位置比较靠前就被决定了,那该算法能大大提升性能。

  (PS:附上关于volatile关键字的详解文章:http://ifeve.com/volatile/)

posted @ 2018-10-11 09:33  Miller_S  阅读(2528)  评论(1编辑  收藏  举报