我正在尝试通过并行化monte carlo代码来学习如何使用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东西,它就可以正常工作。 我应该提一下,我使用了monte carlo代码: 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 … yay
以上就是c/c++开发分享使用OpenMP计算PI的值相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/544991.html