8 votes

Boost::uBLAS vs Eigen

Je suis habitué à Eigen pour la quasi-totalité de mes travaux d'algèbre linéaire mathématique. Récemment, j'ai découvert que Boost fournit également une bibliothèque de classes modèles C++ qui fournit la bibliothèque d'algèbre linéaire de base ( Boost::uBLAS ). Cela m'a amené à me demander si je pouvais faire tout mon travail en me basant uniquement sur boost, car c'est déjà une bibliothèque majeure pour mon code.

En regardant de plus près les deux, je n'ai pas réussi à faire une distinction plus nette entre eux :

  • Boost::uBLAS :

uBLAS fournit des classes C++ modélisées pour les vecteurs denses, unitaires et épars, les matrices denses, identitaires, triangulaires, bandées, symétriques, hermitiennes et éparses. Les vues sur les vecteurs et les matrices peuvent être construites via des plages, des tranches, des classes d'adaptateurs et des tableaux indirects. La bibliothèque couvre les opérations de base habituelles de l'algèbre linéaire sur les vecteurs et les matrices : réductions comme les différentes normes, addition et soustraction de vecteurs et de matrices et multiplication avec un scalaire, produits internes et externes de vecteurs, produits matriciels de vecteurs et de matrices et solveur triangulaire.

...

  • Eigen :

Il prend en charge toutes les tailles de matrices, des petites matrices de taille fixe aux matrices denses de taille arbitraire, et même les matrices éparses.

Il prend en charge tous les types numériques standard, y compris std::complex, les entiers, et est facilement extensible aux types numériques personnalisés.

Il prend en charge diverses décompositions de matrices et fonctions géométriques.

Son écosystème de modules non pris en charge fournit de nombreuses fonctionnalités spécialisées telles que l'optimisation non linéaire, les fonctions matricielles, un solveur polynomial, une FFT, et bien plus encore.

...

Quelqu'un a-t-il une meilleure idée de leurs principales différences et sur quelle base pouvons-nous choisir entre eux ?

3voto

Je viens de faire une comparaison de la complexité en temps entre boost et eigen pour des calculs matriciels assez triviaux. Ces résultats, aussi limités soient-ils, semblent indiquer que boost est une bien meilleure alternative. J'avais un code FEM qui fait les parties de pré-traitement (mettre en place les matrices d'éléments et les assembler). Donc, naturellement, cela implique beaucoup d'allocations de mémoire.

enter image description here

J'ai écrit des morceaux de codes identiques avec Boost et Eigen sur C++ (gcc 5.4.0, ubuntu 16.04, Intel i3 Quad Core, 2.40GHz, RAM : 4Gb) et les ai exécutés séparément pour des tailles de nœuds (N) variables et le temps calculé en utilisant l'utilitaire linux cl-utility. En ce qui me concerne, j'ai décidé de poursuivre mon code en Boost.

2voto

kangshiyin Points 8571

Choisissez Eigen si vous vous souciez de la performance et du gain de performance introduit par les modèles d'expression, et choisissez uBlas si vous voulez seulement apprendre les modèles d'expression.

http://eigen.tuxfamily.org/index.php?title=Benchmark

2voto

migle Points 494

Je suis en train de réécrire un projet important de boost::uBLAS à Eigen. Il s'agit de code de production dans un environnement commercial. C'est moi qui ai choisi uBLAS en 2006 et qui recommande maintenant le passage à Eigen.

uBLAS entraîne une vectorisation réelle très faible de la part du compilateur. Je peux regarder la sortie de l'assemblage de gros fichiers sources, compilés sur l'architecture amd64, avec SSE, en utilisant le type float, et ne pas trouver une seule instruction ***ps (addps, mulps, subps, 4 way packed single-precision floating point instructions) et seulement des instructions ***ss (addss, ..., scalar single-precision).

Avec Eigen, la bibliothèque est écrite pour s'assurer que les instructions vectorielles aboutissent.

Eigen est très complet. Il a beaucoup de factorisations de matrices et de solveurs. Dans boost::uBLAS la factorisation LU est un ajout non documenté, un morceau de code contribué. Eigen a des ajouts pour la géométrie 3D, comme les rotations et les quaternions, pas uBLAS.

uBLAS est légèrement plus complet sur les opérations les plus basiques. Eigen manque de certaines choses, comme la projection (indexer une matrice en utilisant une autre matrice), alors qu'uBLAS la possède. Pour les fonctionnalités que les deux possèdent, Eigen est plus laconique, ce qui donne des expressions plus faciles à lire.

Alors, l'uBLAS est complètement périmé. Je ne peux pas comprendre comment quelqu'un le considère en 2016/2017. Lisez la FAQ :

Q : Dois-je utiliser uBLAS pour de nouveaux projets ? R : Au moment où nous écrivons ces lignes (09/2012), il y a beaucoup de bonnes bibliothèques matricielles disponibles, par exemple, MTL4, armadillo, eigen. uBLAS offre un ensemble stable et bien testé de classes de vecteurs et de matrices, les opérations typiques de l'algèbre linéaire et des solveurs pour les systèmes d'équations triangulaires. uBLAS offre des matrices denses, structurées et éparses - toutes utilisant des interfaces similaires. Et enfin, uBLAS offre de bonnes (mais pas exceptionnelles) performances. D'autre part, la dernière amélioration majeure d'uBLAS remonte à 2008 et aucun changement significatif n'a été apporté depuis 2009. Il convient donc de se poser quelques questions pour faciliter la prise de décision : Disponibilité ? uBLAS fait partie de boost et est donc disponible dans de nombreux environnements. Facilité d'utilisation ? uBLAS est facile à utiliser pour les choses simples, mais nécessite des connaissances décentes en C++ lorsque vous quittez le chemin. Performances ? Il existe des alternatives plus rapides. À la pointe de la technologie ? uBLAS a plus de 10 ans et a manqué toutes les nouveautés de C++11.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X