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