如何解决使用OpenMP计算PI的值
| 我正在尝试通过并行化蒙特卡洛代码来学习如何使用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
我只是用它来尝试学习OpenMP。有什么想法为什么会在1.4ish上融合吗?我可以不增加具有多个线程的变量吗?我猜测问题出在变量count
。
谢谢!
解决方法
好吧,我找到了答案。我需要使用REDUCTION子句。所以我要做的就是:
#pragma omp parallel shared(chunk,count) private(i)
至:
#pragma omp parallel shared(chunk) private(i,x,y,z) reduction(+:count)
现在它收敛于3.14 ...是的
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。