2013-04-01 68 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

我希望我不能声望但非常感谢你 –