Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C OpenMP的数值积分逼近_C_Multithreading_Openmp - Fatal编程技术网

C OpenMP的数值积分逼近

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

我有一些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;
#包括
#包括
#包括
#包括
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