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