OpenMP Vektorisierung Hilfe
-
Ich würde auf meinem AVX-fähigen Rechner gerne die Autovektorisierung von OpenMP ausprobieren. Leider führt das hier, so einfach es auch erscheinen mag, nicht zu dem Assemblercode, den ich erwarten würde.
#include <iostream> #include <omp.h> using namespace std; #define N 4096 int main() { float *a = new float[N]; float *b = new float[N]; float *c = new float[N]; for(int i = 0; i < N; i++) { a[i] = b[i] = i; } #pragma omp simd for( int i = 0; i < N ; i++) { c[i] = a[i] + b[i]; } return 0; }
Kompilieren tu ich mit
g++ -S -ftree-vectorizer-verbose=2 -O3 -fopenmp main.cpp
Kann man das ganze Programm auf einfache Weise verbessern?
Eventuell Memory-Alignment? (Wobei ich dachte, dass bei den neuen AVX-Sachen die Voraussetzungen wegfallen)
Vielleicht zusätzliche Compiler-Anweisungen?
-
Vielleicht musst du
-mavx
angeben.
-
Hmm, das werden jetzt auf jeden Fall schon mal die ymm-Register verwendet.
Das sieht schon besser aus, wenngleich noch nicht optimal (ich glaube da sind einige unnütze Kopieroperationen).Also muss ich, um AVX zu nutzen trotz SIMD-Direktive mit -mavx kompilieren.
Vielen Dank für den Hinweis!