5

特定の反復回数で PI の値を計算するモンテカルロ コードを並列化することで、OpenMP の使用方法を学ぼうとしています。コードの内容は次のとおりです。

  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 に答える