2013-04-01 94 views
1

我有兩個鼻子的工作與共享數組和共享布爾標誌,我知道它可能是一個碰撞,而試圖寫入數組,但如果我讓thoose部分關鍵我將失去所有好處與此平行。有沒有什麼選擇,我如何避免這種情況,並仍然並行工作?感謝openmp共享陣列

#pragma omp parallel 
{ 
#pragma omp for schedule (guided) 
      for(int i=0;i<N-1;i++) 
      { 
       for(int j=i+1;j<N;j++) 
       { 
        if(cluster[i*N+j]!=0) 
        { 
         inner_set[i]=1;// Critical??? 
         inner_set[j]=1; 
        } 
        else 
        { 
         outter_set[i]=1; 
        } 
       } 
      } 
} 

do 
{ 
    isChanged=false; 
#pragma omp parallel for schedule (guided)  
      for(int i=0; i<N; i++) 
      { 
       if(inner_set[i]!=0) 
       { 
        for (int j=0; j<N;j++) 
        { 
         if(i!=j && outter_set[j]!=0) 
         { 
          if(dis[i*N+j]<Dis) 
          { 
           isChanged=true; 
           inner_set[i]=0;//critical??? 
           outter_set[i]=1; 
          } 
         } 

        } 
       } 


     } 
}while(isChanged); 

回答

0

首先並行,沿索引i和j從第(i + 1)運行 - >Ñ所有線程。 所以你認爲關鍵不是。下一行,即

inner_set[j] = 1 

實際上被所有線程覆蓋。

您需要#pragma omp critical該行。

由於相同的原因,第二個循環再次適用於並行。

+0

非常感謝。如果我說得對,那麼到處都是通過索引i被排除的東西在這個實現中並不是至關重要的,但是通過索引j改變什麼是至關重要的?可能是更好的想法使用鎖?再次謝謝你。 –

+0

是的。要進行調試,請在串行模式下運行代碼,然後並行並比較結果。如果它有效,那麼投票支持這個答案,以使any1可以作爲問題的解決方案。 – DOOM

+0

我希望我不能聲望但非常感謝你 –