La parallélisation OpenMP la matrice de multiplication par un triple boucle for (problème de performance)

Je suis en train d'écrire un programme de multiplication de matrice avec OpenMP, qui, pour le cache de commodité, met en œuvre la multiplication de A x B(transpose) rangées X lignes au lieu de la classique de A x B lignes x colonnes, pour une meilleure efficacité de la mémoire cache. Faisant cela, j'ai fait face à un fait intéressant que pour moi, c'est illogic: si, dans ce code, je l'ai paralléliser le extern boucle le programme est plus lent que si je mets les directives OpenMP dans la plus à l'intérieur de la boucle, dans mon ordinateur les temps sont de 10,9 vs 8,1 secondes.

//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)
    }
  }
}
En jouant sur omp paramètres j'ai 200% de la vitesse sur ma machine. original: llcomp.googlecode.com/hg/examples/mxm.c: codepad.org/nSfZHp03
Solution sympa. Ouais, OpenMP est un peu délicat
Le Code qui utilise 'fortran' disposition de la mémoire pour le B matrice fonctionne 4-8 plus rapide (le plus grand bénéfice) pour 1000x1000 matrices (version filetée prend 0.5 secondes). gist.github.com/790865
Avez-vous évalué votre Gflops/s? Il devrait être de 2,0*n^3/heure. Comparez cela avec le max pour votre PROCESSEUR: fréquence * (SIMD_width)* (2 ILP) * (nombre de cœurs). e.g sur mon 2600k c'est (4GHz) * 4(AVX) * 2 (ILP) * 4 carottes = 128 DP Gflops/s. Probablement, votre efficacité est inférieure à 10%.

OriginalL'auteur sdffadsf | 2011-01-18