| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Produit Matriciel les différents types de produits On considère l'implémentation suivante :
On distingue plusieurs types de méthodes réalisant le produit de 2 matrices :
Voici quelques résultats obtenus sur :
résultats Core 2 Duo E6420
Dans les graphiques suivants, les méthodes correspondent à :
Résultat sur des int Résultat sur des float Résultat sur des double (1) On peut noter, pour le produit basic, un décrochage (temps de calcul plus long) pour certaines dimensions de matrices :
(2) L'inversion de boucle (jk) a tendance a diviser le temps de calcul par 2 sur les int et par un facteur 4 à 5 sur les float et double. (3) le calcul par bloc (loop blocking) donne de bons résultats. (4) la librairie BLAS et les fonctions associées sgemm et dgemm donnent les meilleurs résultats. résultats Core 2 Quad Q6600
Résultat sur des int Résultat sur des float Résultat sur des double résultats Core 2 Duo E8300
Résultat sur des int Résultat sur des float Résultat sur des double résultats Core 2 Duo E6750
Résultat sur des int Résultat sur des float Résultat sur des double résultats AMD Athlon 64 X2 4200
Résultat sur des int Résultat sur des float Résultat sur des double résultats Intel Core i7 2600k - 3.4 Ghz
Résultat sur des int Résultat sur des float Résultat sur des double Etude des dimensions problèmatiques Matrice 1023 vs 1024
VTune Sampling Activity reporte les valeurs suivantes : méthode "basic" - integer - 1023 méthode "basic" - integer - 1024
On voit que le problème provient du cache L2 (MEM_LOAD_RETIRED.L2_MISS events) :
Matrix 2047 vs 2048
VTune Sampling Activity reporte les valeurs suivantes : méthode "basic" - integer - 2047 méthode "basic" - integer - 2048
On voit que le problème provient du cache L2 (MEM_LOAD_RETIRED.L2_MISS events) :
Comment expliquer ce problème et comment y remédier
explication Le manque de performance de l'algorithme basic provient d'un nombre important de défauts de cache (cache misses). L'accès à la mémoire n'est pas réalisé de manière "intelligente" et celle-ci n'est donc pas utilisée à bon escient. Il nous faut donc augmenter la réutilisabilité des données du cache. Si l'on examine le code on s'aperçoit que A est accédée par ligne (row-major order) alors que B est accédée par colonnes (column-major order).
L'accès à la matrice B génère donc de nombreux défauts de cache. remède (remedy) Une technique simple appelée loop blocking consiste à décomposer le problème initial en sous-problèmes de plus petite taille. Dans le cas présent on peut décomposer la matrice en sous-matrices de taille 32 × 32. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
© 2006-2024 Jean-Michel Richer |