2017-03-15 3 views
0

Ich möchte OpenMP verwenden, um Multithread anzuwenden. Hier ist ein einfacher Code, den ich geschrieben habe.OpenMP Doppel für Schleife

vector<Vector3f> a; 
int i, j; 
for (i = 0; i<10; i++) 
{ 
    Vector3f b; 
#pragma omp parallel for private(j) 

    for (j = 0; j < 3; j++) 
    { 
     b[j] = j; 
    } 
    a.push_back(b); 
} 

for (i = 0; i < 10; i++) 
{ 
    cout << a[i] << endl; 
} 

ich möchte es Werke lik ändern:

parallel for1 
{ 
    for2 
} 

oder

for1 
{ 
    parallel for2 
} 

-Code funktioniert, wenn Pragma Linie gelöscht. aber es funktioniert nicht, wenn ich es benutze. Was ist das Problem?

///////// Added

Eigentlich benutze ich OpenMP zu komplizierteren Beispiel Doppel für Schleife Frage.

hier, auch wenn ich MP nicht anwenden, funktioniert es gut. Aber wenn ich es anwende, tritt der Fehler an Vektor push_back Linie auf.

vector<Class> B; 
for 1 
{ 
    #pragma omp parallel for private(j) 
    parallel for j 
    { 
     Class A; 
     B.push_back(A); // error!!!!!!! 
    } 
} 

Wenn ich B.push_back (A) Zeile lösche, funktioniert es auch, wenn ich MP anwende.

Ich konnte keine genaue Fehlermeldung finden, aber es sieht aus wie Ausnahmefehler über Vektor ich denke. Debug hält an

void _Reallocate(size_type _Count) 
    { // move to array of exactly _Count elements 
    pointer _Ptr = this->_Getal().allocate(_Count); 

    _TRY_BEGIN 
    _Umove(this->_Myfirst, this->_Mylast, _Ptr); 
+1

Bitte fügen Sie Ihre Fehlermeldungen hinzu. Warum deklarieren Sie auch Variablen im C89-Stil, während Sie C++ verwenden? –

+0

Bitte erstellen Sie ein [mcve]. Die Diskussion der Parallelisierung Ihres Beispiels ist nicht wirklich nützlich, da der gesamte Code wahrscheinlich einige Mikrosekunden braucht. Es wäre viel produktiver, wenn Sie etwas präsentieren könnten, bei dem die Parallelisierung tatsächlich Sinn macht. – Zulan

+0

Ich habe mehr Zeilen hinzugefügt! – Wooni

Antwort

1

std::vector::push_back ist nicht Thread-sicher, rufen Sie an, dass nicht ohne Schutz gegen Rennbedingungen von mehreren Threads.

Bereiten Sie den Vektor stattdessen so vor, dass die Größe bereits korrekt ist, und fügen Sie die Elemente dann über operator[] ein.

Alternativ können Sie das Einfügen mit einem kritischen Bereich schützen:

#pragma omp critical 
B.push_back(A); 

Auf diese Weise nur einen Thread zu einem Zeitpunkt wird das Einsetzen tun, die den Fehler beheben, sondern den Code verlangsamen.

Im Allgemeinen denke ich, dass Sie die Parallelisierung nicht richtig angehen, aber es gibt keine Möglichkeit, ohne eine klarere und repräsentativere Problembeschreibung bessere Ratschläge zu geben.

+0

Danke. das funktioniert. Wie Sie bereits erwähnt haben, funktioniert es nicht perfekt als Parallelisierung. Ich muss mehr studieren. – Wooni

+0

Wenn die Antwort Ihr ursprüngliches Problem löste, markieren Sie es bitte als angenommen, indem Sie auf das Häkchen ✅ klicken. Für eine mögliche Follow-up-Frage zur parallelen Beschleunigung erstellen Sie bitte ein [mcve] und beschreiben Sie Ihre beobachtete Leistung und den verwendeten Compiler und das System. – Zulan