我有一些 C OpenMP 代码,它使用中点规则来近似 sin(x)+1 的积分。当我有一个或两个线程时,代码可以工作,但是当我超过两个线程时,近似值是不正确的。下面是我的代码。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <omp.h>
int main(){
int numPartitions = 10;
double interval = 0, integral = 0, a = 0, b = 0;
int i = 0, j = 0, tid=0;
interval=5*M_PI/(double)numPartitions;
double start = omp_get_wtime();
#pragma omp parallel num_threads(4)
{
#pragma omp for firstprivate(b,a,tid) reduction(+:integral)
for (i = 0; i < numPartitions; i++)
{
tid=omp_get_thread_num();
b = a;
a = a+interval;
integral += ((sin(((b+a)/2))+1)*(interval));
}
}
double end = omp_get_wtime();
printf("Estimate of integral is: %10.8lf\n", integral);
printf("Time=%lf\n", end-start);
return 0;
}
任何关于我做错了什么的见解将不胜感激。-谢谢