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;
}
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
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
Denken Sie also, dass dies implementationsabhängig ist? Oder hast du eine Vorstellung davon, wie das entschieden wird? – JohnTortugo