Я использую следующий код OpenMP
#pragma omp parallel shared(S2,nthreads,chunk) private(a,b,tid)
{
tid = omp_get_thread_num();
if (tid == 0)
{
nthreads = omp_get_num_threads();
printf("\nNumber of threads = %d\n", nthreads);
}
#pragma omp for schedule(dynamic,chunk) reduction(+:S2)
for(a=0;a<NREC;a++){
for(b=0;b<NLIG;b++){
S2=S2+cos(1+sin(atan(sin(sqrt(a*2+b*5)+cos(a)+sqrt(b)))));
}
} // end for a
} /* end of parallel section */
А для NREC = NLIG = 1024 и выше, в 8-ядерной плате я получаю ускорение до 7. Проблема в том, что если я сравниваю окончательные результаты для переменной S2, она отличается от 1 до 5% от точных результатов, полученных в серийной версии. Что может быть причиной? Должен ли я использовать некоторые конкретные параметры компиляции, чтобы избежать этого странного поведения с плавающей точкой?