我正试图通过并行化蒙特卡罗代码来学习如何使用OpenMP,该代码通过给定的迭代次数来计算PI的值。代码的核心是:
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);
尽管在给定10000次迭代的情况下,这并不能产生合适的pi值。如果所有的OpenMP内容都被删除,它工作得很好。我应该提到,我在这里使用了蒙特卡罗代码:http://www.dartmouth.edu/~rc/classes/soft_dev/C_simple_ex.html
我只是用它来尝试学习OpenMP。有什么想法为什么它会收敛到1.4?我可以不使用多个线程来增加变量吗?我猜问题出在变量count
上。
谢谢!
好的,我找到了答案。我需要使用REDUCTION子句。所以我所要修改的就是:
#pragma omp parallel shared(chunk,count) private(i)
至:
#pragma omp parallel shared(chunk) private(i,x,y,z) reduction(+:count)
现在它收敛到3.14…yay