使用OpenMP计算PI的值

时间:2011-05-31 19:55:30

标签: c openmp montecarlo

我正在尝试通过并行化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

谢谢!

1 个答案:

答案 0 :(得分:4)

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

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

为:

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

现在它汇聚在3.14 ...... yay