【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/)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM