OpenMP的数值积分逼近

时间:2013-02-22 02:22:54

标签: 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 = 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;

}

对我所做错的任何见解都会非常感激。 -Thanks

1 个答案:

答案 0 :(得分:0)

使用您的代码,您需要b和a来获取所有线程的正确值。

  

b = i * interval;

     

a = b +间隔;

另外,在计算积分时会引入额外的翻转

  

积分+ =((sin(((b + a)/ 2))+ 1)*(间隔));

     

更改为积分+ = sin((b + a)/ 2)+ 1.0;

     

for for循环

     

积分* =间隔;