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!


Log in to reply