特定の反復回数で PI の値を計算するモンテカルロ コードを並列化することで、OpenMP の使用方法を学ぼうとしています。コードの内容は次のとおりです。
int chunk = CHUNKSIZE;
count=0;
#pragma omp parallel shared(chunk,count) private(i)
{
#pragma omp for schedule(dynamic,chunk)
for ( i=0; i<niter; i++) {
x = (double)rand()/RAND_MAX;
y = (double)rand()/RAND_MAX;
z = x*x+y*y;
if (z<=1) count++;
}
}
pi=(double)count/niter*4;
printf("# of trials= %d , estimate of pi is %g \n",niter,pi);
これは、10,000回の反復で与えられたpiの適切な値を生成していません。すべての OpenMP 要素が取り除かれると、正常に動作します。ここからモンテカルロコードを使用したことを言及する必要があります: http://www.dartmouth.edu/~rc/classes/soft_dev/C_simple_ex.html
私はそれを使って OpenMP を学ぼうとしています。1.4ish に収束している理由はありますか? 複数のスレッドで変数をインクリメントできませんか? 問題は変数にあると思いますcount
。
ありがとう!