2011-05-31 15 views
4

J'essaie d'apprendre à utiliser OpenMP en parallélisant un code monte carlo qui calcule la valeur de PI avec un nombre donné d'itérations. La viande du code est la suivante:Utilisation d'OpenMP pour calculer la valeur de 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); 

Bien que cela ne donne pas la valeur correcte pour pi donné 10.000 itérations. Si tout le matériel OpenMP est retiré, ça fonctionne très bien. Je dois mentionner que j'ai utilisé le code de monte carlo d'ici: http://www.dartmouth.edu/~rc/classes/soft_dev/C_simple_ex.html

Je l'utilise juste pour essayer OpenMP. Des idées pour lesquelles il converge vers 1.4ish? Est-ce que je ne peux pas incrémenter une variable avec plusieurs threads? Je suppose que le problème est avec la variable count.

Merci!

Répondre

4

D'accord, j'ai trouvé la réponse. J'avais besoin d'utiliser la clause REDUCTION. Donc, tout ce que je devais modifier était:

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

à:

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

Maintenant, il est convergent à 3,14 ... yay

Questions connexes