2016-07-04 14 views
1

Ich bin ein OpenMP Anfänger und from what I've read#pragma omp parallel:OpenMP: warum #pragma openmp parallel sollte ohne nützlich sein?

es ein Team von N Threads erstellt ..., die alle die nächsten Anweisung ausführen ... Nach der Anweisung, verbinden sich die Fäden wieder in eine .

Ich kann nicht ein Beispiel vorstellen, wo dies ohne das for Schlüsselwort nach der Richtlinie oben geschrieben nützlich sein könnte. Was ich meine ist, dass das Schlüsselwort for die Iterationen zwischen den Threads des Teams aufteilt, während mit der obigen Direktive der folgende Block/die folgende Anweisung von allen Threads ausgeführt wird und es keine Leistungsverbesserung gibt. Kannst du mir bitte helfen, es zu klären?

+2

Schauen Sie auf OpenMP Aufgaben ... –

Antwort

1

Sie können Ihren eigenen Mechanismus bereitstellen, der den Job in parallele Teile aufteilt, aber OpenMP für Parallelität verwendet.

Hier ist ein hypothetisches Beispiel, das OpenMP verwendet einige Operationen aus der Warteschlange entfernt und dann parallel laufen:

#pragma omp parallel 
{ 
    operation op; 
    while(queue.tryDequeue(&op)) 
     op.run(); 
} 

Die Implementierung von queue.tryDequeue muss Thread-sicher, dh bewacht von kritischem Abschnitt/Mutex oder sperrt frei Implementierung.

Um effizient sein, die Umsetzung der op.run() CPU-schwer sein muss, dauern viel länger als queue.tryDequeue() Andernfalls werden Sie die meiste Zeit verbringen, dass die Warteschlange zu blockieren, und nicht die parallelizable Arbeit zu tun.

+0

Tolles Beispiel, danke – justHelloWorld

+0

Danke für Ihre Antwort. Könnten Sie bitte einen Blick auf diese Frage (http://stackoverflow.com/questions/38198491/openmp-should-i-use-critical-or-atomic) werfen? – justHelloWorld

0

Das for-Schlüsselwort teilt die Arbeit nicht !!!

Sie müssen daran denken, dass die Arbeit teilen bedeutet, dass jeder Thread einen Abschnitt Ihrer Schleife ausführt. Wenn Sie sich mit #pragma omp parallel bestehen dann sein wie diese

#pragma omp parallel 
{ 
    #pragma omp for 
    for(int i= 1...100) 
    { 
    } 
} 

der obige Code, was tut, ist teilt die for-Schleife unter n Fäden und für jede für n Fäden etwas im Inneren des #pragma omp erklärt, ist das Privat Variable zu diesem Thread. Dies gewährleistet die Sicherheit des Gewindes und bedeutet auch, dass Sie für das Sammeln von Daten verantwortlich sind, z. B. mit Reduzierungen

+0

Danke für Ihre Antwort. Könnten Sie bitte einen Blick auf diese Frage (http://stackoverflow.com/questions/38198491/openmp-should-i-use-critical-or-atomic) werfen? – justHelloWorld