Die Parallelisierung verschachtelter Schleife in OpenMP mit #pragma parallel for shared
Ich bin versucht zu parallelisieren, ein code. Mein code sieht wie folgt aus -
#pragma omp parallel private(i,j,k)
#pragma omp parallel for shared(A)
for(k=0;k<100;<k++)
for(i=1;i<1024;<i++)
for(j=0;j<1024;<j++)
A[i][j+1]=<< some expression involving elements of A[i-1][j-1] >>
Auf dem ausführen dieses Codes, ich bin immer zu einem anderen Ergebnis über die serielle Ausführung der loops.
Ich bin nicht in der Lage zu verstehen, was ich falsch mache.
Ich habe auch versucht den Zusammenbruch()
#pragma omp parallel private(i,j,k)
#pragma omp parallel for collapse(3) shared(A)
for(k=0;k<100;<k++)
for(i=1;i<1024;<i++)
for(j=0;j<1024;<j++)
A[i][j+1]=<< some expression involving elements of A[][] >>
Andere Sache, die ich versuchte, war mit einem #pragma omp parallel vor jedem Schleifendurchlauf statt Kollaps().
Dem Problem, wie ich denke, ist die Daten-Abhängigkeit. Keine Ahnung, wie zu parallelisieren, im Falle von Daten-Abhängigkeit?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn das wirklich Ihre Nutzung Fall einfach parallelisieren, für die äußere Schleife,
k
diese sollten weitgehend ausreichen, um die bescheidenen Parallelität, dass Sie auf gemeinsamen Architekturen.Wenn du mehr willst, müsstest du wieder schreiben Sie Ihre Schleifen, so dass Sie einen inneren Teil, der nicht über die Abhängigkeit. In Ihrem Beispiel ist dies relativ einfach, müssten Sie den Prozess durch die "diagonalen" (äußere Schleife, sequentiell) und anschließend in der diagonalen, Sie würde unabhängig sein.
Teil dieses könnte automatisch erfolgen, aber ich glaube nicht, dass solche Werkzeuge sind bereits leicht umgesetzt im täglichen OMP. Dies ist eine aktive Linie der Forschung.
Beachten Sie auch die folgenden
int
ist selten eine gute Idee für Indizes, insbesondere, wenn Sie auf Matrizen. Wenn Sie zur Berechnung der absoluten position eines Eintrags selbst (und sehen Sie, dass Sie hier sein könnte) diese überläufe leicht.int
der Regel ist 32 bit breit und wird von diesen 32 sind Sie sogar verschwenden, eine für die Zeichen. In C -, Objekt-Größen berechnet werden, die mitsize_t
, die meisten der Zeiten, die 64 bit breit und wird in jedem Fall der richtige Typ gewählt, die durch Ihre Plattform-designer.Sind Sie nur die Parallelisierung der äußeren 'k' for-Schleife. Jeder parallel-thread der 'i' und 'j' - Schleifen, und Sie sind alle schreiben in der gleichen 'Ein' Ergebnis. Da Sie alle Lesen und schreiben die gleichen Steckplätze in Einem, das Ergebnis ist nicht-deterministisch.
Es ist nicht klar, von Ihrem problem, das jede Parallelität wird möglich, da jeder Schritt scheint zu hängen, auf jeden vorherigen Schritt.