Was ist der richtige Weg, um eine multidimensionale peinlich parallele Schleife in OpenMP zu parallelisieren? Die Anzahl der Dimensionen ist zur Kompilierungszeit bekannt, aber die Dimensionen sind nicht groß. Jeder von ihnen kann eins, zwei oder eine Million sein. Sicherlich will ich nicht N omp parallel
für eine N-dimensionale Schleife ...
Gedanken:
Das Problem ist konzeptionell einfach. Nur die äußerste "große" Schleife muss parallelisiert werden, aber die Schleifenabmessungen sind zur Kompilierzeit unbekannt und können sich ändern.
Wird omp_set_num_threads(1)
und #pragma omp for schedule(static, huge_number)
dynamisch gesetzt, um bestimmte Loop-Parallelisierungen zu einem No-Op zu machen? Wird dies unerwünschte Nebenwirkungen / Overhead haben? Fühlt sich an wie ein Kludscher.
Die OpenMP-Spezifikation (2.10, A.38, A.39) sagt den Unterschied zwischen übereinstimmenden und nicht übereinstimmenden geschachtelten Parallelismus, aber schlägt nicht den besten Ansatz für dieses Problem vor.
Das Umordnen der Schleifen ist möglich, kann jedoch zu vielen Cache-Fehlern führen. Abrollen ist möglich, aber nicht trivial. Gibt es einen anderen Weg?
Folgendes möchte ich parallelisieren:
%Vor%Danke!
Die collapse
-Direktive ist wahrscheinlich das, wonach Sie suchen hier . Dies wird im Wesentlichen eine einzige Schleife bilden, die dann parallisiert wird und für genau diese Art von Situationen ausgelegt ist. Du würdest also tun:
und alles bereit sein.
Tags und Links c parallel-processing openmp nested-loops