2017-02-13 5 views
1

Wenn ich eine Reihe von OpenMP-Aufgaben erstelle und nicht verwende, wo wartet das Programm auf den Abschluss dieser Aufgaben? Betrachten Sie das folgende Beispiel:Warten auf OpenMP-Aufgabenabschluss bei impliziten Barrieren?

#pragma omp parallel 
{ 
    #pragma omp single 
    { 
     for (int i = 0; i < 1000; i++) { 
     #pragma omp task 
     ... // e.g., call some independent function 
     } 
     // no taskwait here 
    } 
    // all the tasks completed now? 
} 

Wartet das Programm für die Erledigung der Aufgabe an der impliziten Barriere am Ende des single Block? Ich nehme an, aber kann keine Informationen zu diesem Problem in der OpenMP-Spezifikation finden.

EDIT

Von barrier Beschreibung in OpenMP Spec .:

Alle Fäden des Teams muß die Bindung parallel Region Ausführung den Barrierebereich ausführen und vollständige Ausführung aller expliziten Aufgaben gebunden zu diesem parallelen Bereich vor jeder weiter Ausführung über die Barriere hinaus.

Dies sagt jedoch nicht, ob ich für die Aufgabenvervollständigung verantwortlich bin oder die OpenMP-Laufzeit für mich.

Antwort

1

Task Completion in OpenMP ist implizit und nicht explizit (1.2.5 Tasking Terminology)

AufgabenerledigungTask Completion tritt auf, wenn das Ende des Blocks strukturierten assoziiert mit dem konstruieren das erzeugte Aufgabe ist erreicht.

Es gibt eine implizite Barriere am Ende des single Worksharing-Konstrukts. Wie Sie bereits erwähnt haben, warten Barrieren auf explizite Aufgaben. Daher werden alle Aufgaben im Block single erledigt.

+0

Danke. Ich habe nicht erwartet, dass dies im Glossarbereich der Spezifikation definiert wird. –