2016-07-11 8 views
2

Ich bin eine Laufzeitbibliothek für eine sehr kleine Teilmenge von OpenMP implementieren und ich bleibe bei der Semantik der Task und Taskwait Konstrukte stecken.OpenMP Task und Taskwait Konstrukte

Zum Verständnis habe ich das folgende Codebeispiel erstellt. Darf das System nicht in eine Live-Lock-Situation eintreten? Für die "Task2" warten Tasks darauf, Daten zu konsumieren, die von 'task1'-Task erzeugt werden, aber' Task1 'ist "Task-Waiting" für alle Kinder, die fertig sind? Wenn ich dieses Snippet mit GOMP und Intel OMP ausprobiere, beendet das Programm die Ausführung normal.

#include <stdio.h> 
#include <math.h> 
#include <omp.h> 
#include <time.h> 
#include <cstdlib> 

int result; 

void task2(int* res) { 
    printf("Task2... %p\n", res); 

} 

void task1(int* res) { 
    printf("Task1... %p\n", &result); 

    #pragma omp task depend(in:result) 
    task2(&result); 

    #pragma omp taskwait 
    printf("Task1 finishing...\n"); 
} 

int main() { 
    int res = 0; 

    #pragma omp parallel 
    #pragma omp single 
    { 
     printf("Res addr = %p\n", &result); 

     #pragma omp task depend(inout:result) 
     task1(&result); 
    } 

    return 0; 
} 

Antwort

2

Die task depend-Klauseln gelten nur für Geschwisteraufgaben. In diesem Fall ist task2 kein Geschwister, sondern eine untergeordnete Aufgabe von task1.

den entsprechenden Abschnitt der OpenMP 4.5 Zitiert:

[2.13.9] Für die inAbhängigkeit vom Typ, wenn die Speicherstelle von mindestens einer der die Listenelemente ist die gleiche wie die Speicherstelle eines Listenelement in einem aus oder INOUT-Abhängigkeit vom Typ Liste eines task Konstrukt fr erscheinende Wenn eine Geschwisteraufgabe zuvor generiert wurde, wird die generierte Aufgabe eine abhängige Aufgabe dieser Geschwisteraufgabe sein.

+0

Hallo! Danke für die Antwort, das macht Sinn. Ich habe aber noch eine Frage: Werden Tasks, die von anderen Tasks erstellt wurden, sofort ausgeführt? – JohnTortugo

+0

Vielleicht, aber nicht garantiert. "Der antreffende Thread kann die Aufgabe sofort ausführen oder die Ausführung verzögern. Im letzteren Fall kann jedem Thread im Team die Aufgabe zugewiesen werden." – Zulan

+0

Denken Sie also, dass dies implementationsabhängig ist? Oder hast du eine Vorstellung davon, wie das entschieden wird? – JohnTortugo