5

我试图通过并行化一个蒙特卡罗代码来学习如何使用 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上。

谢谢!

4

1 回答 1

5

好的,我找到了答案。我需要使用 REDUCTION 子句。所以我必须修改的是:

#pragma omp parallel shared(chunk,count) private(i)

到:

#pragma omp parallel shared(chunk) private(i,x,y,z) reduction(+:count)

现在它在 3.14 收敛...耶

于 2011-05-31T20:13:33.757 回答