Question

Je suis en train de trouver des points de repère multiplication / inversion matrice en ligne. Mon implémentation C ++ peut actuellement inverser une matrice de 100 x 100 en 38 secondes, mais par rapport à cette référence j'ai trouvé, vraiment ma mise en œuvre des performances téter. Je ne sais pas si c'est une chose super optimisé ou si vraiment vous pouvez facilement inverser une matrice de 200 x 200 en environ 0,11 secondes, donc je suis à la recherche pour plus de repères pour comparer les résultats. Avez-vous quelque chose de bon dieu lien?

UPDATE J'ai repéré un bug dans mon code de multiplication, qui n'a pas affecté le résultat, mais causais déchets de cycle inutile. Maintenant, mon inversion exécute en 20 secondes. Il y a encore beaucoup de temps, et toute idée est la bienvenue.

Merci gens

Était-ce utile?

La solution

Ce type d'opération est extrêmement sensible cache. Vous voulez faire la plupart de votre travail sur les variables qui sont dans votre cache L1 et L2. Consultez la section 6 du présent document:

http://people.redhat.com/drepper/cpumemory.pdf

Il vous guide à travers l'optimisation d'une multiplication de la matrice d'une manière de cache optimisé et obtient de grandes améliorations de perf.

Autres conseils

Vérifiez si vous passez d'énormes objets de la matrice par la valeur (Comme cela pourrait être coûteuse si la copie toute la matrice).
Si passe possable par référence.

La chose au sujet matricies et C ++ est que vous voulez éviter de copier autant que possable.
Donc, votre objet principal ne devrait probablement pas conatain les « données de la matrice », mais plutôt contenir des méta-données de la matrice et un pointeur (enveloppé dans par somthing à puce) à la partie de données. Ainsi, lors de la copie d'un objet que vous copiez seulement une petite partie de données non la chose entière (voir la mise en œuvre de chaîne pour un exemple).

Pourquoi avez-vous besoin d'implémenter votre propre bibliothèque de matrice en premier lieu? Comme vous l'avez déjà découvert, il existe déjà des bibliothèques extrêmement efficaces disponibles font la même chose. Et autant que les gens aiment penser C ++ comme langage de performance, c'est vrai que si vous êtes vraiment bon à la langue. Il est extrêmement facile d'écrire du code terriblement lent en C ++.

  

Je ne sais pas si c'est un super-optimisé   quelque chose ou si vraiment vous pouvez facilement   inverser une matrice de 200 x 200 à environ   0,11 secondes

Matlab fait que, sans casser une sueur soit. Etes-vous implémentez LAPACK routines pour l'inversion de la matrice (par exemple LU décomposition)?

Avez-vous essayé de profilage il?

Suite à cette (pdf), le calcul pour une matrice 100x100 avec décomposition LU aura besoin 1348250 (opérations en virgule flottante). Un noyau 2 peut faire environ 20 Gflops ( ) . Donc, théoriquement parlant, vous pouvez faire une inversion dans 1 ms.

Sans le code est assez difficile d'affirmer ce qui est la cause du grand écart. D'après mon expérience en essayant de micro-optimisation comme déroulage de boucle, les valeurs de mise en cache, VOIR, filetage, etc, vous n'obtiendrez une Accélérez, qui, au mieux est seulement un facteur constant de vous courant (qui peut-être assez pour vous).

Mais si vous voulez un ordre de grandeur de la vitesse augmente, vous devriez jeter un oeil à votre algorithme, peut-être votre implémentation de décomposition LU ont un bug. Un autre endroit pour jeter un oeil est l'organisation de vos données, essayez une organisation différente, mettre des éléments ligne / colonnes ensemble.

Les benchmarks Linpack sont basés sur la résolution de problèmes d'algèbre linéaire. Ils sont disponibles pour des machines différentes et langues . Peut-être qu'ils peuvent vous aider, aussi.

LINPACK bibliothèques C ++ disponibles aussi.

En fait, je gagné environ 7 secondes en utilisant ** double ** s au lieu de ** long double ** s, mais ce n'est pas beaucoup que j'ai perdu la moitié de ma précision.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top