Je regardais les références de performance: http://eigen.tuxfamily.org/index.php?title=Benchmark
Je ne pouvais pas m'empêcher de remarquer que eigen semble surpasser systématiquement toutes les bibliothèques de fournisseurs spécialisés. La question est: comment est-ce possible? On pourrait supposer que mkl/goto utiliserait du code réglé spécifique au processeur, tandis que eigen est plutôt générique.
Notez ceci http://download.tuxfamily.org/eigen/btl-results-110323/aat.pdf , essentiellement un dgemm. Pour N = 1000 Eigen obtient environ 17Gf, MKL seulement 12Gf
Eigen a une évaluation paresseuse. De Comment Eigen se compare-t-il à BLAS/LAPACK? :
Pour les opérations impliquant des expressions complexes, Eigen est intrinsèquement plus rapide que n'importe quelle implémentation BLAS car il peut gérer et optimiser une opération entière à l'échelle mondiale - tandis que BLAS force le programmeur à diviser les opérations complexes en petites étapes qui correspondent à l'API à fonction fixe BLAS, ce qui entraîne une inefficacité. en raison de l'introduction de temporaires. Voir par exemple le résultat de référence d'une opération Y = a X + b Y qui implique deux appels aux routines BLAS niveau 1 tandis qu'Eigen génère automatiquement une seule boucle vectorisée .
Le deuxième graphique dans le benchmarks est Y = a*X + b*Y
, qu'Eigen a été spécialement conçu pour gérer. Il n'est pas étonnant qu'une bibliothèque gagne à un niveau de référence pour lequel elle a été créée. Vous remarquerez que les benchmarks plus génériques, comme la multiplication matrice-matrice, ne montrent aucun avantage pour Eigen.
Les repères sont conçus pour être mal interprétés .
Regardons le produit matrix * matrix. Le benchmark disponible sur ce page du site Web d'Eigen vous dit qu'Eigen (avec son propre BLAS) donne des timings similaires au MKL pour les grandes matrices (n = 1000). J'ai comparé Eigen 3.2.6 avec MKL 11.3 sur mon ordinateur (un ordinateur portable avec un core i7) et le MKL est 3 fois plus rapide que Eigen pour de telles matrices utilisant un thread, et 10 fois plus rapide que Eigen utilisant 4 threads. Cela ressemble à une conclusion complètement différente. Il y a deux raisons à cela. Eigen 3.2.6 (son BLAS interne) n'utilise pas AVX. De plus, il ne semble pas faire un bon usage du multithreading. Cette référence masque cela car ils utilisent un CPU qui ne prend pas en charge AVX sans multithreading.
Habituellement, ces bibliothèques C++ (Eigen, Armadillo, Blaze) apportent deux choses:
Habituellement, lorsque ces bibliothèques fournissent des références par rapport au MKL, elles utilisent généralement du matériel ancien et n'activent pas le multithreading pour pouvoir être à égalité avec le MKL. Ils pourraient également comparer les opérations BLAS niveau 1 telles que y = alpha x1 + beta x2 avec 2 appels à une fonction BLAS niveau 1, ce qui est de toute façon stupide.
En un mot , ces bibliothèques sont extrêmement pratiques pour leur surcharge de + et *, ce qui est extrêmement difficile à faire sans perte de performances. Ils font généralement du bon travail à ce sujet. Mais quand ils vous donnent un benchmark en disant qu'ils peuvent être à égalité ou battre le MKL avec leur propre BLAS, soyez prudent et faites votre propre benchmark. Vous obtiendrez généralement des résultats différents ;-).
Jetez un œil à ce fil sur la liste de diffusion Eigen commençant ici:
Il montre par exemple qu'ATLAS surpasse de 46% Eigen sur le produit matrice-matrice:
Plus de résultats de benchmarks et de détails sur la façon dont les benchmarks ont été réalisés peuvent être trouvés ici:
Processeur Intel (R) Core (TM) i5-3470 à 3,20 GHz:
http://www.mathematik.uni-ulm.de/~lehn/bench_FLENS/index.html
Éditer:
Pour ma conférence "Bases du logiciel pour le calcul haute performance", j'ai créé un petit framework appelé ulmBLAS. Il contient la suite de tests ATLAS et les étudiants pourraient implémenter leur propre produit matrice-matrice basé sur les articles BLIS . Vous pouvez consulter les repères finaux qui mesurent également les valeurs propres:
Vous pouvez utiliser le framework lmBLAS pour créer vos propres benchmarks.
Jetez également un œil à
Le code générique peut être rapide car Compile Time Function Evaluation (CTFE) permet de choisir la stratégie de blocage de registre optimale (petites sous-matrices temporaires stockées dans les registres CPU).
Mir GLAS et Intel MKL sont plus rapides que Eigen et OpenBLAS. Mir GLAS est plus générique que Eigen. Voir aussi benchmark et thread reddit .
Il ne semble pas surpasser systématiquement les autres bibliothèques, comme on peut le voir sur les graphiques plus bas sur la page que vous avez liée. Ainsi, les différentes bibliothèques sont optimisées pour différents cas d'utilisation et différentes bibliothèques sont plus rapides pour différents problèmes.
Cela n'est pas surprenant, car vous ne pouvez généralement pas optimiser parfaitement pour tous les cas d'utilisation. L'optimisation pour une opération spécifique limite généralement les options d'optimisation pour d'autres cas d'utilisation.
J'ai envoyé la même question à la liste de diffusion ATLAS il y a quelque temps:
http://sourceforge.net/mailarchive/message.php?msg_id=28711667
Clint (le développeur ATLAS) ne fait pas confiance à ces références. Il a suggéré une procédure de référence fiable. Dès que j'aurai du temps libre, je ferai ce genre de benchmarking.
Si la fonctionnalité BLAS d'Eigen est en fait plus rapide que celle de GotoBLAS/GotoBLAS, ATLAS, MKL, ils devraient de toute façon fournir une interface BLAS standard. Cela permettrait de relier LAPACK à un tel Eigen-BLAS. Dans ce cas, ce serait également une option intéressante pour Matlab et ses amis.