Ich bin neu in OpenMP und ich versuche folgenden Code OpenMP zu paralelize:OpenMP paralelization hemmt Vektorisierung
#pragma omp parallel for
for(int k=0;k<m;k++)
{
for(int j=n-1;j>=0;j--)
{
outX[k+j*m] = inB2[j+n * k]/inA2[j*n + j];
for(int i=0;i<j;i++)
{
inB2[k*n+i] -= inA2[i+n * j] * outX[k + m*j];
}
}
}
Paralelize der äußere Zyklus ist ziemlich geradlinig, aber es zu optimieren, wollte ich das paralelize innerster Zyklus (der iterating über i) auch. Aber wenn ich versuche, dass wie dies zu tun:
#pragma omp parallel for
for(int i=0;i<j;i++)
{
inB2[k*n+i] -= inA2[i+n * j] * outX[k + m*j];
}
die Compiler vektorisiert nicht den inneren Zyklus („Schleife für die Vektorisierung versioniert wegen möglichen Aliasing“), die es langsamer laufen läßt. Ich kompilierte es mit gcc -ffast-math -std=c++11 -fopenmp -O3 -msse2 -funroll-loops -g -fopt-info-vec prog.cpp
Vielen Dank für jede Beratung!
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 also nur dann auf, wenn ich versuche, beide Zyklen zu paralelisieren.
EDIT3: Der Compiler wird die Schleife vektorisieren, wenn ich #pragma omp parallel für simd verwende. Aber es ist immer noch langsamer als ohne die innere Schleife überhaupt zu parallelisieren.
Es ist einfacher, manuell zu vektorisieren, als parallelisieren. Warum nicht einfach? (und automatische Parallelisierung beibehalten) –