OpenMP Paralelization hemmt die Vektorisierung

8

Ich bin neu bei OpenMP und ich versuche, folgenden Code mit OpenMP zu paralelisieren:

%Vor%

Paralelize den äußeren Zyklus ist ziemlich geradlinig, aber um es zu optimieren, wollte ich paralelize den innersten Zyklus (der iterating über i). Aber wenn ich das so versuche:

%Vor%

Der Vektor wird nicht durch den Compiler vektorisiert ("Schleife für Vektorisierung wegen möglichen Aliasing"), wodurch er langsamer läuft. Ich habe es mit gcc -ffast-math -std=c++11 -fopenmp -O3 -msse2 -funroll-loops -g -fopt-info-vec prog.cpp

kompiliert

Danke für irgendeinen Rat!

EDIT: Ich verwende __restrict Schlüsselwort für die Arrays.

EDIT2: Interessant ist, dass, wenn ich nur das Pragma im inneren Zyklus behalte und es vom Äußeren entferne, gcc es vektorisieren wird. Das Problem tritt nur dann auf, wenn ich versuche, beide Zyklen parallel zu gestalten.

EDIT3: Der Compiler vektorisiert die Schleife, wenn ich #pragma omp parallel für simd verwende. Aber es ist immer noch langsamer als ohne die innere Schleife überhaupt zu parallelisieren.

    
Honza Dejdar 16.11.2016, 12:09
quelle

3 Antworten

1

Danke für die Antworten. Es gelang mir, die innere Schleife mit #pragma omp parallel for simd zu vektorisieren, aber das Programm war langsamer als ohne Parallelisierung. Ich fand schließlich einen etwas anderen Algorithmus, um das Problem zu lösen, das viel schneller ist. Danke für Ihre Hilfe Jungs!

    
Honza Dejdar 19.11.2016, 14:45
quelle
1

Nach der Parallelisierung der inneren Schleife hat Ihr Compiler die Spur von inA2 , inB2 und outX verloren. Standardmäßig wird davon ausgegangen, dass alle Speicherbereiche, auf die Zeiger zeigen, sich gegenseitig überlappen können. In der Sprache C führte der C99-Standard das Schlüsselwort restrict ein, das den Compiler darüber informiert, dass ein Zeiger auf einen Speicherblock zeigt, auf den kein anderer Zeiger zeigt. C ++ hat kein solches Schlüsselwort, aber zum Glück hat g++ eine entsprechende Erweiterung. Versuchen Sie also, __restrict zu den Deklarationen der von der Schleife berührten Zeiger hinzuzufügen. Ersetzen Sie beispielsweise

%Vor%

mit

%Vor%     
Sergey 16.11.2016 12:49
quelle
1

Haben Sie versucht, zuerst die innere Schleife zu drehen? und dann den parallelen Teil hinzufügen (was je nach Cache-Fehlschlägen zu einer langsameren Leistung führen kann)

%Vor%

Es dauert immer einige Zeit, bis ich das # pragma mit dem geteilten, öffentlichen usw. Recht habe ... Und ich habe das nicht getestet.

    
Holmz 19.11.2016 07:35
quelle

Tags und Links