openmp共享数组

时间:2013-04-01 16:54:42

标签: c parallel-processing openmp

我有两个用于共享数组和共享布尔标志的nasted,我知道在尝试写入数组时它可能是一个冲突但是如果我让thoose部分变得严重我会失去平行这个的所有好处。有什么选择我怎么能避免这种情况并且仍然可以并行工作?感谢

#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);

1 个答案:

答案 0 :(得分:0)

首先是并行性,沿着索引i ,j从所有线程的(i + 1) - &gt; N 开始。 所以你认为批判不是。下一行即

inner_set[j] = 1

实际上被所有线程覆盖。

你需要 #pragma omp critical

出于同样的原因,第二个循环再次适用于并行性。