2017-01-10 7 views
0

#pragma omp parallel forには、ループ変数が整数であることが必要です。ループ変数がこの例のように整数でない場合はどうなりますか?OpenMP:ループ変数がこの例のように整数でないとどうなりますか?

#include <stdio.h> 
    #include <math.h> 

    #define START (M_PI/2) 
    #define END (M_PI*2) 

    double f(double x) 
    { return sin(x/2)+1; 
    } 

    int main(int argc, char *argv[]) 
    { double total = 0, x; 
    int partitions; 
    double slice; 

    printf("How many partitions? "); fflush(stdout); 
    scanf("%d", &partitions); 
    slice = (END-START)/partitions; 
    for (x = START + (slice/2); x < END; x = x + slice) 
    total = total + f(x); 
    total = total * slice; 

    printf("The integration is %1.20f\n", total); 
    } 

このプログラムをOpenMPに変換するにはどうすればよいですか? ありがとう

+0

なぜあなたではなく、パーティションよりもループカウンタ用のスライスを使用していますか? –

+0

実際に私はopenMPの学習を始めました。上記のシリアルコードを実行すると、関数f(x)= sin(x/2)+1を使って積分を計算するために正しく実行されます。/2と2 Pi、 – Ahmed

+0

です。問題は "#pragma omp parallel for"には整数ループ変数が必要です。 – Ahmed

答えて

1

まず、コードのスタイルに、特にインデントで注意する必要があります。

for (x = START + (slice/2); x < END; x = x + slice) 
total = total + f(x); 
total = total * slice; 

のようなコードは非常に誤解を招くことができ、その代わりに

for (x = START + (slice/2); x < END; x = x + slice) { 
    total = total + f(x); 
} 
total = total * slice; 

としてそれを書くとき、あなたはあなたの人生ははるかに容易になります。

あなたの問題については、アンドリューで述べたように、あなたは整数変数でパーティションをループすることにより、それを完全に避けることができ、すなわち、

#pragma omp parallel for private(x) reduction(+:total) 
for(int i = 0; i < partitions; i++) { 
    x = START + slice/2 + i*slice; 
    total = total + f(x); 
} 
total = total * slice; 
+0

私は本当にありがとうございました。 – Ahmed

関連する問題