1

ここには、正しいと思うものが答えとして与えられていないコードフラグメントがいくつかあります。これを明確にするために助けが必要です。

dotp=0;
for (i=0;i<n;i++){
dotp+= a[i]+b[i];
}

このコードを並列化するための答えは次のとおりです。

dotp=0;
#pragma omp parallel for reduction(+:dotp)
for (i=0;i<n;i++){
dotp+= a[i]+b[i];
}

forループ内で表示するには、最初のプライベートとしてdotpを追加する必要があると思います

dotp=0;
#pragma omp parallel for reduction(+:dotp) firstprivate(dotp)
for (i=0;i<n;i++){
dotp+= a[i]+b[i];
}

これが正しくない場合、なぜ firstprivate を使用する必要がないのでしょうか?

4

1 に答える 1

0

このreduction節は共有dotpとしてマークし、最終的な合計を実行します。

for ループ内の各共有の初期値dotpは 0 です。合計の最後のステップは、以前のバージョン (元の) の値を追加するdotpことです。この場合、これは 0 です。ただし、任意の値にすることができます。

の初期ゼロ化を強制するために、それが最初に非公開であると言う必要はありません (そしてそうすべきではありません) dotp

于 2013-05-14T19:37:54.937 に答える