2017-01-10 1 views
0

#pargma omp parallel for erfordert, dass die Schleifenvariable eine ganze Zahl ist. Was passiert also, wenn die Schleifenvariable keine Ganzzahl ist, wie in diesem Beispiel?OpenMP: Was passiert, wenn die Schleifenvariable keine Ganzzahl ist, wie in diesem Beispiel?

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

Wie konvertiert man dieses Programm in ein OpenMP? Danke

+0

Warum sind Sie Slice für den Schleifenzähler anstatt Partitionen? –

+0

Eigentlich beginne ich gerade openMP zu lernen und ich fand diese Frage eine Herausforderung für mich, wenn Sie den obigen seriellen Code ausführen, wird es richtig laufen, um die Integration mit der Funktion f (x) = sin (x/2) +1 zwischen Pi zu berechnen/2 und 2 Pi, – Ahmed

+0

so ist das Problem "#pragma omp parallel für" erfordert Integer-Loop-Variable .. was, wenn nicht ganzzahlig? – Ahmed

Antwort

1

Zuerst sollten Sie ein wenig vorsichtiger mit dem Stil Ihres Codes sein, vor allem mit der Einrückung. Code wie

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

kann sehr irreführend sein, und Sie Ihr Leben viel einfacher, wenn es als

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

statt zu schreiben.

In Bezug auf Ihr Problem, wie von Andrew erwähnt, können Sie es ganz durch Schleifen über die Partitionen mit einer Integer-Variablen vermeiden kann, das heißt,

#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

vielen dank für ihre bemühungen <> Vielen Dank Man. – Ahmed

Verwandte Themen