Для шага суммирования в последнем цикле необходимо установить переменную nthreads
for(i=0, pi=0.0;i<nthreads;i++)pi += sum[i] * step;
Удаление назначения нарушит этот цикл.
Позвольте мне попытаться переформулировать комментарий, почему вы не можете просто сделать
nthreads = nthrds;
Если вы пишете в общую память из нескольких потоков без какой-либо защиты, это значение может быть неправильным. Тем не менее, как правило, обычно используется atomic
в качестве защиты. В этом случае #pragma omp single nowait
будет гораздо более подходящим. Я догадываюсь идея динамической записи этой переменной вместо простого использования NUM_THREADS
заключается в том, что вы не всегда можете гарантировать ее.
Во всяком случае. Этот урок очень проблематичен. Он пытается научить OpenMP с использованием сырых примитивов, а не с помощью идиоматических инструментов высокого уровня. Это вызывает много из путаницы . Я считаю, что это плохой подход к обучению OpenMP, особенно если вы не будете следовать учебнику до самого конца.
Правильный способ сделать это на самом деле дан позже в уроке (с некоторой модернизацией мной):
double sum = 0.0;
int step = 1.0/(double) num_steps;
omp_set_num_threads(NUM_THREADS);
#pragma omp parallel for reduction(+:sum)
for (int i=0; i < num_steps; i++) {
double x = (i+0.5)*step;
sum = sum + 4.0/(1.0+x*x);
}
double pi = step * sum;