我正在尝试通过并行化蒙特卡罗代码来学习如何使用 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);
尽管经过 10,000 次迭代,这并不能产生正确的 pi 值。如果把所有OpenMP的东西都去掉,就可以正常工作了。我应该提到我使用了这里的蒙特卡洛代码:http://www.dartmouth.edu/~rc/classes/soft_dev/C_simple_ex.html http://www.dartmouth.edu/~rc/classes/soft_dev/C_simple_ex.html
我只是用它来尝试学习 OpenMP。你知道为什么它会集中在 1.4ish 上吗?我不能在多个线程中增加变量吗?我猜问题出在变量上count
.
Thanks!
好吧,我找到了答案。我需要使用 REDUCTION 子句。所以我必须修改的是:
#pragma omp parallel shared(chunk,count) private(i)
to:
#pragma omp parallel shared(chunk) private(i,x,y,z) reduction(+:count)
现在收敛于 3.14...耶
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)