1

共有配列と共有ブールフラグで動作する2つのネストされた for(s) があります。配列に書き込もうとしているときに衝突する可能性があることはわかっていますが、これらのセクションをクリティカルにすると、これを並列化することのすべての利点が失われます。これを回避し、並行して作業する方法はありますか? ありがとう

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

1 に答える 1

0

最初の並列性は、インデックス iに沿っており、j はすべてのスレッドで(i+1)->Nから実行されます。したがって、あなたが批判的だと思うことはそうではありません。次の行すなわち

inner_set[j] = 1

実際にはすべてのスレッドによって上書きされます。

その行には#pragma omp criticalが必要です。

同じ理由で、2 番目のループも並列処理に適しています。

于 2013-04-03T07:35:06.660 に答える