2010-01-21 9 views
7

Ich habe gerade angefangen zu lernen, wie man OpenMP verwendet. Ich versuche herauszufinden, warum der folgende Code nicht parallel mit Visual Studio 2008 ausgeführt wird. Es kompiliert und läuft gut. Es verwendet jedoch nur einen Kern auf meiner Quad-Core-Maschine. Dies ist Teil des Codes, den ich versuche, auf eine MATLAB Mex-Funktion zu portieren. Jeder Zeiger wird geschätzt.Versucht zu wissen, warum der OpenMP-Code nicht parallelisiert

#pragma omp parallel for default(shared) private(dz, t, v, ts_count) reduction(+: sum_v) 
for(t = 0; t<T; t++) 
{ 
    dz = aRNG->randn(); 
    v += mrdt* (tv - v) + 
     vv_v_sqrt_dt * dz + 
     vv_vv_v_dt*(dz*dz - 1.); 

    sum_v += v; 
    if(t == ts_count-1) 
    { 
     int_v->at_w(k++) = sum_v/(double)(t+1); 
     ts_count += ts; 
    } 
} 

Antwort

4

Die v Variable berechnet wird, um den v-Wert der vorherigen Iteration mit

for(t = 0; t<T; t++) { 
    ... 
    v += ... (tv - v) .... 
    ... 
    } 

Sie können das nicht tun, bricht es die Parallelität. Die Schleife muss in beliebiger Reihenfolge oder mit verschiedenen parallelen Blöcken gleichzeitig ohne Nebenwirkungen ausgeführt werden können. Auf den ersten Blick sieht es nicht so aus, als könnten Sie diese Art von Schleife parallelisieren.

+0

Sie sollten auch einen Blick auf Ihre se von einem Zufallsgenerator innerhalb der Schleife. Abhängig von der Implementierung kann sich dies auf eine freigegebene Ressource auswirken, wodurch Ihr Code effektiv serialisiert wird, wenn Sie das oben genannte Problem beheben. –

0

ich nicht ganz sicher bin, es ist schon eine lange Zeit, da ich OpenMP verwendet, aber Sie haben die Schleifenvariable t Satz als privat. Ist es das was du willst? Ist das nicht die Parallelisierungsvariable?

0

Eine Möglichkeit ist, dass Sie die Variable "sum_v" verwenden. Da Sie eine Reduktion durchführen, erwartet die Laufzeit wahrscheinlich, dass nur dort Werte akkumuliert werden und auf sie "normal" nur zugegriffen wird, nachdem die Schleife beendet ist.

Verwandte Themen