2016-03-19 8 views
1

Hallo Ich lese diese Website http://www.viva64.com/en/a/0054/ und für Punkt Nummer 17, heißt es, dass der Code unten ohne die Barriere falsch ist. Warum ? Ich lese um http://bisqwit.iki.fi/story/howto/openmp/#BarrierDirectiveAndTheNowaitClause gibt es eine implizite Barriere am Ende jedes Parallelblocks und am Ende jedes Abschnitts, für und einzelne Anweisung, es sei denn, die Nowait-Direktive wird verwendet.OpenMP implizite Barriere

struct MyType 
{ 
    ~MyType(); 
}; 
MyType threaded_var; 
#pragma omp threadprivate(threaded_var) 
int main() 
{ 
    #pragma omp parallel 
    { 
      ... 
      #pragma omp barrier // code is wrong without barrier. 
    }  
} 

Jemand erklären mir bitte. Danke

+1

Soweit verstehe ich [es ist eine Umsetz icit-Barriere am Ende einer parallelen Region] (https://computing.llnl.gov/tutorials/openMP/#ParallelRegion). Angenommen, das ist richtig, denke ich, Punkt Nummer 17 ist falsch in der Verbindung. –

+0

Überprüfen Sie nur die OpenMP 4.5-Spezifikation und es heißt "Es gibt eine implizite Barriere am Ende des parallelen Konstrukts." –

+0

Die Spezifikation besagt "Die Speicherung aller Kopien einer threadprivate-Variablen wird freigegeben, je nachdem, wie statische Variablen in der Basissprache behandelt werden, aber an einem nicht angegebenen Punkt im Programm." –

Antwort

0

Die verlinkte Webseite ist falsch über diesen Punkt. Es gibt tatsächlich eine implizite Barriere am Ende des parallelen Abschnitts.

Da die Website einen Windows Fokus zu haben scheint und MS unterstützt nur die OpenMP-Standard 2.0, könnte es sich lohnen, unter Hinweis darauf, dass diese implizite Barriere in dem aktuellen Standard 4.5 ist nicht nur, sondern auch in der Version 2.0:

nach Beendigung des Parallelkonstrukts, das Gewinde im Team synchronisieren bei einer impliziten Sperre, [...]

http://www.openmp.org/mp-documents/cspec20.pdf