Использование OpenMP для расчета значения PI - PullRequest
4 голосов
/ 31 мая 2011

Я пытаюсь узнать, как использовать 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);  

Хотя это не дает правильное значение для пи при 10000 итерациях.Если весь материал OpenMP удален, он работает нормально.Я должен упомянуть, что я использовал код Монте-Карло отсюда: http://www.dartmouth.edu/~rc/classes/soft_dev/C_simple_ex.html

Я просто использую его, чтобы попытаться изучить OpenMP.Есть идеи, почему он сходится на 1.4ish?Могу ли я не увеличивать переменную несколькими потоками?Я предполагаю, что проблема с переменной count.

Спасибо!

1 Ответ

4 голосов
/ 01 июня 2011

Хорошо, я нашел ответ.Мне нужно было использовать предложение REDUCTION.Так что все, что мне нужно было изменить, это:

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

до:

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

Теперь он сходится на 3.14 ... yay

...