C OpenMP的数值积分逼近
我有一些C OpenMP代码,它使用中点规则近似sin(x)+1的积分。当我有一个或两个线程时,代码可以工作,但是当我有两个以上的线程时,近似值是不正确的。下面是我的代码C OpenMP的数值积分逼近,c,multithreading,openmp,C,Multithreading,Openmp,我有一些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
#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;
#包括
#包括
#包括
#包括
int main(){
整数比例=10;
双区间=0,积分=0,a=0,b=0;
int i=0,j=0,tid=0;
间隔=5*M_PI/(双)个单位;
双启动=omp_get_wtime();
#pragma omp并行num_线程(4)
{
#pragma omp用于firstprivate(b、a、tid)缩减(+:整数)
对于(i=0;i
}
任何关于我做错了什么的见解都将不胜感激。
-谢谢你的代码,你需要b和a来为所有线程获得正确的值 b=i*间隔 a=b+间隔 此外,在计算积分时还引入了一个额外的触发器 积分+=((sin((b+a)/2))+1)*(区间))强> 变为积分+=sin((b+a)/2)+1.0 在for循环之后 积分*=区间
并行循环的所有迭代都以相同的
a
值开始,该值等于0
。