次のコードがあり、誤った出力になっています。OpenMP:縮小と共有
#pragma omp parallel private(i,piold) shared(pi,sign)
{
#pragma omp for reduction(+:pi) schedule (static)
for (i = 0; i < 100000; i++){
piold = pi;
pi += sign/(2*i+1);
sign=-sign;
}
}
pi = 4*pi;
私はOpenMPの新機能として少し失われています。私が混乱しているのは、スレッド間でsign
,pi
、piold
を渡す方法です。別の反復には異なる値が必要なので、それらを共有することはできません。したがって、1つの方法は、繰り返しを奇数と偶数に分けることですが、それは非常に非効率的です。
この場合のご提案はありますか?
する減速句最初は「1」または「-1」、記号/(2 * i + 1) 'は、最初の反復を除くすべてに対して' 0 'を与えます。また、私がOMPについて知らないうちに、「サイン」をプライベートと共有の両方として宣言することは、私と矛盾しているようです。 – celtschk
サインプライベートとシェアは間違いでした。私はここで自分のコードを修正しました。 – algoProg
「pi = 4」という結果が間違っていますか? – celtschk