問題描述:在用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/)
