web-dev-qa-db-fra.com

Comment la bibliothèque C ++ Eigen peut-elle mieux fonctionner que les bibliothèques de fournisseurs spécialisés?

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

37
Anycorn

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.

28
chrisaycock

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:

  • Surcharge d'opérateur agréable : Vous pouvez utiliser +, * avec des vecteurs et des matrices. Afin d'obtenir de bonnes performances, ils doivent utiliser des techniques délicates appelées "expression de modèle intelligent" afin d'éviter les temporaires lorsqu'ils réduisent le timing (tels que y = alpha x1 + beta x2 avec les vecteurs y, x1, x2) et introduire les quand ils sont utiles (comme A = B * C avec les matrices A, B, C). Ils peuvent également réorganiser les opérations pour moins de calculs, par exemple, si A, B, C sont des matrices A * B * C peut être calculé comme (A * B) * C ou A * (B * C) selon leurs tailles.
  • BLAS interne : Pour calculer le produit de 2 matrices, ils peuvent soit s'appuyer sur leur BLAS interne ou sur une source externe (MKL, OpenBLAS, ATLAS). Sur les puces Intel à grandes matrices, le MKL est presque impossible à battre. Pour les petites matrices, on peut battre le MKL car il n'a pas été conçu pour ce genre de problèmes.

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 ;-).

27
InsideLoop

À propos de la comparaison ATLAS vs Eigen

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:

É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 à

11
Michael Lehn

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 .

2
Ilya Yaroshenko

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.

2
sth

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.

2
Michael Lehn