1

中点規則を使用して sin(x)+1 の積分を近似する C OpenMP コードがあります。スレッドが 1 つまたは 2 つの場合はコードが機能しますが、スレッドが 2 つを超えると近似値が正しくありません。以下は私のコードです。

#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;

}

私が間違っていることについての洞察は大歓迎です。-ありがとう

4

1 に答える 1

0

あなたのコードでは、すべてのスレッドの正しい値を得るために b と a が必要です。

b = i * 間隔;

a = b + 間隔;

また、積分の計算中に余分なフロップを導入します

積分 += ((sin(((b+a)/2))+1)*(間隔));

積分に変更 += sin((b+a)/2) + 1.0;

for ループの後

積分 *= 間隔;

于 2013-04-03T13:01:59.683 に答える