OpenMP-Parallelisierung der Matrixmultiplikation durch eine dreifache for-Schleife (performance-Problem)

Ich Schreibe ein Programm für die matrix-Multiplikation mit OpenMP, dass, für den cache die Bequemlichkeit, implementiert die Multiplikation A x B(transponiert) Zeilen X Zeilen anstelle der klassischen A-x B Zeilen x Spalten, für eine bessere cache-Effizienz. Dies zu tun, vor denen ich Stand, eine interessante Tatsache für mich ist das illogic: wenn in diesem code habe ich parallelisieren der extern-Schleife das Programm ist langsamer als wenn ich die OpenMP-Anweisungen in der innersten Schleife, in meinem computer die Zeiten sind 10.9 vs 8,1 Sekunden.

//A and B are double* allocated with malloc, Nu is the lenght of the matrixes 
//which are square

//#pragma omp parallel for
for (i=0; i<Nu; i++){
  for (j=0; j<Nu; j++){
    *(C+(i*Nu+j)) = 0.;
#pragma omp parallel for
    for(k=0;k<Nu ;k++){
      *(C+(i*Nu+j))+=*(A+(i*Nu+k)) * *(B+(j*Nu+k));//C(i,j)=sum(over k) A(i,k)*B(k,j)
    }
  }
}
  • Von tweaking omp Parameter habe ich 200% Geschwindigkeit auf meiner Maschine. original: llcomp.googlecode.com/hg/examples/mxm.c Strom: codepad.org/nSfZHp03
  • Schöne Lösung. Ja, OpenMP, ist ein bischen tricky
  • Code, der verwendet 'fortran' Speicher-layout für die B matrix läuft 4-8 schneller (der größte Vorteil) für 1000x1000-Matrizen (Gewinde-version nimmt 0.5 Sekunden). gist.github.com/790865
  • Haben Sie schätzt Ihren Gflops/s? Sollte es 2.0*n^3/Zeit. Vergleichen Sie das mit den max für deine CPU: Häufigkeit * (SIMD_width)* (2 ILP) * (Anzahl der Kerne). e.g auf meinem 2600k ist (4GHz) * 4(AVX) * 2 (ILP) * 4 Kerne = 128 DP-Gflops/s. Wahrscheinlich, Ihr Wirkungsgrad ist weniger als 10%.
InformationsquelleAutor sdffadsf | 2011-01-18
Schreibe einen Kommentar