Comment faire pour accélérer la multiplication de matrice en C++?

Je suis d'effectuer la multiplication de matrice avec cet algorithme simple. Pour être plus souple, j'ai utilisé des objets de la matricies qui contiennent dynamicly créé des tableaux.

Comparant cette solution pour mon premier avec des tableaux statiques, c'est 4 fois plus lent. Que puis-je faire pour accélérer l'accès aux données? Je ne veux pas modifier l'algorithme.

 matrix mult_std(matrix a, matrix b) {
 matrix c(a.dim(), false, false);
 for (int i = 0; i < a.dim(); i++)
  for (int j = 0; j < a.dim(); j++) {
   int sum = 0;
   for (int k = 0; k < a.dim(); k++)
    sum += a(i,k) * b(k,j);
   c(i,j) = sum;
  }

 return c;
}


MODIFIER


J'ai corrigé ma Question avove! J'ai ajouté le code source complet ci-dessous et essayé quelques-uns de vos conseils:

  • échangé k et j itérations de boucle -> l'amélioration de la performance
  • déclaré dim() et operator()() comme inline -> l'amélioration de la performance
  • passage des arguments par référence const -> perte de performance! pourquoi? donc je ne l'utilise pas.

La performance est maintenant de plus près le même qu'il était dans l'ancien porgram. Peut-être il devrait y avoir un peu plus d'amélioration.

Mais j'ai un autre problème: j'obtiens une erreur de mémoire dans la fonction mult_strassen(...). Pourquoi?

terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc


ANCIEN

principal.c http://pastebin.com/qPgDWGpW

c99 main.c -o matrix -O3


NOUVEAU PROGRAMME

la matrice.h http://pastebin.com/TYFYCTY7

matrix.cpp http://pastebin.com/wYADLJ8Y

main.cpp http://pastebin.com/48BSqGJr

g++ main.cpp matrix.cpp -o matrix -O3.


MODIFIER


Voici quelques résultats. La comparaison entre l'algorithme standard (std), échangé ordre de j et k de la boucle (swap) et bloqué algortihm avec une taille de bloc 13 (bloc).
Comment faire pour accélérer la multiplication de matrice en C++?

  • Avez-vous l'intention d'écrire une matrice de multiplier qui ne fonctionne que sur les matrices carrées? Multipliez est défini en tant que les dimensions intérieures sont égaux.
  • Vous êtes de passage a et b par référence, non? Vous n'êtes pas la copie de deux matrices juste d'appeler cette fonction?
  • Vous pouvez également utiliser Propre, qui est particulièrement bien adaptée. (Ne laissez pas la licence LGPL vous faire peur - c'est un en-tête de la seule bibliothèque, et le "virale" termes de la licence LGPL ne pas tenir. Voir FAQ.)
  • les copies sont gommés par le compilateur, le passage par valeur est aussi rapide, voire plus rapide que par référence.
  • Qui n'est pas universellement vrai. Avez-vous vu le constructeur de copie de code pour class matrix? Si non, vous êtes juste de faire une sauvage deviner.
  • Je ne veux pas inventer la whell un deuxième temps. C'est un projet pour tester un algorithme de multiplication de matrice. Je commence la mise en œuvre en C, et a obtenu ces pertes de performances maintenant en C++. Je ne veux pas utiliser cet algorithme, je veux juste mesure de la performance. Je n'ai pas besoin d'une bibliothèque.
  • Pouvez-vous passé le code en question. Les liens ne sont plus de travail pour moi.
  • OK. J'ai une copie du code. C'est comme comparer des pommes à des oranges. 1) Mettre le code dans le même harnais de test. 2) effectuer les mêmes opérations (Dans la version C++ vous n'êtes pas simplement en multipliant vous êtes également l'allocation de mémoire).
  • J'ai trouvé le problème principal. Votre code C a un énorme dépassement de la mémoire tampon. C'est de réinitialiser le dim variable globale à l'origine de votre multiplication de sortie précoce.
  • York: Désolé, c'était une erreur, parce que des tests de différentes gammes.
  • Vous avez des fuites de mémoire toute la place dans ce code, qui est une grande partie de la raison passe-par-valeur est plus rapide que de passer par-const-référence. Est mult_strassen votre mise en œuvre de la "bloquer l'accès de la tendance" je l'ai suggéré, ou n'avez-vous pas posté ce code?

InformationsquelleAutor multiholle | 2010-11-29