2016-07-13 6 views
0

Ich versuche, Openmp zu verwenden, um meinen Code mit Odeint und Openmp zu parallelisieren, aber wenn ich die Anzahl der Threads ändern, funktioniert die Parallelität nicht, die Zeit zum Abschluss der Ausführung verbessert sich nicht. Was mache ich falsch?Verwendung von Openmp mit Odein

Hier sind die wesentlichen Teile des Codes:

using namespace boost::numeric::odeint; 
using namespace std; 
typedef std::vector<double> state_type; 

struct ode { 
    void operator()(const state_type &XY , state_type &dUdt , double t) { 

    const size_t N = XY.size(); 

    #pragma omp parallel for schedule(runtime) 
    for (size_t aux = 0; aux <= N; aux++) { 

     dUdt[0] = XY[1]; 
     dUdt[1] = 2 * w * XY[3] + 3 * (w * w) * XY[0]; 

    } 
    } 
}; 

main() { 

    typedef runge_kutta4< 
       state_type , double , 
       state_type , double , 
       openmp_range_algebra 
      > rk4; 

    state_type XY(2); 

    int number_threads = 1; 

    omp_set_num_threads(number_threads); 
    int chunk_size = omp_get_max_threads(); 
    omp_set_schedule(omp_sched_static , chunk_size); 

    integrate_n_steps(rk4() , ode() , XY , 0.0 , 0.00001 , 200); 

} 

ich mir klar hoffe genug gewesen, würde ich nur in der Lage sein mag OpenMP mit meinem Code zu verwenden.

Vielen Dank für Ihre Hilfe.

+0

'Aux' Variable wird nicht in dieser For-Schleife verwendet, möglicherweise Compiler/Laufzeit ist schlau genug, um das zu bemerken (obwohl es a Warnung?) und parallelisiert nichts. Umfassen die Compileroptionen '-fopenmp'? –

Antwort

0

Ihr Status hat Größe 2. Dies ist viel zu klein, um eine Verbesserung durch die Parallelisierung zu erwarten. Versuchen Sie ein Beispiel mit ~ ~ 1000 Variablen und sehen Sie, wenn Sie etwas Verbesserung finden ...

+0

Ich habe es versucht, aber nicht funktionieren. Wenn ich die Methode omp_get_num_threads() innerhalb der Beobachterfunktion aufrufen, sehe ich, dass die Anzahl der Threads immer 1 ist. Ich verstehe nicht, was ich falsch mache. Es gibt einen Weg der Veränderung es? –

+0

Der Beobachter wird nicht automatisch parallelisiert. Der Aufruf von omp_get_num_threads() funktioniert nur innerhalb einer parallelen Region – mariomulansky