2011-05-31 120 views
4

我在學習如何使用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); 

雖然這不產生適當的價值爲pi給予10,000次迭代。如果所有的OpenMP東西都被取出,它就可以正常工作。我應該提到,我使用了蒙特卡羅代碼:http://www.dartmouth.edu/~rc/classes/soft_dev/C_simple_ex.html

我只是用它來試圖學習OpenMP。任何想法爲什麼它收斂在1.4ish?我可以不使用多個線程遞增變量嗎?我猜測問題是變量count

謝謝!

回答

4

好的,我找到了答案。我需要使用REDUCTION子句。因此,所有我不得不修改爲:

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

到:

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

現在,它匯聚在3.14 ...耶